<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="https://purl.org/dc/elements/1.1/"
     xmlns:dcterms="http://purl.org/dc/terms/"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:cf="https://www.futureplc.com/rss/content-flags"
>
    <channel>
                    <atom:link href="https://www.tomsguide.com/feeds/tag/tech" rel="self" type="application/rss+xml" />
                            <title><![CDATA[ Latest from Tom's Guide in Tech ]]></title>
                <link>https://www.tomsguide.com/tech</link>
        <description><![CDATA[ All the latest tech content from the Tom's Guide team ]]></description>
                                    <lastBuildDate>Sat, 11 Jul 2026 11:15:00 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ The best tech of 2026 (so far): 26 products we've actually tested, rated and loved ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/the-best-tech-of-2026-so-far-26-products-weve-actually-tested-rated-and-loved</link>
                                                                            <description>
                            <![CDATA[ Here are our favorite products from 2026 after 6 months of non-stop testing. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">fxer8wYcfWtdzTtoWLRU8V</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/FmXxAvFaaLWwRyAoZLwEyf-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 11 Jul 2026 11:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                        <dc:contributor><![CDATA[ Nikita Achanta ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Paul Antill ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Jason England ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Ruth Jones ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Nicola Appleton ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ John Velasco ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Kate Kozuch ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Erin Bashford ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Ashley Thieme ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Mike Prospero ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Rory Mellon ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Jane McGuire ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Camilla Sharman ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Cynthia Lawrence ]]></dc:contributor>
                                                                    <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/FmXxAvFaaLWwRyAoZLwEyf-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A split image showing an iPhone 17, Fitbit Air and Apple AirPods Max 2]]></media:description>                                                            <media:text><![CDATA[A split image showing an iPhone 17, Fitbit Air and Apple AirPods Max 2]]></media:text>
                                <media:title type="plain"><![CDATA[A split image showing an iPhone 17, Fitbit Air and Apple AirPods Max 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/FmXxAvFaaLWwRyAoZLwEyf-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We're now into July, which means we've done six full months of testing here at Tom's Guide in 2026. From <a href="https://www.tomsguide.com/home/coffee-makers/best-coffee-makers">coffee machines</a>, through to vacuums, gaming handhelds, laptops and <a href="https://www.tomsguide.com/best-picks/best-phones">phones</a> — not only is it our job to put tech through its paces, it's what our journalists, editors and contributors love to do. </p><p>I'm Pete, Senior Reviews Editor here at Tom's Guide, and I head up our reviews coverage on site. My team of dedicated reviews writers alone have lab tested and reviewed hundreds of products already this year, with the wider Tom's Guide editorial team having testing dozens more. If you've not had your finger precisely on the pulse of the latest tech this year, well, I don't blame you — it's hard to keep tabs on everything. That's why we exist.</p><p>To help, I've gathered the Tom's Guide team's favorite products from 2026 so far. Obviously, I can't fit everything into a single article, so I asked our subject experts across the site to give me their top picks, too. I've also curated the top five highest scorers, which stand above the rest. Every product on here has been tested by us, hands-on, as part of a full, extensive review.</p><p>Read on to see the tech Tom's Guide loved in the first half of 2026.</p><h3 class="article-body__section" id="section-tom-s-guide-s-top-5"><span>Tom's Guide's Top 5</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QtcQdgVxistWUAqm4jKVz9" name="Samsung-S95H--2" alt="Samsung S95H OLED TV on a desk" src="https://cdn.mos.cms.futurecdn.net/QtcQdgVxistWUAqm4jKVz9.jpg" mos="" align="middle" fullscreen="" width="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>Every product on this list has scored at least four stars, earning our TG Recommended or Editor's Choice badges. But there are five products on this list that scored our full five stars after testing. These are the best of the best so far this year. To save you some time, here are the links to our reviews.</p><ul><li><strong></strong><a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4-review"><strong>DJI Osmo Pocket 4 review </strong></a>★★★★★</li><li><strong></strong><a href="https://www.tomsguide.com/gaming/007-first-light-review"><strong>007 First Light review </strong></a>★★★★★</li><li><strong></strong><a href="https://www.tomsguide.com/home/kitchenaid-artisan-plus-mixer-review"><strong>KitchenAid Artisan Plus review </strong></a>★★★★★</li><li><strong></strong><a href="https://www.tomsguide.com/home/kitchen-dining/gozney-dome-xl-2-review"><strong>Gozney Dome XL Gen 2 review </strong></a>★★★★★</li><li><strong></strong><a href="https://www.tomsguide.com/tvs/oled-tvs/samsung-s95h-oled-tv-review"><strong>Samsung S95H OLED review </strong></a>★★★★★</li></ul><p>Keep reading to see the rest of our top tested picks for 2026.</p><h2 class="article-body__section" id="section-ai"><span>AI</span></h2><h2 id="rokid-glasses"><a href="https://www.tomsguide.com/computing/smart-glasses/rokid-glasses-review">Rokid Glasses</a></h2><p><strong>After 5,000 miles in the Rokids, we were seriously impressed</strong><br><em>Score: </em>★★★★☆</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Wnk4WGatZwDH9NWg5qLJd4" name="Rokid Glasses" alt="Rokid Glasses" src="https://cdn.mos.cms.futurecdn.net/Wnk4WGatZwDH9NWg5qLJd4.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">best smart glasses</a> without a display are cool and all, but their features are usually rather limited to just asking questions about what you see. The Rokid Glasses proved to me that adding a screen turns that superpower into an ambient computing platform — offering features only when you need them and disappearing into the background in some stylish specs. </p><p>With that display, you get real-time conversation translation with text subtitles so you’re not having to try to listen to your smart glasses talk over the person in front of you. And the multi-modality unlocked by asking a question and just getting answers you can see makes them much more subtle. Not to say they’re perfect — the camera quality for snapping pictures suffers in low light and some features are <em>very </em>China-specific (like Alipay). But arm these with Google Gemini in setup, and they’re a genuinely helpful companion on your face for a decent price.</p><p><em><strong>Jason England, Managing Editor, Core Tech</strong></em><br>Read Jason's full <a href="https://www.tomsguide.com/computing/smart-glasses/rokid-glasses-review">Rokid Glasses review</a></p><h2 class="article-body__section" id="section-cameras-drones"><span>Cameras & drones</span></h2><h2 id="gopro-mission-1-pro"><a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/gopro-mission-1-pro-review">GoPro Mission 1 Pro</a></h2><p><strong>GoPro's return to form in the action camera game</strong><br><em>Score: </em>★★★★<strong>½</strong></p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="high" data-lazy-src="https://www.youtube-nocookie.com/embed/E2hIrAWkTQo" allowfullscreen></iframe></div></div><p>After years essentially re-releasing the same Hero cameras with minor tweaks, GoPro has finally pushed itself. The Mission 1 Pro is pricey, but it’s the first GoPro I’ve been excited about in a while. It seriously impressed me with its powerful and versatile video credentials in testing, namely open gate 8K and a wealth of shooting features that make it ideal for its target market: professionals. Thanks to revised processor architecture and a shiny new battery, I managed to extract unparalleled battery life and thermals versus other <a href="https://www.tomsguide.com/us/best-action-cameras,review-3046.html">action cameras</a> in my standardized battery tests. GoPro is back!</p><p><em><strong>Pete Wolinski, Senior Reviews & Cameras Editor</strong></em><br>Read Pete’s full <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/gopro-mission-1-pro-review"><u>GoPro Mission 1 Pro review</u></a></p><h2 id="dji-osmo-pocket-4"><a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4-review">DJI Osmo Pocket 4</a></h2><p><strong>The best all-around tool for content creation</strong><br><em>Score: </em>★★★★★</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wBTZhStFd1o" allowfullscreen></iframe></div></div><p>I awarded the DJI Osmo Pocket 4 our full five stars in my review, and that’s because I literally couldn’t find anything wrong with it. Aside from the fact that it’s not available in America (yet?) due to tariffs and DJI’s ongoing feud with the U.S. government. The Osmo Pocket 4 improved on its predecessor in every single way that mattered: video, stabilization, storage, thermals, battery life, and more. If you’re after a single tool for professional-looking content creation, I really can’t think of anything better to recommend.</p><p><em><strong>Pete Wolinski, Senior Reviews & Cameras Editor</strong></em><br>Read Pete’s full <a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4-review"><u>DJI Osmo Pocket 4 review</u></a></p><h2 id="dji-avata-360"><a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-review">DJI Avata 360</a></h2><p><strong>Although a little late to the 360 party, DJI absolutely smashed it</strong><br><em>Score: </em>★★★★<strong>½</strong></p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/YvK5opkgEow" allowfullscreen></iframe></div></div><p>The DJI Avata 360 does exactly what you want a drone to do: make flying fun. It stakes its claim as the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best 360° drone</a> around (granted, there are only two at the time of writing, but still!) and its twin lenses capture every single angle in 8K at 60fps. 120MP hi-res stills, user-friendly editing software, and exceptional build quality make it <em>the </em>drone to buy today. It also undercuts its main competitor, the Antigravity A1, and with dual ways to fly (FPV and with a standard controller), the Avata 360 is versatile and oh-so-powerful. Every day I still think about it — and as someone who’s tested many, many quadcopters, that’s saying a lot.</p><p><em><strong>Nikita Achanta, Senior Reviews Writer</strong></em><br>Read Nikita’s full <a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-review"><u>DJI Avata 360 review</u></a></p><h2 class="article-body__section" id="section-computing-gaming"><span>Computing & gaming</span></h2><h2 id="macbook-neo"><a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a></h2><p><strong>Our favorite budget laptop, literally ever</strong><br><em>Score: </em>★★★★<strong>½</strong></p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ISmvUpSEG-w" allowfullscreen></iframe></div></div><p>Value for money in laptops has become a bit of a running joke this year (thanks, RAMageddon). But of all the companies building notebooks, I didn’t anticipate it would be Apple to deliver the goods and give you an honest-to-god well-priced system. Yes, there’s been a $100 increase recently, but even with that, the premium aluminum build quality, great display, tactile keyboard and zippy performance of that A18 Pro makes for a great system for the day-to-day essentials. </p><p>I must admit, to see Apple actually having fun with colors in its <a href="https://www.tomsguide.com/best-picks/best-macbook">MacBooks</a> is a refreshing change from the blacks and silvers of its more expensive lineage. All of this comes together into a laptop that has terrified the budget Windows laptop market, and the best ultra portable we’ve tested this year.</p><p><em><strong>Jason England, Managing Editor, Core Tech</strong></em><br>Read our full <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo review</a></p><h2 id="asus-zenbook-duo-2026"><a href="https://www.tomsguide.com/computing/laptops/asus-zenbook-duo-2026-review">Asus Zenbook Duo (2026)</a></h2><p><strong>Dual OLED panels = chef's kiss</strong><br><em>Score: </em>★★★★<strong>½</strong></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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pzT2YvbKokZUz7jyHGLE59" name="Asus Zenbook Duo (2026)" alt="Asus Zenbook Duo (2026)" src="https://cdn.mos.cms.futurecdn.net/pzT2YvbKokZUz7jyHGLE59.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Yes, this is a dual-screen OLED beauty of a premium laptop; Asus has really paid attention to the design and ergonomics of a system like this. But the real superpower is what lies inside that shell. Intel Core Ultra Series 3 (codenamed Panther Lake) has been a truly generational moment for Team Blue in its <a href="https://www.tomsguide.com/computing/laptops/best-windows-laptops">Windows laptops</a>, and it comes down to huge updates to both the performance and power efficiency. </p><p>Those new CPU cores and efficiency architecture they’re built onto gives this a gargantuan battery life that would make a MacBook blush, while the superpowered GPU (alongside XeSS 3) gives this some serious gaming laptop chops too. Usually, you had to be considerate of just <em>what </em>you wanted to do with your Windows laptop and decide on the strengths and compromises around that. With anything that sports an X9 chip like this, though, that’s no longer a compromise you have to make.</p><p><em><strong>Jason England, Managing Editor, Core Tech</strong></em><br>Read Jason's full <a href="https://www.tomsguide.com/computing/laptops/asus-zenbook-duo-2026-review">Asus Zenbook Duo (2026) review</a></p><h2 id="msi-claw-8-ex-ai"><a href="https://www.tomsguide.com/gaming/handheld-gaming/msi-claw-8-ex-ai-plus-review">MSI Claw 8 EX AI+</a></h2><p><strong>A true next-gen gaming handheld</strong><br><em>Score: </em>★★★★☆</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vUZrRde9zCurFLDzUsKCZe" name="MSI Claw 8 EX AI+" alt="MSI Claw 8 EX AI+" src="https://cdn.mos.cms.futurecdn.net/vUZrRde9zCurFLDzUsKCZe.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The MSI Claw 8 EX AI+ delivers the performance jump I’ve been waiting years for. With Intel’s new Arc G3 Extreme chip, games are pulling a 20 to 30+ FPS advantage over AMD Z2 Extreme handhelds. Battery life gets a big boost too. I could hit the same performance as the Z2 Extreme at half the power consumption. Combine that with its major redesign bringing more Xbox-like controls, better haptics, and its large 8-inch 16:10 display, and you’re getting, in my opinion, one of the <a href="https://www.tomsguide.com/round-up/best-handheld-gaming-consoles">best handheld gaming consoles</a> of 2026.</p><p><em><strong>Paul Antill, Video Producer</strong></em><br>Read our full <a href="https://www.tomsguide.com/gaming/handheld-gaming/msi-claw-8-ex-ai-plus-review">MSI Claw 8 EX AI+ review</a></p><h2 id="007-first-light"><a href="https://www.tomsguide.com/gaming/007-first-light-review">007 First Light</a></h2><p><strong>Forget GoldenEye: this is the best Bond game ever</strong><br><em>Score: </em>★★★★★</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bSj9Dci8XztAKmNPsWEXob" name="007-first-light-screenshot-ps5-pro-08.JPG" alt="007 First Light screenshot taken on PS5 Pro" src="https://cdn.mos.cms.futurecdn.net/bSj9Dci8XztAKmNPsWEXob.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: IO Interactive)</span></figcaption></figure><p>Gamers are being treated to a licensed games renaissance right now. The days of cheap cash-ins launched to coincide with a new blockbuster movie are over. But even in this golden era for video games based on popular media franchises, 007 First Light surpasses expectations. </p><p>Forget GoldenEye, First Light is the best James Bond game ever. With its ludicrously cinematic gameplay, compelling narrative that focuses on a younger Bond (played by Patrick Gibson), and deep commitment to authenticity, 007 First Light is easily the best thing to come out of this long-running spy series in 20 years, movies included. There’s a reason it was only the second video game I’ve given the full five stars. Whether you’re a longtime Bond fan or a newcomer, 007 First Light is quite simply unmissable.</p><p><em><strong>Rory Mellon, Senior Entertainment Editor</strong></em><br>Read Rory's full <a href="https://www.tomsguide.com/gaming/007-first-light-review">007 First Light review</a></p><h2 id="epomaker-glyph"><a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-review">Epomaker Glyph</a></h2><p><strong>Nikita's dream keyboard</strong><br><em>Score: </em>★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sjAcau9VseSqLieN8EcHke" name="Epomaker_Glyph" alt="An Epomaker Glyph mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/sjAcau9VseSqLieN8EcHke.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’ve tested close to 100 <a href="https://www.tomsguide.com/best-picks/best-mechanical-keyboards">keyboards</a> in my time as a reviews writer, and it isn’t often that I get to proclaim, “I’ve found my dream keyboard.” Ever since I tested the Epomaker Glyph, it hasn’t left my desk, and it’s my daily driver when I’m at the office. Typewriter-like aesthetics, a return lever that acts as an Enter or Backspace key, beautiful RGB lighting, a creamy sound profile, and a typing experience that’s nothing short of stunning — all of these characteristics come together to deliver what’s probably the best mechanical keyboard I’ve used for typing. I’m a speed demon when I’m bashing out 109 words per minute of this thing.</p><p><em><strong>Nikita Achanta, Senior Reviews Writer</strong></em><br>Read Nikita’s full <a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-review"><u>Epomaker Glyph review</u></a></p><p><em>(A note from Nikita's editor, Pete: "I can confirm, the Glyph genuinely hasn't left her desk!")</em></p><h2 id="msi-mpg-341cqr-qd-oled-x36"><a href="https://www.tomsguide.com/computing/monitors/msi-mpg-341cqr-qd-oled-x36-review">MSI MPG 341CQR QD-OLED X36</a></h2><p><strong>Pro performance for under $1,000</strong><br><em>Score: </em>★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LDAziKPYjRjFoYgmVRcLK8" name="MSI X36_" alt="An MSI MPG 341CQR QD-OLED X36 gaming monitor in black" src="https://cdn.mos.cms.futurecdn.net/LDAziKPYjRjFoYgmVRcLK8.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>It’s no secret that MSI knows how to make a great <a href="https://www.tomsguide.com/us/best-gaming-monitors,review-3114.html">gaming monitor</a>, and its MPG 341CQR QD-OLED X36 is one of the most beautiful displays I’ve ever tested. Blistering 360Hz refresh rate and 0.03ms response time for buttery smooth gameplay? Check. Ridiculously accurate colors and wide color coverage? Yep. AI sleep and wake features that are <em>actually </em>useful and not just a gimmick? Oh yeah. And all of this is packed into a sleek design with plenty of ports. Not much to complain about here, really.</p><p><em><strong>Nikita Achanta, Senior Reviews Writer</strong></em><br>Read Nikita’s full <a href="https://www.tomsguide.com/computing/monitors/msi-mpg-341cqr-qd-oled-x36-review"><u>MSI MPG 341CQR QD-OLED X36 review</u></a></p><h2 id="viture-beast-ar-glasses"><a href="https://www.tomsguide.com/computing/smart-glasses/viture-beast-review">Viture Beast AR glasses</a></h2><p><strong>Beast by name, beast by nature</strong><br><em>Score: </em>★★★★<strong>½</strong></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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iTY7CiVLGP9u3qN25ZR2EW" name="Viture Beast" alt="Viture Beast" src="https://cdn.mos.cms.futurecdn.net/iTY7CiVLGP9u3qN25ZR2EW.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ve traveled the world testing all of this year’s biggest AR glasses releases, and Viture Beast stands head and shoulders above the pack as the best I’ve used this year (so far). There’s three reasons why: picture quality, comfort and features. Viture’s color science and fidelity really shines in those micro-OLED displays with a massive 58-degree field of view. There’s a little edge fringing on the sides, but given the massive vision field, it’s unlikely you’ll notice it. And this is packed into a nice-feeling pair of glasses with a soft-touch coating that sits gently on your ears with optimal weight balance. Cap it all off with plenty of customization built in, plus the SpaceWalker app for multi-monitor home office setups, and the Beast are…well…pretty beastly for work and play.</p><p><em><strong>Jason England, Managing Editor, Core Tech</strong></em><br>Read Jason's full <a href="https://www.tomsguide.com/computing/smart-glasses/viture-beast-review">Viture Beast review</a></p><h2 class="article-body__section" id="section-fitness"><span>Fitness</span></h2><h2 id="fitbit-air"><a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a></h2><p><strong>The best Whoop alternative, and subscription-free</strong><br><em>Score: </em>★★★★<strong>☆</strong></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:4923px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="v4R3RdVkt2tearzZXDp52N" name="FitbitAir-rev-07" alt="Close-up of the Fitbit Air on a person's wrist" src="https://cdn.mos.cms.futurecdn.net/v4R3RdVkt2tearzZXDp52N.jpg" mos="" align="middle" fullscreen="" width="4923" height="2769" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Fitbit Air is my fitness tracker of the year so far. Discreet and distraction-free (no screen), this is a fitness tracker that's easy to use, lightweight, and oh-so-comfortable. Just $99 and subscription-free for core features, it offers a week of battery life and covers all the holistic metrics you'd expect from a modern device, like heart health, sleep quality, daily movement, and workouts. For most people, this is the best screen-free fitness tracker you can buy, and the new Google Health companion app makes viewing all your health data a dream.</p><p><em><strong>Jane McGuire, Managing Editor, Fitness</strong></em><br>Read our full <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air review</a></p><h2 id="salomon-xt-6"><a href="https://www.tomsguide.com/wellness/fitness/salomon-xt-6-review">Salomon XT-6</a></h2><p><strong>Hike, shop or relax in comfort and style</strong><br><em>Score: </em>★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pz558gVFyYaZd7udisT2c9" name="Salomon XT-6" alt="woman wearing Salomon XT-6 sneakers walking up a steep city hill" src="https://cdn.mos.cms.futurecdn.net/pz558gVFyYaZd7udisT2c9.jpg" mos="" align="middle" fullscreen="" width="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 / Ashley Thieme)</span></figcaption></figure><p>The Salomon XT-6 shoes have become a staple in my closet. Whether I’m heading to the store or hitting up a challenging trail on the weekend, I know I’ll be supported. I wore these <a href="https://www.tomsguide.com/best-picks/best-hiking-boots">hiking sneakers</a> on a city break, where I clocked over 93,000 steps and didn’t have a single complaint. Not only that, the multidirectional lugs kept me stable on even the trickiest terrain, as I hiked in mud, over rocks, and through water. </p><p>On top of their technical ability, the XT-6s are a fashion statement, worn all over New York by fashion-forward celebs; these shoes have earned a coveted spot in my daily rotation — although you’ll find me cleaning the mud off them after each adventure.</p><p><em><strong>Ashley Thieme, Staff Writer</strong></em><br>Read Ashley’s full <a href="https://www.tomsguide.com/wellness/fitness/salomon-xt-6-review"><u>Salomon XT-6 review</u></a></p><h2 class="article-body__section" id="section-homes"><span>Homes</span></h2><h2 id="dyson-v16-piston-animal-cordless"><a href="https://www.tomsguide.com/home/home-appliances/the-dyson-v16-piston-animal-is-a-great-multi-tasker-and-handles-messes-well-but-is-it-worth-the-premium-price">Dyson V16 Piston Animal Cordless</a></h2><p><strong>A powerful cordless Dyson that's perfect for pet owners</strong><br><em>Score: </em>★★★★☆</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Bdv3dPcZbVhQWhaBEKzSYR" name="Dyson V16 Piston-1-LIST" alt="Dyson V16 Piston Animal" src="https://cdn.mos.cms.futurecdn.net/Bdv3dPcZbVhQWhaBEKzSYR.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ve tested my fair share of Dyson <a href="https://www.tomsguide.com/best-picks/best-vacuum-cleaners">vacuum cleaners</a> in my time, but I must say that the V16 combines all of my favorite features in one cleaner. First, its upgraded ‘Fluffy Cones’ head is designed to be used on both carpets and hard flooring without the need to swap over attachments. This is a great time-saver, and lets me quickly zip around my home without pausing. Perhaps my favorite feature is the dust-detecting green light which reveals those hidden dustballs lurking underneath furniture and in corners. Plus, it’s lightweight and easy to store, which is why it’s now my go-to  for daily maintenance, and why I awarded our Editor’s Choice badge.</p><p><em><strong>Cynthia Lawrence, Homes Editor</strong></em><br>Read Cynthia’s full <a href="https://www.tomsguide.com/home/home-appliances/the-dyson-v16-piston-animal-is-a-great-multi-tasker-and-handles-messes-well-but-is-it-worth-the-premium-price"><u>Dyson V16 Piston Animal Cordless review</u></a></p><h2 id="kitchenaid-artisan-plus"><a href="https://www.tomsguide.com/home/kitchenaid-artisan-plus-mixer-review">KitchenAid Artisan Plus</a></h2><p><strong>The latest version of KitchenAid's legendary mixer, and the best one yet</strong><br><em>Score: </em>★★★★★</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Xa7WjwjzSsdVPrfWLzzEDA" name="KitchenAid Artisan Plus stand mixer review" alt="KitchenAid Artisan Plus stand mixer review" src="https://cdn.mos.cms.futurecdn.net/Xa7WjwjzSsdVPrfWLzzEDA.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Camilla Sharman)</span></figcaption></figure><p>I got to test KitchenAid’s newest <a href="https://www.tomsguide.com/best-picks/best-stand-mixers">stand mixer</a>, the Artisan Plus, and it’s even better than I imagined. I’d been happily using KitchenAid’s Artisan stand mixer as my go-to appliance for a good few years, and I really didn’t see how it could be improved, but it has. It may only seem like a few tweaks, but they have made a big difference. From the sliding speed control that just glides, to the in-bowl light, which illuminates the mix — and let's not forget the double-edge flex beater that cleans the bowl as it sweeps past— I loved it so much during testing that I gave it a 5-star rating.</p><p><em><strong>Camilla Sharman, Staff Writer</strong></em><br>Read Camilla’s full <a href="https://www.tomsguide.com/home/kitchenaid-artisan-plus-mixer-review"><u>KitchenAid Artisan Plus review</u></a></p><h2 id="gozney-dome-xl-gen-2"><a href="https://www.tomsguide.com/home/kitchen-dining/gozney-dome-xl-2-review">Gozney Dome XL (Gen 2)</a></h2><p><strong>The undisputed king of pizza ovens</strong><br><em>Score: </em>★★★★★</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3916px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="Ain7J5FfthYiMBYmVw63sY" name="Gozney Dome 2 pizza oven-16" alt="Gozney Dome XL gen 2" src="https://cdn.mos.cms.futurecdn.net/Ain7J5FfthYiMBYmVw63sY.jpg" mos="" align="middle" fullscreen="" width="3916" height="2203" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you’re a dedicated — and I mean dedicated — at-home pizza maker, the Gozney Dome XL (Gen 2) is the closest you’ll come to actually building a <a href="https://www.tomsguide.com/best-picks/best-outdoor-pizza-ovens">pizza oven</a> from scratch. It can run on either gas, wood, or charcoal, has dual temperature probes, and is big enough to fit a 16-inch pie with room to spare. I loved its easy-to-ready displays, and the design of the oven is just gorgeous, too. Yes, it’s huge and it’s expensive (I’ve made equally good pizzas in much cheaper ovens), but this is the oven that’ll signal you’re the real pizzaiolo in your neighborhood. </p><p><em><strong>Mike Prospero, U.S. Editor-in-chief</strong></em><br>Read Mike’s full <a href="https://www.tomsguide.com/home/kitchen-dining/gozney-dome-xl-2-review"><u>Gozney Dome XL (Gen 2) review</u></a></p><h2 id="fellow-espresso-series-1"><a href="https://www.tomsguide.com/home/coffee-makers/fellow-espresso-series-1-review">Fellow Espresso Series 1</a></h2><p><strong>Beginners or pros, coffee snobs or otherwise — this one is for everyone</strong><br><em>Score: </em>★★★★<strong>½</strong></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:1980px;"><p class="vanilla-image-block" style="padding-top:56.21%;"><img id="kxPQL4RdbUAPhcdc3CdYdP" name="" alt="Coffee tech from the London Coffee Festival" src="https://cdn.mos.cms.futurecdn.net/kxPQL4RdbUAPhcdc3CdYdP.jpg" mos="" align="middle" fullscreen="" width="1980" height="1113" 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>When Fellow designed the Espresso Series 1, it looked at the other <a href="https://www.tomsguide.com/home/coffee-makers/best-espresso-machines">espresso machines</a> out there and thought, “I’m going to do something different.” And <em>different</em> the Espresso Series 1 is. When I tested this machine, I loved that it provided coffee-snob-approved features while still being usable for complete beginners. On top of having a litany of customization options on the machine itself, I loved having the app, which walked me through how to make every type of coffee ever invented. You may think this is too ambitious, but for me, the Espresso Series 1 hits all its marks and comes out victorious. </p><p><em><strong>Erin Bashford, Senior Reviews Writer</strong></em><br>Read Erin’s full <a href="https://www.tomsguide.com/home/coffee-makers/fellow-espresso-series-1-review"><u>Fellow Espresso Series 1 review</u></a></p><h2 class="article-body__section" id="section-phones"><span>Phones</span></h2><h2 id="apple-iphone-17"><a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-review">Apple iPhone 17</a></h2><p><strong>A surprisingly solid update over the previous generation</strong><br><em>Score: </em>★★★★<strong>½</strong></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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fXQyeewX6f4cMRqqSucB2D" name="iphone17-1 (2)-2" alt="Sage iPhone 17 in hand" src="https://cdn.mos.cms.futurecdn.net/fXQyeewX6f4cMRqqSucB2D.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Apple launched more new <a href="https://www.tomsguide.com/best-picks/best-phones">phones</a> than in any previous year, but the iPhone 17 remains my favorite for several reasons. One thing that makes it stand out is that it finally got a long-overdue upgrade to a 120Hz refresh rate, making its screen look even more fluid than before in testing. On top of that, I really love how it didn’t get a price hike and still managed to get double the starting storage.</p><p><em><strong>John Velasco, Senior Phones Editor</strong></em><br>Read John's full <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-review">iPhone 17 review</a></p><h2 id="samsung-galaxy-s26-ultra"><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Samsung Galaxy S26 Ultra</a></h2><p><strong>The phone that'll get better over time</strong><br><em>Score: </em>★★★★<strong>½</strong></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:3718px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="XqcuYqJmZMz9675qPoSe9L" name="Galaxy S26 Ultra review-LIST3" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/XqcuYqJmZMz9675qPoSe9L.jpg" mos="" align="middle" fullscreen="" width="3718" height="2091" 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>When it comes to <a href="https://www.tomsguide.com/us/best-android-phones,review-6051.html">Android phones</a>, nothing caught my eye more than the Galaxy S26 Ultra. Samsung’s flagship received all the iterative updates it deserved, but one particular new feature stood out most: the <a href="https://www.tomsguide.com/phones/samsung-phones/the-galaxy-s26-ultras-privacy-display-is-more-exciting-to-me-than-any-ai-feature">Privacy Display.</a> It works like magic, making the screen look dark when someone tries to peek at it from the side. You can even customize it to block out specific parts of the display — like when you’re messaging someone. This exclusive feature is what sets it apart from everything else.</p><p><em><strong>John Velasco, Senior Phones Editor</strong></em><br>Read our full <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Samsung Galaxy S26 Ultra review</a></p><h2 class="article-body__section" id="section-sleep"><span>Sleep</span></h2><h2 id="saatva-zenhaven-mattress"><a href="https://www.tomsguide.com/mattresses/saatva-zenhaven-latex-mattress-review">Saatva Zenhaven Mattress</a></h2><p><strong>What you should be sleeping on in 2026</strong><br>Score: ★★★★<strong>½</strong></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:4000px;"><p class="vanilla-image-block" style="padding-top:56.40%;"><img id="TFabSzYttYMuHXjaezHjp5" name="Saatva Zenhaven Latex mattress in situ in Tom's Guide tester's bedroom." alt="A Saatva Zenhaven Latex mattress in situ in Tom's Guide tester's bedroom." src="https://cdn.mos.cms.futurecdn.net/TFabSzYttYMuHXjaezHjp5.jpg" mos="" align="middle" fullscreen="" width="4000" height="2256" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future/Alex Temblador)</span></figcaption></figure><p>The Saatva Zenhaven latex <a href="https://www.tomsguide.com/uk/mattresses/best-mattress">mattress</a> blew our socks off during testing, thanks to its naturally cooling and supportive sleep feel for eco-conscious shoppers. Handcrafted in the US from (mostly) organic materials, the Zenhaven boasts a flippable design with a different tension on each side: Luxury Plush and Gentle Firm. We appreciated how one side boasted more cushioning for side sleepers, while the unyielding feel of the firmer side best-suited back and stomach sleepers. At $3,549 at full MSRP it’s a splurge, but cheaper during <a href="https://www.tomsguide.com/deals/saatva-mattress-deals"><u>Saatva mattress sales</u></a>. However, it’s worth noting that latex mattresses can last up to 20 years, so we think it’s worth the investment.</p><p><em><strong>Nicola Appleton, Sleep Editor</strong></em><br>Read our full <a href="https://www.tomsguide.com/mattresses/saatva-zenhaven-latex-mattress-review"><u>Saatva Zenhaven Mattress review</u></a></p><h2 id="fitnexa-somnipods-3"><a href="https://www.tomsguide.com/wellness/sleep-tech/fitnexa-somnipods-3-review">Fitnexa SomniPods 3</a></h2><p><strong>If you struggle sleeping, these earbuds are for you</strong><br><strong>Score: </strong>★★★★☆</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:748px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="SkZZeo9JyoBnQLVZgqU8FB" name="fitnexa_Crop" alt="Fitnexa Somnipods 3" src="https://cdn.mos.cms.futurecdn.net/v2/t:110,l:226,cw:748,ch:421,q:80/SkZZeo9JyoBnQLVZgqU8FB.jpg" mos="" align="middle" fullscreen="" width="1117" height="628" 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 Fitnexa SomniPods 3 are compact <a href="https://www.tomsguide.com/wellness/sleep-tech/best-sleep-headphones">sleep earbuds</a> that helped me sleep better in even the most disruptive environments (like my neighbor's son playing basketball at unsociable hours). Fitted with built-in white noise, excellent active noise cancelation, plus sleep tracking features, they’re an easy recommendation for any troubled sleepers. But the real stand-out feature for me is the Fitnexa app. Here, your own AI coach waits for you, ready to provide personalized advice based on your sleep tracking data, activity logs and food diaries. The info isn’t quite on par with a qualified sleep professional but thanks to the wealth of data to draw from, it was pretty spot on in testing, helping take the SomniPods from sleep earbud to all-round sleep enhancer.</p><p><em><strong>Ruth Jones, Senior Sleep Writer</strong></em><br>Read Ruth's full <a href="https://www.tomsguide.com/wellness/sleep-tech/fitnexa-somnipods-3-review"><u>Fitnexa SomniPods 3 review</u></a></p><h2 class="article-body__section" id="section-smart-home-security"><span>Smart home & security</span></h2><h2 id="blink-battery-doorbell-2k"><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">Blink Battery Doorbell 2K+</a></h2><p><strong>A fantastic way to improve security on a budget</strong><br>Score: ★★★★☆</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.30%;"><img id="yZAvTAEWArFc8txHT9dPfE" name="Blink-Battery-Doorbell-2K+--4" alt="Blink Battery Doorbell 2K+ with app" src="https://cdn.mos.cms.futurecdn.net/yZAvTAEWArFc8txHT9dPfE.jpg" mos="" align="middle" fullscreen="" width="2000" height="1126" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Blink has long been one of our favorite budget smart home brands, and its newest battery-powered <a href="https://www.tomsguide.com/us/best-video-doorbells,review-4468.html">video doorbell</a> furthers its reputation as a value leader. The Battery Doorbell 2K+ delivered very good 2K video in our testing — not the tops, but for a sub-$100 device it was more than acceptable. And, while it runs on AA batteries, they’ll last up to two years on a charge. You can also use this video doorbell without a subscription (you’ll need to purchase a separate adapter), but Blink’s subscription price is relatively affordable. </p><p><em><strong>Mike Prospero, U.S. Editor-in-chief</strong></em><br>Read our full <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"><u>Blink Battery Doorbell 2K+ review</u></a></p><h2 class="article-body__section" id="section-tv-audio"><span>TV & Audio</span></h2><h2 id="samsung-s95h-oled"><a href="https://www.tomsguide.com/tvs/oled-tvs/samsung-s95h-oled-tv-review">Samsung S95H OLED</a></h2><p><strong>Supreme picture quality, even in bright rooms</strong><br><em>Score: </em>★★★★★</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jqM4wzaAhBUkmZbniDKoy9" name="Samsung-S95H--3" alt="Samsung S95H OLED TV on a desk" src="https://cdn.mos.cms.futurecdn.net/jqM4wzaAhBUkmZbniDKoy9.jpg" mos="" align="middle" fullscreen="" width="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>I’ve tested countless <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">TVs</a>, but the Samsung S95H is the first unit in several years that truly surpassed all my expectations. It completely shatters the familiar rules of OLED, obliterating ambient glare and delivering an unprecedented, jaw-dropping brightness in the self-emissive category. Even the floating metal bezel (a design choice I fully assumed I'd hate) adds a striking, premium presence I grew to love. Between its breathtaking performance and how seamlessly it transitions into a decor piece via Samsung Art Store support, this is a flagship that stands as a definitive standard-bearer.</p><p><em><strong>Kate Kozuch, Managing Editor</strong></em><br>Read Kate's full <a href="https://www.tomsguide.com/tvs/oled-tvs/samsung-s95h-oled-tv-review">Samsung S95H OLED review</a></p><h2 id="airpods-max-2"><a href="https://www.tomsguide.com/audio/headphones/apple-airpods-max-2-review">AirPods Max 2</a></h2><p><strong>Everything is dialed up to 11</strong><br>Score: ★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SusawEdjBMCisMriTJVuRF" name="AirpodsMax2_13.JPG" alt="the apple airpods max 2 in blue photographed against a blue tom's guide background, showing the mesh headband, anodized aluminum ear cups, carry case, and controls" src="https://cdn.mos.cms.futurecdn.net/SusawEdjBMCisMriTJVuRF.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>It’s impossible to be a tech lover and <em>not</em> have strong opinions about Apple’s new AirPods Max 2. Some people love them, some people hate them, but I’m firmly in the first camp. The AirPods Max 2 are <a href="https://www.tomsguide.com/best-picks/best-over-ear-headphones">headphones</a> that know what they’re about, and they’re not apologizing for it. With gorgeous anodized aluminum ear cups and an all-metal headband, they’re not the lightest cans in the world, but the sound more than makes up for it. </p><p>Every detail is clear, mids are melodic and vivacious, and the bass is balanced, rich, and warm. Of course, you’ve also got industry-leading smart tech features like Live Translation and integrated Siri, but Apple users looking for the best headphones need look no further than Apple’s own.</p><p><em><strong>Erin Bashford, Senior Reviews Writer</strong></em><br>Read Erin’s full <a href="https://www.tomsguide.com/audio/headphones/apple-airpods-max-2-review"><u>Apple AirPods Max 2 review</u></a></p><h2 id="beyerdynamic-amiron-zero"><a href="https://www.tomsguide.com/audio/earbuds/beyerdynamic-amiron-zero-review">Beyerdynamic Amiron ZERO</a></h2><p><strong>Open earbuds that make no sacrifices</strong><br><em>Score</em>: ★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RsTfNvY499tyUtwscUGaza" name="beyerdynamic amiron zero" alt="beyerdynamic amiron zero" src="https://cdn.mos.cms.futurecdn.net/RsTfNvY499tyUtwscUGaza.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Beyerdynamic Amiron ZERO have completely changed the way I think about <a href="https://www.tomsguide.com/us/best-wireless-earbuds,review-6160.html">open-earbuds</a> (and I’ve tested a lot). Up until testing the ZEROs, I’d accepted that if I wanted ambient awareness, comfort and stability while working out, I’d need to sacrifice sound quality — but they prove that’s not the case. They provided me with the detailed listening experience I love from Beyerdynamic’s other headphones, without compromising bass performance, delivering perfectly balanced sound. I wear them when I’m working, running, or hiking in the rain (thanks to IP54 durability). They’re the only open earbuds I’ve tested with no compromises.</p><p><em><strong>Ashley Thieme, Staff Writer</strong></em><br>Read Ashley’s full <a href="https://www.tomsguide.com/audio/earbuds/beyerdynamic-amiron-zero-review"><u>Beyerdynamic Amiron ZERO review</u></a></p><h2 id="jbl-xtreme-5"><a href="https://www.tomsguide.com/audio/bluetooth-speakers/jbl-xtreme-5-review">JBL Xtreme 5</a></h2><p><em><strong>The</strong></em><strong> party speaker for summer 2026</strong><br><em>Score: </em>★★★★<strong>½</strong></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:4956px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="MhmJUtGJcUZLnrZejP3SpU" name="Xtreme5-edit" alt="the jbl xtreme 5 with water splashing on it outside in the park showing its waterproofing" src="https://cdn.mos.cms.futurecdn.net/MhmJUtGJcUZLnrZejP3SpU.jpg" mos="" align="middle" fullscreen="" width="4956" height="2788" 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>The JBL Xtreme 5 came, it saw, and it conquered. JBL really understood the assignment with the surprise follow-up to 2024’s Xtreme 4. Everything about the Xtreme 5 oozes confidence: the deft, controlled bass that’ll have your floorboards shaking and your bones quaking; the literally unbeatable IP68 rating that protects it against rain, sand, and drops; the gorpcore, utilitarian design; and of course the rugged 24-hour battery life. This is <em>the</em> party speaker of 2026. I’ve tested hundreds of audio products and <a href="https://www.tomsguide.com/us/best-bluetooth-speakers,review-1982.html">Bluetooth speakers</a>, but the Xtreme 5 is a special one. </p><p><em><strong>Erin Bashford, Senior Reviews Writer</strong></em><br>Read Erin’s full <a href="https://www.tomsguide.com/audio/bluetooth-speakers/jbl-xtreme-5-review"><u>JBL Xtreme 5 review</u></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/reviews">See all Tom's Guide Reviews coverage</a></li><li><a href="https://www.tomsguide.com/savings-squad">Find deals fast with the Tom's Guide Savings Squad</a></li><li><a href="https://www.tomsguide.com/best-picks">Check out all of our Best Picks pages</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Forget Google AI — the new Tom's Guide Product Finder lets you easily find the expert-tested tech you want (at the lowest price) ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/forget-google-ai-the-new-toms-guide-product-finder-lets-you-easily-find-the-expert-tested-tech-you-want-at-the-lowest-price</link>
                                                                            <description>
                            <![CDATA[ The Tom's Guide Product Finder lets you easily search for the best products we've reviewed, with real-time price history. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CU6W9oK3FBk6C9fnQ8HoWb</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/QFA4jHu35YP8ErGtC47SZd-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Fri, 10 Jul 2026 11:00:00 +0000</pubDate>                                                                                                                                <updated>Fri, 10 Jul 2026 16:19:42 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ mike.prospero@futurenet.com (Mike Prospero) ]]></author>                    <dc:creator><![CDATA[ Mike Prospero ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/6ZM8mX4UwccqDJTh9gLPqV.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Michael A. Prospero is the U.S. Editor-in-Chief for Tom’s Guide. He oversees all evergreen content and oversees the Homes, Smart Home, and Fitness/Wearables categories for the site. In his spare time, he also tests out the latest drones, electric scooters, and smart home gadgets, such as video doorbells. Before his tenure at Tom&#039;s Guide, he was the Reviews Editor for Laptop Magazine, a reporter at Fast Company, the Times of Trenton, and, many eons back, an intern at George magazine. He received his undergraduate degree from Boston College, where he worked on the campus newspaper The Heights, and then attended the Columbia University school of Journalism. When he’s not testing out the latest running watch, electric scooter, or skiing or training for a marathon, he’s probably using the latest sous vide machine, smoker, or pizza oven, to the delight — or chagrin — of his family.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/QFA4jHu35YP8ErGtC47SZd-1280-80.png">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tom&#039;s Guide product finder]]></media:description>                                                            <media:text><![CDATA[Tom&#039;s Guide product finder]]></media:text>
                                <media:title type="plain"><![CDATA[Tom&#039;s Guide product finder]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/QFA4jHu35YP8ErGtC47SZd-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Have you ever struggled with finding the <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TV</a>, laptop, robot vacuum, running shoe, or pair of headphones? Not only do you have to wade through dozens of reviews, but then you have to also check the prices on Amazon, Best Buy, and other sites to make sure you're getting the best deal. </p><p>We've introduced a new tool at Tom's Guide to help you cut through the clutter. Introducing the <a href="https://www.tomsguide.com/products">Tom's Guide Product Finder</a>. You can search for virtually anything, and the Product Finder will search through every product that we've tested to bring you not only our top picks, but also let you know if now is the best time to buy, or if you should wait for a better deal to come along. </p><p>Let me show you how the Product Finder works, and how to use it to find just what you're looking for.</p><h3 class="article-body__section" id="section-getting-started"><span>Getting started</span></h3><section class="howto-block">                    <h3>Go to the product finder</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/98RyfXRsxuJu6AWQfyaoM4.jpg"                                        alt="product finder 1 mobile"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/98RyfXRsxuJu6AWQfyaoM4.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>On your phone or laptop, <strong>navigate to </strong><a href="https://www.tomsguide.com/products" target="_blank"><strong>https://www.tomsguide.com/products. </strong></a>At the start, the Product Finder has a search box, along with some pre-selected categories below. If you're unsure of where to start, <strong>click on one of the icons</strong> to view, for example, all of our TV reviews. </p></p>                </section><section class="howto-block">                    <h3>Sort your results</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/XwHnQeW8ZuD9pRgeyZKNLK.jpg"                                        alt="product finder sort feature"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/XwHnQeW8ZuD9pRgeyZKNLK.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>By default, products are sorted by their rating, with the highest-rated products at the top. However, you can also sort by price and the most recent reviews. <strong>Click on the Sort button above the results</strong>, and select the sorting method you prefer.</p></p>                </section><h3 class="article-body__section" id="section-refining-your-search"><span>Refining your search</span></h3><section class="howto-block">                    <h3>How to use filters</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/GZqwAwYiXJaiwQ33Qds6gW.jpg"                                        alt="product finder filters"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/GZqwAwYiXJaiwQ33Qds6gW.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>If you want to narrow your search, <strong>click on the All Filters button</strong>. This will display a pop-up menu on the left, where you can refine your search further. In the case of TVs, you can select by screen size, price range, rating, brand and more.</p></p>                </section><h3 class="article-body__section" id="section-using-the-search-bar"><span>Using the search bar</span></h3><section class="howto-block">                    <h3>How to use the search bar</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/n3dwsTPj9NX5q8YX75hSAJ.jpg"                                        alt="product finder search bar"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/n3dwsTPj9NX5q8YX75hSAJ.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>The search bar in the product finder lets you type in a real-world query to more quickly find what it is you're looking for. <strong>Type in what you're looking for</strong>. Here, I've typed in "Best TV for PS5."  </p><p>If you use this method, the results that the Product Finder returns will also contain small blurbs highlighting exactly why that product will fit your needs. If you don't get the results you want, try a different, or slightly modified phrase.</p></p>                </section><h3 class="article-body__section" id="section-finding-the-best-price"><span>Finding the best price</span></h3><section class="howto-block">                    <h3>How to find price history</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/RbGxAUVaAjqRFBKN8dcyTa.jpg"                                        alt="product finder price history"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/RbGxAUVaAjqRFBKN8dcyTa.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>If you <strong>click on the Show More button</strong> at the bottom of each card, you'll see additional information about the product, as well as its price history for the last 60 days. Using the LG B6 as an example, we can see that it's currently $1,000 at Best Buy, but its average price is $1,850, and its lowest price — during Prime Day — was $700. </p><p>Here, you can also compare prices from several retailers, so you can see who's offering the greatest value. It's also worth signing up for a Tom's Guide membership (it's free!) which will give you additional discounts and coupons at select retailers.  </p></p>                </section><h3 class="article-body__section" id="section-trying-to-help-however-we-can"><span>Trying to help however we can</span></h3><p>We review a lot of things at Tom's Guide, but we don't review everything. Case in point: microwaves. Let's face it — they're pretty much all the same. But, we do test toaster ovens! </p><p>If you search for something that we don't review (like microwaves), our Product Finder will attempt to provide you with products that come as close as possible to what you're looking for. Is it perfect? No. But we're always looking to improve our tools.</p><p>One other little quirk that we're trying to work out: If you're searching for TVs, but then want to search for another type of product, like running shoes, <strong>you need to first click the little Home icon above the search bar</strong>. Otherwise, you won't get any results.</p><p>So go on and try out the Product Finder, and please let us know how we can improve it.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 18 best Target 4th of July tech deals: Save big on headphones, laptops and wearables ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/18-best-target-4th-of-july-tech-deals-save-big-on-headphones-laptops-and-wearables</link>
                                                                            <description>
                            <![CDATA[ There are some big savings to be had over at Target, with discounts on a wide range of tech, from turntables and laptops to speakers, smart watches, and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JMdvFC2qHWh3Vjyhd38fQE</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Pqk6N6MGGncTG5RHm7cKKA-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 02 Jul 2026 14:52:00 +0000</pubDate>                                                                                                                                <updated>Thu, 02 Jul 2026 14:52:04 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Will Salmon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/HpRWP7Mh9ErgRGoTvZBbBJ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Will Salmon is Tom&#039;s Guide&#039;s Collections Editor, curating advice on the best products to spend your money on. Will has been writing about tech and entertainment for almost 20 years, including stints as GamesRadar+&#039;s Streaming Editor, editing comics website Newsarama, and writing for lots and lots of magazines.&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/Pqk6N6MGGncTG5RHm7cKKA-1280-80.jpg">
                                                            <media:credit><![CDATA[Vankyo, Razer, Audio Technica, Samsung, Beats / Edited by Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A turntable, mouse, projector, soundbar, and portable speaker.]]></media:description>                                                            <media:text><![CDATA[A turntable, mouse, projector, soundbar, and portable speaker.]]></media:text>
                                <media:title type="plain"><![CDATA[A turntable, mouse, projector, soundbar, and portable speaker.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Pqk6N6MGGncTG5RHm7cKKA-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We've been covering a lot of the <a href="https://www.tomsguide.com/sales-events/best-4th-of-july-sales-2026-walmart-home-depot-more">4th of July sales</a> over at Best Buy. Well, they're not the only big retailer offering some huge discounts right now. Target, for instance, has a very tasty sale on, with discounts on home stuff, clothing, accessories, and more. </p><p>On this page I've honed in on the tech deals. I've pulled together 18 of my favorite deals in the sale, covering everything from headphones to laptops, smart watches, 3D printers and more. There's some really good bargains to be had here, with up to 50% off some items.</p><p>If you're looking for more deals then make sure to check out our guides to <a href="https://www.tomsguide.com/home/home-appliances/best-buy-4th-of-july-sale-huge-appliance-discounts-from-ge-lg-and-samsung-save-up-to-usd1560" target="_blank">Best Buy's appliance sale</a>, as well as its <a href="https://www.tomsguide.com/tvs/4th-of-july-tv-deals-save-up-to-usd1-700-on-lg-samsung-and-more-at-best-buy" target="_blank">TV</a> and <a href="https://www.tomsguide.com/audio/bluetooth-speakers/best-buy-4th-of-july-sale-score-up-to-33-percent-off-these-9-bluetooth-speakers-from-sony-klipsch-jbl-and-more" target="_blank">audio sales </a>too.</p>        <div class="featured_product_block featured_block_hero" data-id="6eadf10b-842c-4336-8bd9-4a00a3bbd8d0">            <a href="https://www.target.com/p/razer-basilisk-v3-ergonomic-wired-gaming-mouse/-/A-86375594#lnk=sametab" data-model-name="Razer Basilisk V3 Wired Gaming Mouse" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/vsFXPhBhPyBRkq5MoSGFbG.webp" alt="Razer Basilisk V3 Ergonomic Wired Gaming Mouse: Usb-A, Illuminated Optical Design"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Razer</div>                                        <div class="featured__title">Razer Basilisk V3 Wired Gaming Mouse</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="a7ebcd82-f3b6-4e57-b73a-698ab690124f">            <a href="https://www.target.com/p/apple-magsafe-charger-2m/-/A-91119822" data-model-name="Apple MagSafe Charger" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/SREg2MZcGTHD3sxJmfyhsa.webp" alt="Apple Magsafe Charger (2m)"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Apple</div>                                        <div class="featured__title">Apple MagSafe Charger</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="1a750484-7107-4e96-948d-3730206e48c9">            <a href="https://www.target.com/p/epson-workforce-wf-2930-wireless-all-in-one-color-inkjet-printer-copier-scanner-black/-/A-90762987#lnk=sametab" data-model-name="Epson Workforce Wireless Color Inkjet Printer" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/vpDm53kszkxdzJFsVrjqsM.webp" alt="Epson Workforce Wf-2930 Wireless All-In-One Color Inkjet Printer, Copier, Scanner - Black: Smartphone App, Usb, Automatic 2-Sided Printing"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Epson</div>                                        <div class="featured__title">Epson Workforce Wireless Color Inkjet Printer</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="7cc280ae-f1ac-462d-9dd3-f9afc9f32e9a">            <a href="https://www.target.com/p/samsung-2-0ch-soundbar-with-built-in-woofer-titan-black-hw-b400f/-/A-94465171" data-model-name="Samsung 2.0ch Soundbar with Built-In Woofer" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/s4EqFx63u6gLwUEnw6kfbH.jpg" alt="Samsung 2.0ch Soundbar With Built-In Woofer - Titan Black (hw-B400f)"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Samsung</div>                                        <div class="featured__title">Samsung 2.0ch Soundbar with Built-In Woofer</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="4b0f81f2-3e44-4377-abc5-21ec7b8811f4">            <a href="https://www.target.com/p/samsung-27-34-s3-fhd-ips-100hz-monitor/-/A-94474425#lnk=sametab" data-model-name="Samsung 27-Inch S3 FHD Monitor" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/B6vv9jH5dwRUx7ZbYfGx5P.webp" alt="Samsung 27" S3 Fhd Ips 100hz Monitor: Home Adjustable Tilt Display"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Samsung</div>                                        <div class="featured__title">Samsung 27-Inch S3 FHD Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="b4e5d556-3063-418d-8845-03dd0fc228c1">            <a href="https://www.target.com/p/beats-pill-wireless-bluetooth-speaker/-/A-92595737?preselect=92268973#lnk=sametab" data-model-name="Beats Pill Wireless Bluetooth Speaker" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/6o3SsRetjSFk9qLzjFYh6K.webp" alt="Beats Pill Wireless Bluetooth Speaker - Champagne Gold"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Beats</div>                                        <div class="featured__title">Beats Pill Wireless Bluetooth Speaker</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="cfbd0a9e-e154-4d96-afb2-44d37f8e36bc">            <a href="https://www.target.com/p/beats-studio-buds-true-wireless-bluetooth-noise-cancelling-earbuds/-/A-89220711?preselect=88999834#lnk=sametab" data-model-name="Beats Studio Buds" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/DKj5cnFL7QPr8tAeFZMDWP.webp" alt="Beats Studio Buds   True Wireless Bluetooth Noise Cancelling Earbuds - Black/gold"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Beats</div>                                        <div class="featured__title">Beats Studio Buds</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="3ff4fadd-8722-40a0-9b28-940f676d28bd">            <a href="https://www.target.com/p/audio-technica-at-lp60x-bk-fully-automatic-belt-drive-stereo-turntable-33-1-3-45-rpm/-/A-1006270231#lnk=sametab" data-model-name="Audio-Technica AT-LP60X-BK Stereo Turntable" 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/BhMTzgZaeziv6PRh839LCo.jpg" alt="Audio Technica LP60X-BK turntable"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Audio-Technica</div>                                        <div class="featured__title">Audio-Technica AT-LP60X-BK Stereo Turntable</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="7f078f0c-7bcc-42be-a748-a3709508868e">            <a href="https://www.target.com/p/vankyo-leisure-570d-projector-with-content/-/A-91625147" data-model-name="Vankyo Leisure 570D 1080p Projector" 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/DpC6RDCmbdFvpnKjREd8gj.jpg" alt="Vankyo Leisure 570D 1080p Projector"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Vankyo</div>                                        <div class="featured__title">Vankyo Leisure 570D 1080p Projector</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="c20f36d2-6bd0-4027-929d-d6bda636b151">            <a href="https://www.target.com/p/apple-magic-keyboard-for-ipad-pro-11-inch-and-ipad-air/-/A-85422658" data-model-name="Apple Magic Keyboard for iPad Air 11-Inch (M2)" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/xsZRZMk4EpmiUUVCkkkJ28.webp" alt="Apple Magic Keyboard for Ipad Air 11-Inch (m2) - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Apple</div>                                        <div class="featured__title">Apple Magic Keyboard for iPad Air 11-Inch (M2)</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="9cfed915-878c-46a7-b328-37529100758b">            <a href="https://www.target.com/p/samsung-galaxy-buds-4-pro-2-way-speaker-ai-real-time-interpreter-true-wireless-noise-cancellation-anc-2-0-bluetooth-touch-control-global-model/-/A-1010805391?preselect=1010805390#lnk=sametab" data-model-name="Samsung Galaxy Buds 4 Pro" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/Ja2tF33LUsF65oS2FY7unQ.webp" alt="Samsung Galaxy Buds 4 Pro 2 Way Speaker Ai Real-Time Interpreter True Wireless Noise Cancellation Anc 2.0 Bluetooth Touch Control -Global Model Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Samsung</div>                                        <div class="featured__title">Samsung Galaxy Buds 4 Pro</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="71cbc025-1354-4442-b98c-4dbc2c7e85c8">            <a href="https://www.target.com/p/beats-studio-pro-bluetooth-wireless-headphones/-/A-89459966" data-model-name="Beats Studio Pro Bluetooth Wireless Headphones" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/GFLhQXtQnXCPMP2jMUVsL4.webp" alt="Beats Studio Pro Bluetooth Wireless Headphones - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Beats</div>                                        <div class="featured__title">Beats Studio Pro Bluetooth Wireless Headphones</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="65240c83-70a5-4a46-bf1b-758b7fcd5471">            <a href="https://www.target.com/p/apple-magic-keyboard-for-ipad-pro-12-9-inch/-/A-82875456?preselect=77640925" data-model-name="Apple Magic Keyboard for iPad Air 13-Inch (M2)" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/AP9wodHCvTG47j7fj79PLm.webp" alt="Apple Magic Keyboard for Ipad Air 13-Inch (m2) - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Apple</div>                                        <div class="featured__title">Apple Magic Keyboard for iPad Air 13-Inch (M2)</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="a0e6e14d-271c-4a45-8384-a1300f0b2e2a">            <a href="https://www.target.com/p/flashforge-ad5x-multicolor-3d-printer-for-high-speed-full-color-printing/-/A-1011596834#lnk=sametab" data-model-name="Flashforge AD5X Multicolor 3D Printer" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/iDGkWnV7FDYzqL2wnTdrPV.webp" alt="Flashforge Ad5x – Multicolor 3d Printer for High-Speed, Full-Color Printing"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Flashforge</div>                                        <div class="featured__title">Flashforge AD5X Multicolor 3D Printer</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="07b2aac0-8af3-4ba8-ba02-dcb5a8b46597">            <a href="https://www.target.com/p/samsung-galaxy-watch8-classic-46mm-bt-smartwatch-black/-/A-94912561#lnk=sametab" data-model-name="Samsung Galaxy Watch8" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/qUktZu6EDAAH2gJxEoAURW.webp" alt="Samsung Galaxy Watch8 Classic 46mm Bt Smartwatch - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Samsung</div>                                        <div class="featured__title">Samsung Galaxy Watch8</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="57341106-8f51-4f52-b74c-32781e7989f3">            <a href="https://www.target.com/p/lenovo-v15-g4-15-6-fhd-ryzen-5-7430u-16gb-ram-512gb-ssd-amd-radeon-graphics-wi-fi-6-win11-pro-black/-/A-1011111206?preselect=1011111206#lnk=sametab" data-model-name="Lenovo V15 G4 15.6-Inch Laptop" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/52oR5mjj5Jyg5MRkWeyErT.webp" alt="Lenovo V15 G4 Laptop, 15.6" Fhd, Ryzen 5, 16gb Ram, 512gb Ssd, Amd Radeon Graphics, Wi-Fi 6, Win11 Pro, Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Lenovo</div>                                        <div class="featured__title">Lenovo V15 G4 15.6-Inch Laptop</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="faec860d-43b1-4c47-a027-88f5e6812986">            <a href="https://www.target.com/p/apple-ipad-air-m3-wi-fi/-/A-94651514?preselect=91122089#lnk=sametab" data-model-name="Apple iPad Air (M3) 13-Inch" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/fpHC7XBAF4ErwY2GVhQGka.webp" alt="Apple Ipad Air (m3) 13 Inch Wi-Fi 256gb - Blue"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Apple</div>                                        <div class="featured__title">Apple iPad Air (M3) 13-Inch</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="1dd20eaa-3df7-4ded-a537-88748a72995d">            <a href="https://www.target.com/p/samsung-class-the-frame-ls03fa-qled-4k-samsung-vision-ai-smart-tv/-/A-94730092?preselect=94465165#lnk=sametab" data-model-name="Samsung 65-Inch The Frame QLED 4K Smart TV" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/5kmK9Kgx3ch6kmCCRoLZrb.webp" alt="Samsung 65" Class the Frame Ls03fa Qled 4k Samsung Vision Ai Smart Tv (qn65ls03fa): Alexa Built-In, Bluetooth, 4k Uhd, Hdr10"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Samsung</div>                                        <div class="featured__title">Samsung 65-Inch The Frame QLED 4K Smart TV</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just got both my battery packs confiscated at a Chinese airport, and I wish I’d known about this one thing before flying ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/i-just-got-both-my-battery-packs-confiscated-at-a-chinese-airport-and-i-wish-id-known-about-this-one-thing-before-flying</link>
                                                                            <description>
                            <![CDATA[ I just had my portable power banks confiscated by airport security in China. Here is the strict mandatory "3C" logo regulation you need to check before flying. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">XM8jqmJPanypotpz82FFmW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/o6gL3szNYSuHNpvDuWnrM5-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 02 Jul 2026 05:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/o6gL3szNYSuHNpvDuWnrM5-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[3C logo power bank]]></media:description>                                                            <media:text><![CDATA[3C logo power bank]]></media:text>
                                <media:title type="plain"><![CDATA[3C logo power bank]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/o6gL3szNYSuHNpvDuWnrM5-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>My battery packs are property of the Chinese government now because of this one critical rule change that I wish I’d known about before flying!</p><p>“No three Cs,” the airport security officer told me over and over again while walking away with what I’d selected as my number one <a href="https://www.tomsguide.com/best-picks/best-portable-chargers">best portable power bank</a>. At that moment, I felt naked without my precious charging, and with a 13-hour flight ahead of me from Beijing to LAX, all of my devices were cooked.</p><p>So I should really put my hands up here — I really should’ve known about this massive change in Chinese government regulations before flying there. Let me be clear: <strong>your power bank needs a “three Cs” logo (a stamp from the government to say it’s safe to fly) otherwise security will confiscate it.</strong></p><p>While I’d still recommend the Cuktech power bank for traveling anywhere else, this (and many other options on our current guide) are on a strict no fly list in the far East, and I’m busily testing to find the best battery pack for flying to/from China.<strong> </strong>Allow me to give you a short history lesson on how we got here, what that means for your purchase options, and what I’d recommend.</p><div class="product"><a data-dimension112="2e0df39d-5df9-445c-bfed-49dcf9fbb61b" data-action="Deal Block" data-label="This 10,000mAh bank is good for about 2 full charges of an iPhone 15 Pro in my own testing, and the built-in fan keeps things cool for consistent charging speeds. And right now, it’s $17 off the MSRP." data-dimension48="This 10,000mAh bank is good for about 2 full charges of an iPhone 15 Pro in my own testing, and the built-in fan keeps things cool for consistent charging speeds. And right now, it’s $17 off the MSRP." data-dimension25="$52" href="https://www.amazon.com/sharge-Magnetic-Portable-Transparent-Compatible/dp/B0DM93SL5Y" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1337px;"><p class="vanilla-image-block" style="padding-top:91.77%;"><img id="eVmfsSrs4jceYWzbxy6hga" name="Sharge Icemag 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/eVmfsSrs4jceYWzbxy6hga.jpg" mos="" align="middle" fullscreen="" width="1337" height="1227" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This 10,000mAh bank is good for about 2 full charges of an iPhone 15 Pro in my own testing, and the built-in fan keeps things cool for consistent charging speeds. And right now, it’s $17 off the MSRP.<a class="view-deal button" href="https://www.amazon.com/sharge-Magnetic-Portable-Transparent-Compatible/dp/B0DM93SL5Y" target="_blank" rel="nofollow" data-dimension112="2e0df39d-5df9-445c-bfed-49dcf9fbb61b" data-action="Deal Block" data-label="This 10,000mAh bank is good for about 2 full charges of an iPhone 15 Pro in my own testing, and the built-in fan keeps things cool for consistent charging speeds. And right now, it’s $17 off the MSRP." data-dimension48="This 10,000mAh bank is good for about 2 full charges of an iPhone 15 Pro in my own testing, and the built-in fan keeps things cool for consistent charging speeds. And right now, it’s $17 off the MSRP." data-dimension25="$52">View Deal</a></p></div><h2 id="the-three-cs">The three Cs</h2><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="cZMEVXXcBsoED26UuuL4ZL" name="Sharge Icemag 2" alt="Sharge Icemag 2" src="https://cdn.mos.cms.futurecdn.net/cZMEVXXcBsoED26UuuL4ZL.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Before 2023, power banks weren’t regulated strictly in China, and as they were mostly manufactured in the country, this led to a huge influx of cheap, low quality devices with subpar lithium-ion cells (the actual battery part). This made them prone to swelling or even catching fire.</p><p>Fast forward to 2023, and the nation’s government took action with the mandatory China Compulsory Certification (3C) — a logo that signifies the battery has passed grueling safety testing. Then in August 2024, it became illegal to produce or sell power banks in the country without this certification.</p><p>But things escalated in mid-2025 when the Civil Aviation Administration of China (CAAC) began enforcing this rule at airport security checkpoints. They actively seek both a 3C mark alongside a QR code for traceability, plus a capacity well under 100 watt hours (Wh).</p><h2 id="what-should-you-get">What should you get?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="23TPv8wxk4CpYyDtzUBAWh" name="Sharge Icemag 2" alt="Sharge Icemag 2" src="https://cdn.mos.cms.futurecdn.net/23TPv8wxk4CpYyDtzUBAWh.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" 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>So I’ll be upfront — only one of these portable batteries on our best power banks list has the 3C logo. We’ll make this more clear in our buying guide and make it a ground rule to ensure transparency on whether this certification exists. </p><p>The one on our guide that has this is the <strong>Sharge IceMag 2. </strong>This is a 10,000 mAh MagSafe charger with built-in cooling to ensure consistent 15W charging without overheating (or 30W wired fast charging).</p><p>Plus with the kickstand, this has been a convenient one for me to drive daily in terms of setting it up on my tray table while binge watching. I’ve called in many more 3C logo batteries to ensure we can expand this list.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-goes-full-taylor-swift-with-wide-galaxy-z-fold-8-tease-by-wiping-its-instagram-bold-stroke-new-shape">Samsung teases new Galaxy Z Fold 8 design ahead of Unpacked — 'bold stroke, new shape'</a></li><li><a href="https://www.tomsguide.com/phones/iphones/i-just-tested-the-phone-everybody-thinks-is-a-preview-of-the-iphone-fold-god-i-hope-theyre-wrong">I just tested the phone everybody thinks is a preview of the iPhone Fold — God, I hope they’re wrong</a></li><li><a href="https://www.tomsguide.com/phones/major-security-holes-in-airdrop-and-quickshare-put-your-phone-at-risk-of-attack-heres-how-to-protect-yourself">Major security holes in AirDrop and QuickShare put your phone at risk of attack — here's how to protect yourself</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ These 15 back-to-school tech essentials will get you classroom ready — starting at just $12 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/these-15-back-to-school-tech-essentials-will-get-you-classroom-ready-starting-at-just-usd12</link>
                                                                            <description>
                            <![CDATA[ After summer, a new semester starts and there's one great way to get yourself ready: by investing in some fresh tech. Here's how to work smarter without breaking the bank. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">bJZkLwQF5HrwdkK67zoJdd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/D58ZSd7AUeGqyC4XFY6kwM-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 01 Jul 2026 18:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Grace Dean ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oxXqkks7wgxZkPiyYY2n6H.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/D58ZSd7AUeGqyC4XFY6kwM-1280-80.jpg">
                                                            <media:credit><![CDATA[Logitech, Anker, 1More, Samsung, Amazon / Edited by Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Technology for back to school on a blue electronic background]]></media:description>                                                            <media:text><![CDATA[Technology for back to school on a blue electronic background]]></media:text>
                                <media:title type="plain"><![CDATA[Technology for back to school on a blue electronic background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/D58ZSd7AUeGqyC4XFY6kwM-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When I was younger, I used to love buying new stuff ready for school to start again. But, while that meant a couple of funky notebooks or a pencil case, nowadays investing in tech is a pretty essential part of learning. Getting kitted out for a new semester means picking out the right tablet, headphones, power banks and more to make sure you're working smarter, not harder.</p><p>Fortunately, no matter what you're studying at school, I've put together the ultimate back-to-school checklist that has just about everything you'll need, including some of the <a href="https://www.tomsguide.com/best-picks/best-laptops-for-college-students">best laptops for college students</a> and <a href="https://www.tomsguide.com/best-picks/best-cheap-noise-cancelling-headphones">best noise-cancelling headphones</a> when working on a budget. Here are the 12 tech essentials I recommend.</p>        <div class="featured_product_block featured_block_hero" data-id="4dca6fbe-97d8-458d-8b6d-053ffdcf7b8e">            <a href="https://www.amazon.com/UGREEN-Delivery-Multiport-Adapter-Thinkpad/dp/B0BR3M8XHK/" data-model-name="UGREEN USB-C Hub 5-in-1 Multiport" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/afufu5g8JJZpaKwXb6f6sG.jpg" alt="Ugreen Usb C Hub 5 in 1 Multiport Usb Adapter 4k Hdmi, 100w Power Delivery, 3 Usb-A Data Ports, Usb C Dongle for Macbook Pro/air M5/m4/m3/m2/m1, Ipad Pro, Imac, Iphone 16 Pro/pro Max, Xps, Thinkpad"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>UGREEN</div>                                        <div class="featured__title">UGREEN USB-C Hub 5-in-1 Multiport</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="282867c0-1e56-46f8-9450-1d64c8100a3e">            <a href="https://www.amazon.com/OMOTON-Detachable-Aluminum-Compatible-MacBook/dp/B08B13JGN4/" data-model-name="OMOTON Laptop Stand" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:113.12%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/G8aTzoBZQBzDvpKGbLyvVH.jpg" alt="Omoton Laptop Stand, Detachable Laptop Mount, Aluminum Laptop Holder Stand for Desk, Compatible With Macbook Air/pro, Dell, Hp All Laptops (11-16 Inch), Silver"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>OMOTON</div>                                        <div class="featured__title">OMOTON Laptop Stand</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="8182d2af-7c9e-4484-94a1-cf23871ef314">            <a href="https://www.amazon.com/Logitech-MK270-Wireless-Keyboard-Mouse/dp/B0DHGGRYZ9/" data-model-name="Logitech MK270 Wireless Keyboard and Mouse" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/sMUmrG77KQui8A5VAVZ43J.jpg" alt="Logitech Mk270 Wireless Keyboard and Mouse Combo for Windows, 2.4 Ghz Wireless, Compact Mouse, 8 Multimedia and Shortcut Keys, 2-Year Battery Life, for Pc, Laptop - White"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Logitech</div>                                        <div class="featured__title">Logitech MK270 Wireless Keyboard and Mouse</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="5a458dbe-5397-4d77-8a9f-b785fc8c6809">            <a href="https://www.amazon.com/Soundcore-Cancelling-Powerful-Playtime-Bluetooth/dp/B0CRTR3PMF" data-model-name="Soundcore P30i by Anker" 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/fAE2QPj7wAL8ajQ2fdrfdJ.jpg" alt="Soundcore P30i by Anker Noise Cancelling Earbuds, Strong and Smart Noise Cancelling, Powerful Bass, 45h Playtime, 2-In-1 Case and Phone Stand, Ip54, Wireless Earbuds, Bluetooth 5.4 (green)"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Soundcore</div>                                        <div class="featured__title">Soundcore P30i by Anker</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="9e526b49-d87c-4783-93f8-cbbbac70c952">            <a href="https://www.amazon.com/Portable-External-Drive-Desktop-Chromebook/dp/B0767PGYHT" data-model-name="Maxone 500GB Hard Drive" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/3y69HhemXzLhJofLFDu7CK.jpg" alt="Maxone 500gb Ultra Slim Portable External Hard Drive Hdd Usb 3.0 Compatible With Pc, Laptop - Gold"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Maxone</div>                                        <div class="featured__title">Maxone 500GB Hard Drive</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="932656ac-fe51-4b71-81ee-f1943166ad47">            <a href="https://www.amazon.com/Anker-Upgraded-Version-High-Speed-Portable/dp/B0CZ9LH53B/" data-model-name="Anker Zolo Power Bank" 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/mru3m8n4t9UV3RPT2WkNkK.jpg" alt="Anker Zolo Power Bank (2025 Upgraded Version), 20,000mah 30w High-Speed Portable Charger With Built-In Usb-C Cable, Battery Pack for Iphone 17/16 / 15 Series, Galaxy, and More"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Anker</div>                                        <div class="featured__title">Anker Zolo Power Bank</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_standard" data-id="a5dd7ba3-4944-4e9b-a936-7cf3373f5215">            <a href="https://www.amazon.co.uk/UPERFECT-Portable-Monitor-Ultra-Slim-Kickstand/dp/B0F9KGR48D/" data-model-name="UPERFECT 15.6-inch Portable Monitor" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/GWWRcm62FZgGGhAoRUf7Kh.jpg" alt="Uperfect Portable Monitor 15.6 Inch 125%srgb 1200:1 Ips Laptop Monitor, Fhd 1080p Ultra-Slim Travel Small Monitor, Usb C Second Screen, Gaming Monitor Mini Hdmi Type-C for Laptop/pc, Vesa & Kickstand"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>UPERFECT</div>                                        <div class="featured__title">UPERFECT 15.6-inch Portable Monitor</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="9c056cb4-81dc-42d9-9234-8d168653641d">            <a href="https://www.amazon.com/1MORE-SonoFlow-Pro-Noise-Cancelling-Headphones/dp/B0DBZW1TMT/" data-model-name="1MORE Sonoflow Pro Headphones" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/Sr4dReL6j8rCkFTtG7tNLL.jpg" alt="1more Sonoflow-Pro Noise Cancelling Headphones - Hq51 Over Ear Bluetooth Headphones With Ldac for Hi-Res Wireless Audio,100h Playtime,bluetooth 5.4,quietmax Anc, Comfortable Fit,clear Calls"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>1MORE</div>                                        <div class="featured__title">1MORE Sonoflow Pro Headphones</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="62677994-1900-434a-9d5e-5d58b1617d3e">            <a href="https://www.amazon.com/Anker-Portable-Multi-Device-Charging-Retractable/dp/B0DMDJBCDP/?th=1" data-model-name="Anker Laptop Power Bank" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/7BFCNUfuRA4KLudcA3pQtL.jpg" alt="Anker Laptop Power Bank,25,000mah Portable Charger With 165w Total Output,3 Usb-C Ports (100w Max Each),built-In Retractable Cables,flight-Ready,for Iphone 17/16 Series,macbook,samsung,and More"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Anker</div>                                        <div class="featured__title">Anker Laptop Power Bank</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="659a3526-ce31-4dcb-b87a-f3ac411251e7">            <a href="https://www.amazon.com/Samsung-Optimized-Performance-Expandable-Speakers/dp/B0FVXMHHRP/" data-model-name="Samsung Galaxy Tab A11+" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/gNH6W4kYgrJ2JJRkwYmCPM.jpg" alt="Samsung Galaxy Tab A11+ 6gb Ram, 128gb Storage, Optimized Performance, Long Lasting Battery, Expandable Storage, Large Display, Dolby Atmos Speakers, Ai Assist, Slim, Light, 2 Year Warranty, Gray"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Samsung</div>                                        <div class="featured__title">Samsung Galaxy Tab A11+</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="90251ac7-b397-428f-bcb6-0350f62eede3">            <a href="https://www.amazon.com/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ7871B8/" data-model-name="Apple IPad 11-Inch" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/BbxLKunYVQcjerGPhWnYpM.jpg" alt="Apple Ipad 11-Inch: A16 Chip, 11-Inch Model, Liquid Retina Display, 128gb, Wi-Fi 6, 12mp Front/12mp Back Camera, Touch Id, All-Day Battery Life — Pink"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Apple</div>                                        <div class="featured__title">Apple IPad 11-Inch</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="a1085366-e94a-4b9e-9af8-995f84c7a78d">            <a href="https://www.amazon.com/Lenovo-Snapdragon-X1-26-100-Fingerprint-Dockztorm/dp/B0GZSJ3PSC/" data-model-name="Lenovo IdeaPad Slim 3x" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:76.40%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/iPuBr5Bi6JUDozZMowE2LN.jpg" alt="Lenovo Ideapad Slim 3x Copilot + Laptop 15.3" Touch Ips Fhd+ Display (qualcomm Snapdragon X X1-26-100, 16gb Lpddr5x, 1tb Ssd, Backlit Kb, Fingerprint, Win 11 Pro) W/dockztorm Wireless Mouse (renewed)"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Lenovo</div>                                        <div class="featured__title">Lenovo IdeaPad Slim 3x</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="951fe61e-4081-48be-954b-c9f7d9f010b1">            <a href="https://www.bestbuy.com/product/apple-macbook-neo-13-inch-laptop-a18-pro-chip-with-6core-cpu-and-5core-gpu-8gb-memory-256gb-ssd-blush/JJGCQYXQ58" data-model-name="Apple 2026 13-inch MacBook Neo" 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/gbQSgMRXDBRLvVqyvBNg7H.jpg" alt="Apple Macbook Neo"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Apple</div>                                        <div class="featured__title">Apple 2026 13-inch MacBook Neo</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_standard" data-id="47c6b7f7-5f7e-4707-bf41-9bb98a99738e">            <a href="https://www.amazon.com/Microsoft-Surface-Windows-Touchscreen-Snapdragon/dp/B0DZ4XWMS1/" data-model-name="Microsoft Surface Pro 2025 2-In-1 Laptop/Tablet" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/QnEC4xqnVgau3A3UXTFGtm.jpg" alt="Microsoft Surface Pro 2-In-1 Laptop/tablet (2025), Windows 11 Copilot+ Pc, 12" Touchscreen Display, Snapdragon X Plus (8 Core), 16gb Ram, 512gb Storage, Ocean"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Microsoft</div>                                        <div class="featured__title">Microsoft Surface Pro 2025 2-In-1 Laptop/Tablet</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="c02ccfe2-cf6e-4135-bac3-4481bf25e13f">            <a href="https://www.amazon.com/Dell-XPS-13-9345-Fingerprint/dp/B0H3PG3HQK/ref=sr_1_1_sspa?crid=1XU476D5L7G8F&dib=eyJ2IjoiMSJ9.7Kxcnk0THEadWQbC6xL5C52acQcL_VUswQegCAvYraGFGqr_knE5yGY2vUFZNZy9TK6exMQIqdl62qU8Y74b1ylfQQICrjF9WIixK3DP7ntuD-XZUhXiC-tmWFMhlVEpaS4uoa1t5g1Km5REKvbyshWxlEUvNrVk-3uGMaLE6hbZOv6sjBZZMeTiqE4bgWXXPSCeMWzzGcsj9dvWgcfqvsjjcMdIEnvJ751gGplvEco.J1n4Gl55Ebrg7fVuUgFxirCI3El9Iv0py4kI8dliLEg&dib_tag=se&keywords=dell+xps+13&qid=1782913817&sprefix=dell+x%2Caps%2C237&sr=8-1-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1" data-model-name="Dell XPS 13 Laptop" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:74.20%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/5hcDNiF9TbyozLbdZ9iQ88.jpg" alt="Dell Xps 13 9345 Laptop, 13.4" 2k 120hz Business Laptop, Snapdragon X Elite 12-Core Ai Pc, 16gb Lpddr5x Ram, 1tb Ssd, Wi-Fi 7, Backlit, Fingerprint, Windows 11 Pro"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Dell</div>                                        <div class="featured__title">Dell XPS 13 Laptop</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/home/smart-home/ikeas-new-wireless-charger-looks-like-a-donut-and-costs-usd9-but-its-surprisingly-capable">IKEA's new wireless charger looks like a donut and costs $9, but it's surprisingly capable</a></li><li><a href="https://www.tomsguide.com/home/i-organize-my-home-with-these-ikea-storage-items-and-its-never-looked-better">I just upgraded my home with these 5 IKEA items</a></li><li><a href="https://www.tomsguide.com/home/how-to-paint-your-ikea-furniture-for-a-flawless-finish-decorating-experts-share-their-top-tips">How to paint your IKEA furniture for a flawless finish — decorating experts share their top tips</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Portable fans are this summer's must-have gadget, and here are 10 fans you can still buy ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/portable-fans-are-this-summers-must-have-gadget-and-here-are-the-fans-you-can-still-buy</link>
                                                                            <description>
                            <![CDATA[ Handheld fans are saving people from the sweltering heat right now, and these are the ones we recommend buying today. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">C2DtwHdCgvmmCsVvYA3N9S</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aNYcDXRpJEm5vzAqBGQAw4-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 25 Jun 2026 11:10:15 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&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/aNYcDXRpJEm5vzAqBGQAw4-1280-80.jpg">
                                                            <media:credit><![CDATA[Sony, Shark, Warmco, Geepas, Epicka, Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A collage of handheld fans on a blue background]]></media:description>                                                            <media:text><![CDATA[A collage of handheld fans on a blue background]]></media:text>
                                <media:title type="plain"><![CDATA[A collage of handheld fans on a blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aNYcDXRpJEm5vzAqBGQAw4-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>'Tis the season. No, not <em>that</em> season. I meant, 'tis the season for being absolutely sweltering, not getting any sleep, and being thoroughly unproductive. I live in the south west of England, and today it's going to hit 38 degrees. So, unsurprisingly, handheld fans are well and truly in.</p><p>As such, I've rounded up a few of my favourites here, in the likely scenario that you're searching for a new one. Happily, Amazon's <a href="https://www.tomsguide.com/live/news/savings-squad-prime-day-live-blog-amazon-best-buy-walmart">Prime Day deals</a> are helping out a little, with discounts on many fans at Amazon, although there are some deals at other retailers, like B&Q/DIY.</p><p>If you need a new fan, keep reading!</p><h2 class="article-body__section" id="section-9-portable-fan-deals-to-keep-you-cool-this-summer"><span>9 portable fan deals to keep you cool this summer</span></h2>        <div class="featured_product_block featured_block_horizontal" data-id="c85d7b16-ff85-499b-820f-4e53fe3ea8ee">            <a href="https://www.amazon.co.uk/REON-POCKET-Sensing-Wearable-Cooler/dp/B0CXCDZ1FW" data-model-name="Sony Reon Pocket 5" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/JUgqmqkTCXFhbJN7wsG2AX.jpg" alt="Sony Reon Pocket 5 Sensing Kit, Wearable Cooler, Neck Cooler, Wearable Warmer, Neck Heater, Neck Warmer, Thermal Device, Portable Air Conditioner, Personal Cooling Device"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>REON POCKET</div>                                        <div class="featured__title">Sony Reon Pocket 5</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>The REON Pocket is one of our favourite cooling products, which cools you down using its thermal plates. Attach it to your neck for full body cooling.</p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_horizontal" data-id="968d0903-24ba-4abe-bd47-3a2657e99ca4">            <a href="https://www.amazon.co.uk/Shark-High-Speed-Attachments-Travel-Friendly-FA022UKPK/dp/B0GKPQ4YC4/" data-model-name="Shark Chillpill 3-In-1" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/3XqXmiqLADEtj365eZ87cd.jpg" alt="Shark Chillpill 3-In-1 Personal High-Speed Fan, Ultra-Fine Mist and Instachill System, Includes 3 Cooling Attachments, Travel-Friendly Design, Dragon Fruit Fa022ukpk"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Shark</div>                                        <div class="featured__title">Shark Chillpill 3-In-1</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>Probably the most in-demand fan this season, the Chillpill is all over social. It combines a typical fan with a mist function and a cooling contact plate. It's expensive, but can you really put a price on staying comfortable?</p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_horizontal" data-id="d689d940-576b-4464-b70d-3cb6b5fe6662">            <a href="https://www.amazon.co.uk/Warmco-Portable-Personal-Adjustable-Hands-Free/dp/B0GS6NZPJB" data-model-name="Warmco Portable Neck Fan" 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/G86bA47Co4djTrVoczv3eS.jpg" alt="Warmco Portable Neck Fan, 5200mah Battery Powered Personal Fan With Led Display, Surround Cooling & 60° Adjustable Airflow, Strong Wind, Hands-Free Fan for Travel, Camping, Office"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Warmco</div>                                        <div class="featured__title">Warmco Portable Neck Fan</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>Warmco is hitting the Amazon sales hard this Prime Day, including this portable neck fan. Wear it around your neck for full body cooling, as you can pitch the fans up and down to cool your face and body.</p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_horizontal" data-id="7eb3a109-dd2d-4927-8e1a-9118b5d7c2af">            <a href="https://www.amazon.co.uk/Warmco-Portable-Handheld-Adjustable-Rechargeable/dp/B0F7KB3795/" data-model-name="Warmco Portable Handheld Fan" 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/5AnjM6wZsHXvXrJYSVCqBR.jpg" alt="Warmco Portable Handheld Fan 5000mah, 1-100 Speed Stepless Turbo Fan (15000 Rpm), Small Personal Mini Fan With Led Display, Usb Rechargeable for Travel, Commuting, Office, Makeup & Eyelash Dry"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Warmco</div>                                        <div class="featured__title">Warmco Portable Handheld Fan</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>I actually own this fan, and it's been a life-saver while I'm out and about, especially on trips. Its very powerful, but at its lower settings will last a good few hours (and still provide plenty of cooling).</p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_horizontal" data-id="869e5cfa-7d9f-40b0-9f28-1c95c477c84b">            <a href="https://www.amazon.co.uk/Portable-Handheld-Adjustable-Rechargeable-Essentials/dp/B0F6LLP9CR" data-model-name="Epicka Portable Handheld Fan" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/3B2GzQuVpCFy6MLBVdLhUS.jpg" alt="Epicka Portable Handheld Fan, Speed(1-100) Adjustable Turbo Mini Fan,6800mah Battery Rechargeable Foldable Fan With Cooling Plate,digital Display,summer Outdoor Travel Essentials for Women Men - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>EPICKA</div>                                        <div class="featured__title">Epicka Portable Handheld Fan</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>Another handheld turbo jet fan, this one has a useful folding battery compartment, allowing you to prop it up and use it as a mini desk fan.</p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_horizontal" data-id="730e4897-3ffc-4182-8077-bf1d8370ffb7">            <a href="https://www.amazon.co.uk/JISULIFE-Handheld-Powerbank-Rechargeable-Fan-White/dp/B09PDMZKQW" data-model-name="Jisulife Handheld Fan" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/2NLifEnwYzGkgB5KAvFjYW.jpg" alt="Jisulife Handheld Fan With 4500 Mah Powerbank Max 37 Hours Runtime, Personal Portable Fan Pocket Usb Powered Folding and Mini Rechargeable Quiet -White"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>JISULIFE</div>                                        <div class="featured__title">Jisulife Handheld Fan</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>A classic handheld fan — no frills but probably just enough chills. And for under £15, this is a cost-effective solution.</p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_horizontal" data-id="1714cf79-7867-4a87-8710-c1123b8be644">            <a href="https://www.amazon.co.uk/Warmco-10000mAh-Portable-Ultra-thin-Operated/dp/B0DNM5H1KP" data-model-name="Warmco 10000mah Portable Desk Fan" 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/CRs5dnY2d9X8QJeTkjf9ZQ.jpg" alt="Warmco 10000mah Portable Desk Fan 21cm, Up to 24h Runtime, Ultra-Slim Quiet Rechargeable Battery Operated Fan With Digital Display for Travel, Camping, Office, Bedroom, Cruise Essentials"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Warmco</div>                                        <div class="featured__title">Warmco 10000mah Portable Desk Fan</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>Speaking of mini desk fans, Warmco has another deal on this USB-C desk fan which will be perfect for keeping cool at your workstation.</p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_horizontal" data-id="0323c5f5-3f53-4a06-b1a9-481318e57a1f">            <a href="https://www.amazon.co.uk/Warmco-Control-Powered-Battery-Personal/dp/B0G4BVTN9J" data-model-name="Warmco Usb Desk Fan With Touch Control" 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/89oMnw4v5HcBLA397NJjrP.jpg" alt="Warmco Usb Desk Fan With Touch Control, (usb Powered Only, No Battery) Small Personal Desktop Fan, Usb-A & Usb-C Plug, 3 Speeds Strong Airflow, Quiet Table Fans for Home Office Dorm"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Warmco</div>                                        <div class="featured__title">Warmco Usb Desk Fan With Touch Control</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>Alternatively, if you're short on space or want something a little less (dare I say it) ugly than the fan above, there's also this sompact touch controlled Warmco fan on sale.</p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_horizontal" data-id="c6455eaf-f8d5-4c29-81eb-c889766464c6">            <a href="https://www.diy.com/departments/geepas-portable-neck-fan-3-speed-usb-charging-6hr-run-time-2000mah/6294015578065_BQ.prd" data-model-name="Neck fan" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/ue7A9gotTBLWi8rN7vRxxC.jpg" alt="Geepas neck fan white background"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Geepas</div>                                        <div class="featured__title">Neck fan</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>Another neck fan here, currently on sale at B&Q, it has three cooling modes and promises up to 6 hours of cooling.</p></p>                </div>                            </div>        </div><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-deals"><span>We're tracking all the best Prime Day deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=fans&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 { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            if (!this.processArticleFired) {                  this.processArticleFired = true;                  document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));               }            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I've vetted the best Prime Day deals on Reddit so you don't have to — here's what I found ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/ive-vetted-the-best-prime-day-deals-on-reddit-so-you-dont-have-to-heres-what-i-found</link>
                                                                            <description>
                            <![CDATA[ Reddit users are sharing the best deals from Amazon's Prime Day sales, and I went through the forums to find the best savings so you don't have to. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">noShrRoz4ZjJ8kD6VrLpG6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/vd7mTaNZ2pohgmeT6WBSa7-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 24 Jun 2026 16:38:27 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ ashley.thieme@futurenet.com (Ashley Thieme) ]]></author>                    <dc:creator><![CDATA[ Ashley Thieme ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3AWovHjApwuNrSGRS6WBcL.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Ashley Thieme is a staff writer on the Reviews team at Tom’s Guide where she tests out the latest tech so you can know what’s going to be worth your time and money. She has a master’s degree in Magazine Journalism and a bachelor’s degree in Journalism, Media and Sociology from Cardiff University. She has bylines in titles including Women’s Health UK, sharing the latest health and wellness news stories, and Virgin Radio UK, providing the latest entertainment news and working on celebrity interviews. She has experience reporting on a variety of topics including music, literature, motorsport, entertainment and health. In previously published work, she has reviewed live music events, books, and wellness products. She values the importance of tech enhancing your life rather than taking over, and as a music fanatic, she is always looking for the best way to listen to new music releases. Discovering the top audio equipment that enhances sound quality and provides optimum comfort is what Ashley does best. In her spare time, Ashley enjoys hitting her reading goals on Goodreads by getting into the latest novels with a cup of tea as well as getting out in the Welsh mountains for a good hike on the weekend.&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/vd7mTaNZ2pohgmeT6WBSa7-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Reddit app phone screen ]]></media:description>                                                            <media:text><![CDATA[Reddit app phone screen ]]></media:text>
                                <media:title type="plain"><![CDATA[Reddit app phone screen ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/vd7mTaNZ2pohgmeT6WBSa7-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/live/news/savings-squad-prime-day-live-blog-amazon-best-buy-walmart">Amazon Prime Day</a> is now in full swing, and the savings just keep coming, but how do you know which deals are worth your money? Well, here at Tom's Guide, we're keeping our eyes peeled and looking out for all of the best intel. That's right — we've been watching Reddit. </p><p>Reddit users are sharing their favorite finds from the money-saving event, and I've been checking them out to see which ones are the best to upgrade your life for less. I've checked out the best audio, home and Lego deals, and let's just say my wallet is about to get a little lighter. </p><p>Keep reading to find out more about the best picks of the day. </p><h2 class="article-body__section" id="section-today-s-best-reddit-audio-deals"><span>Today's best Reddit audio deals</span></h2><blockquote class="reddit-card"  ><a href="https://www.reddit.com/r/BestOfPrimeDay/comments/1uctbcx/best_prime_day_wireless_earbuds_deals_2026_at">Best Prime Day Wireless Earbuds Deals 2026 at Amazon - AirPods, Beats, Soundcore, JBL, Bose & Budget Picks</a> from <a href="https://www.reddit.com/r/BestOfPrimeDay">r/BestOfPrimeDay</a></blockquote><script async src="//embed.redditmedia.com/widgets/platform.js" charset="UTF-8"></script><div class="product"><a data-dimension112="40a006b6-29db-4316-95fc-492f1e6c6472" data-action="Deal Block" data-label="The AirPods 4 bring Apple's wireless earbuds lineup into the modern day with Pro-level features for less. While this version doesn't have ANC capabilities, the 23% price reduction means they cost just $99. While we wish the battery life was a bit better, they're some of the best buds you'll find for iPhone users who want easy pairing." data-dimension48="The AirPods 4 bring Apple's wireless earbuds lineup into the modern day with Pro-level features for less. While this version doesn't have ANC capabilities, the 23% price reduction means they cost just $99. While we wish the battery life was a bit better, they're some of the best buds you'll find for iPhone users who want easy pairing." data-dimension25="$99" href="https://www.amazon.com/Apple-Headphones-Cancellation-Transparency-Personalized/dp/B0DGHMNQ5Z" 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="GWRhkNS4V8dkrFRuFYdvoJ" name="apple-airpods-4-wireless-earbuds-bluetoo-96c54c83-43f1-41ec-ba21-95cf67a10abf.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GWRhkNS4V8dkrFRuFYdvoJ.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The AirPods 4 bring Apple's wireless earbuds lineup into the modern day with Pro-level features for less. While this version doesn't have ANC capabilities, the 23% price reduction means they cost just $99. While we wish the battery life was a bit better, they're some of the best buds you'll find for iPhone users who want easy pairing. <a class="view-deal button" href="https://www.amazon.com/Apple-Headphones-Cancellation-Transparency-Personalized/dp/B0DGHMNQ5Z" target="_blank" rel="nofollow" data-dimension112="40a006b6-29db-4316-95fc-492f1e6c6472" data-action="Deal Block" data-label="The AirPods 4 bring Apple's wireless earbuds lineup into the modern day with Pro-level features for less. While this version doesn't have ANC capabilities, the 23% price reduction means they cost just $99. While we wish the battery life was a bit better, they're some of the best buds you'll find for iPhone users who want easy pairing." data-dimension48="The AirPods 4 bring Apple's wireless earbuds lineup into the modern day with Pro-level features for less. While this version doesn't have ANC capabilities, the 23% price reduction means they cost just $99. While we wish the battery life was a bit better, they're some of the best buds you'll find for iPhone users who want easy pairing." data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="8b8ce07e-3d50-4879-923a-8417c6077514" data-action="Deal Block" data-label="The Beats Studio Buds+ have plenty going for them, and the iconic designs integrate enhanced ANC performance and longer battery life. At full price, these buds struggle to compete with their rivals, but with the price almost slashed in half, they become a no-brainer. These are the buds to get if you value ecosystem flexibility to switch from Apple to Android, and want something that can hold up during even the most intense workouts." data-dimension48="The Beats Studio Buds+ have plenty going for them, and the iconic designs integrate enhanced ANC performance and longer battery life. At full price, these buds struggle to compete with their rivals, but with the price almost slashed in half, they become a no-brainer. These are the buds to get if you value ecosystem flexibility to switch from Apple to Android, and want something that can hold up during even the most intense workouts." data-dimension25="$89" href="https://www.amazon.com/Beats-Cancelling-Compatibility-Microphone-Headphones/dp/B0C2W1KLSS" 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="YPdWR6mSuXt8GEVRHFeSAo" name="beats-studio-buds---true-wireless-noise--80b23ce5-ca30-44c9-834f-53e70ea0c6af.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YPdWR6mSuXt8GEVRHFeSAo.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Beats Studio Buds+ have plenty going for them, and the iconic designs integrate enhanced ANC performance and longer battery life. At full price, these buds struggle to compete with their rivals, but with the price almost slashed in half, they become a no-brainer. These are the buds to get if you value ecosystem flexibility to switch from Apple to Android, and want something that can hold up during even the most intense workouts. <a class="view-deal button" href="https://www.amazon.com/Beats-Cancelling-Compatibility-Microphone-Headphones/dp/B0C2W1KLSS" target="_blank" rel="nofollow" data-dimension112="8b8ce07e-3d50-4879-923a-8417c6077514" data-action="Deal Block" data-label="The Beats Studio Buds+ have plenty going for them, and the iconic designs integrate enhanced ANC performance and longer battery life. At full price, these buds struggle to compete with their rivals, but with the price almost slashed in half, they become a no-brainer. These are the buds to get if you value ecosystem flexibility to switch from Apple to Android, and want something that can hold up during even the most intense workouts." data-dimension48="The Beats Studio Buds+ have plenty going for them, and the iconic designs integrate enhanced ANC performance and longer battery life. At full price, these buds struggle to compete with their rivals, but with the price almost slashed in half, they become a no-brainer. These are the buds to get if you value ecosystem flexibility to switch from Apple to Android, and want something that can hold up during even the most intense workouts." data-dimension25="$89">View Deal</a></p></div><div class="product"><a data-dimension112="00a1905b-581c-483f-91b7-1b182da1ebfe" data-action="Deal Block" data-label="Bose’s QuietComfort Ultra Earbuds Gen 2 are the buds to purchase this Prime Day if your main concern when listening to music is ANC.  These are still quite the commitment even with the Prime Day deal, but we consider them to be some of the best ANC on the market and fully worth it." data-dimension48="Bose’s QuietComfort Ultra Earbuds Gen 2 are the buds to purchase this Prime Day if your main concern when listening to music is ANC.  These are still quite the commitment even with the Prime Day deal, but we consider them to be some of the best ANC on the market and fully worth it." data-dimension25="$249" href="https://www.amazon.com/Bose-New-QuietComfort-Ultra-Earbuds/dp/B0F7M3HPBD" 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="CSkdwQgxrnGXWNryun5dJU" name="bose-quietcomfort-ultra-earbuds-2nd-gen--5dc9d212-7aa7-4d9b-aec5-4a4ee2233b4f.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CSkdwQgxrnGXWNryun5dJU.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Bose’s QuietComfort Ultra Earbuds Gen 2 are the buds to purchase this Prime Day if your main concern when listening to music is ANC.  These are still quite the commitment even with the Prime Day deal, <em>but</em> we consider them to be some of the best ANC on the market and fully worth it. <a class="view-deal button" href="https://www.amazon.com/Bose-New-QuietComfort-Ultra-Earbuds/dp/B0F7M3HPBD" target="_blank" rel="nofollow" data-dimension112="00a1905b-581c-483f-91b7-1b182da1ebfe" data-action="Deal Block" data-label="Bose’s QuietComfort Ultra Earbuds Gen 2 are the buds to purchase this Prime Day if your main concern when listening to music is ANC.  These are still quite the commitment even with the Prime Day deal, but we consider them to be some of the best ANC on the market and fully worth it." data-dimension48="Bose’s QuietComfort Ultra Earbuds Gen 2 are the buds to purchase this Prime Day if your main concern when listening to music is ANC.  These are still quite the commitment even with the Prime Day deal, but we consider them to be some of the best ANC on the market and fully worth it." data-dimension25="$249">View Deal</a></p></div><h2 class="article-body__section" id="section-today-s-best-reddit-lego-deals"><span>Today's best Reddit Lego deals</span></h2><blockquote class="reddit-card"  ><a href="https://www.reddit.com/r/LegoDealFinder/comments/1udch48/best_amazon_prime_day_lego_deals_on_sets">Best Amazon Prime Day LEGO Deals on Sets</a> from <a href="https://www.reddit.com/r/LegoDealFinder">r/LegoDealFinder</a></blockquote><script async src="//embed.redditmedia.com/widgets/platform.js" charset="UTF-8"></script><div class="product"><a data-dimension112="41acf8e3-6fa3-4b0b-8311-eb154b23802a" data-action="Deal Block" data-label="Sadly, the full-size Millennium Falcon is not on sale this Amazon Prime Day, but you can pick up an Imperial Star Destroyer instead. This set is discounted by 30% and comes with mini figurines which include Darth Vader, Commander Praji, an Imperial Gunner, Imperial Navy Trooper, a Stormtrooper and a LEGO Star Wars 25th anniversary Cal Kestis. This 1,555-piece set is perfect for budding Lego fans who want to embrace their love of a galaxy far, far away." data-dimension48="Sadly, the full-size Millennium Falcon is not on sale this Amazon Prime Day, but you can pick up an Imperial Star Destroyer instead. This set is discounted by 30% and comes with mini figurines which include Darth Vader, Commander Praji, an Imperial Gunner, Imperial Navy Trooper, a Stormtrooper and a LEGO Star Wars 25th anniversary Cal Kestis. This 1,555-piece set is perfect for budding Lego fans who want to embrace their love of a galaxy far, far away." data-dimension25="$111" href="https://www.amazon.com/LEGO-Destroyer-Buildable-Anniversary-Minifigure/dp/B0CRWRY5RM" 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="AD9iX3AsuHiJQs9oHDQLBo" name="lego-star-wars-imperial-star-destroyer-b-17e64bbe-bccc-450c-9abd-1f82792720f2.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AD9iX3AsuHiJQs9oHDQLBo.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Sadly, the full-size Millennium Falcon is not on sale this Amazon Prime Day, but you can pick up an Imperial Star Destroyer instead. This set is discounted by 30% and comes with mini figurines which include Darth Vader, Commander Praji, an Imperial Gunner, Imperial Navy Trooper, a Stormtrooper and a LEGO Star Wars 25th anniversary Cal Kestis. This 1,555-piece set is perfect for budding Lego fans who want to embrace their love of a galaxy far, far away. <a class="view-deal button" href="https://www.amazon.com/LEGO-Destroyer-Buildable-Anniversary-Minifigure/dp/B0CRWRY5RM" target="_blank" rel="nofollow" data-dimension112="41acf8e3-6fa3-4b0b-8311-eb154b23802a" data-action="Deal Block" data-label="Sadly, the full-size Millennium Falcon is not on sale this Amazon Prime Day, but you can pick up an Imperial Star Destroyer instead. This set is discounted by 30% and comes with mini figurines which include Darth Vader, Commander Praji, an Imperial Gunner, Imperial Navy Trooper, a Stormtrooper and a LEGO Star Wars 25th anniversary Cal Kestis. This 1,555-piece set is perfect for budding Lego fans who want to embrace their love of a galaxy far, far away." data-dimension48="Sadly, the full-size Millennium Falcon is not on sale this Amazon Prime Day, but you can pick up an Imperial Star Destroyer instead. This set is discounted by 30% and comes with mini figurines which include Darth Vader, Commander Praji, an Imperial Gunner, Imperial Navy Trooper, a Stormtrooper and a LEGO Star Wars 25th anniversary Cal Kestis. This 1,555-piece set is perfect for budding Lego fans who want to embrace their love of a galaxy far, far away." data-dimension25="$111">View Deal</a></p></div><div class="product"><a data-dimension112="0f2e7068-d80c-4228-8998-715254160816" data-action="Deal Block" data-label="With the release of the new Spidey movie on the horizon, this Marvel Team Spidey Web Spinner Headquarters Building is the perfect way for young fans to embrace their inner friendly neighbourhood hero. The set includes minifigures of Spidey, Iron Man, Miles “Spin” Morales, Ghost-Spider and Zola. This is a great deal for anyone with kids who enjoy an interactive set." data-dimension48="With the release of the new Spidey movie on the horizon, this Marvel Team Spidey Web Spinner Headquarters Building is the perfect way for young fans to embrace their inner friendly neighbourhood hero. The set includes minifigures of Spidey, Iron Man, Miles “Spin” Morales, Ghost-Spider and Zola. This is a great deal for anyone with kids who enjoy an interactive set." data-dimension25="$37" href="https://www.amazon.com/LEGO-Spinner-Headquarters-Amazing-Spider-Man/dp/B0CGY4R22W" 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="CG3ViprJZvFXxCUNS59Yoa" name="lego-marvel-team-spidey-web-spinner-head-943ccfb8-4f6c-4b79-8061-ce62e84a49db.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CG3ViprJZvFXxCUNS59Yoa.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With the release of the new Spidey movie on the horizon, this Marvel Team Spidey Web Spinner Headquarters Building is the perfect way for young fans to embrace their inner friendly neighbourhood hero. The set includes minifigures of Spidey, Iron Man, Miles “Spin” Morales, Ghost-Spider and Zola. This is a great deal for anyone with kids who enjoy an interactive set. <a class="view-deal button" href="https://www.amazon.com/LEGO-Spinner-Headquarters-Amazing-Spider-Man/dp/B0CGY4R22W" target="_blank" rel="nofollow" data-dimension112="0f2e7068-d80c-4228-8998-715254160816" data-action="Deal Block" data-label="With the release of the new Spidey movie on the horizon, this Marvel Team Spidey Web Spinner Headquarters Building is the perfect way for young fans to embrace their inner friendly neighbourhood hero. The set includes minifigures of Spidey, Iron Man, Miles “Spin” Morales, Ghost-Spider and Zola. This is a great deal for anyone with kids who enjoy an interactive set." data-dimension48="With the release of the new Spidey movie on the horizon, this Marvel Team Spidey Web Spinner Headquarters Building is the perfect way for young fans to embrace their inner friendly neighbourhood hero. The set includes minifigures of Spidey, Iron Man, Miles “Spin” Morales, Ghost-Spider and Zola. This is a great deal for anyone with kids who enjoy an interactive set." data-dimension25="$37">View Deal</a></p></div><div class="product"><a data-dimension112="5f9c2a1f-1a03-4289-83ba-36bcb957456d" data-action="Deal Block" data-label="The Lego Creator 3-in-1 Forest Animals set is perfect for anyone who likes to get a bit more creative with their builds. This 667-piece set can be built into a red fox, owl, or red squirrel, expanding the creative possibilities. The animal figures are posable with moving paws and ears to bring the scene you create to life. The owl model can even turn its head 360º. There are also small accessories for each of the animals. The fox has a patch of snow, the squirrel has an acorn, and the owl has a tree to perch on. On the tree, the owl stands at 7 inches tall, making it a real statement decorative piece." data-dimension48="The Lego Creator 3-in-1 Forest Animals set is perfect for anyone who likes to get a bit more creative with their builds. This 667-piece set can be built into a red fox, owl, or red squirrel, expanding the creative possibilities. The animal figures are posable with moving paws and ears to bring the scene you create to life. The owl model can even turn its head 360º. There are also small accessories for each of the animals. The fox has a patch of snow, the squirrel has an acorn, and the owl has a tree to perch on. On the tree, the owl stands at 7 inches tall, making it a real statement decorative piece." data-dimension25="$34" href="https://www.amazon.com/LEGO-Creator-Forest-Animals-Transforms/dp/B0CGY3VF3K" 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="KiWLAevt2UVgSorpMgrxuW" name="lego-creator-3-in-1-forest-animals-red-f-8e7c91a1-8a9f-469d-b79b-de112b5e7a2f.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KiWLAevt2UVgSorpMgrxuW.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Lego Creator 3-in-1 Forest Animals set is perfect for anyone who likes to get a bit more creative with their builds. This 667-piece set can be built into a red fox, owl, or red squirrel, expanding the creative possibilities. The animal figures are posable with moving paws and ears to bring the scene you create to life. The owl model can even turn its head 360º. There are also small accessories for each of the animals. The fox has a patch of snow, the squirrel has an acorn, and the owl has a tree to perch on. On the tree, the owl stands at 7 inches tall, making it a real statement decorative piece.<a class="view-deal button" href="https://www.amazon.com/LEGO-Creator-Forest-Animals-Transforms/dp/B0CGY3VF3K" target="_blank" rel="nofollow" data-dimension112="5f9c2a1f-1a03-4289-83ba-36bcb957456d" data-action="Deal Block" data-label="The Lego Creator 3-in-1 Forest Animals set is perfect for anyone who likes to get a bit more creative with their builds. This 667-piece set can be built into a red fox, owl, or red squirrel, expanding the creative possibilities. The animal figures are posable with moving paws and ears to bring the scene you create to life. The owl model can even turn its head 360º. There are also small accessories for each of the animals. The fox has a patch of snow, the squirrel has an acorn, and the owl has a tree to perch on. On the tree, the owl stands at 7 inches tall, making it a real statement decorative piece." data-dimension48="The Lego Creator 3-in-1 Forest Animals set is perfect for anyone who likes to get a bit more creative with their builds. This 667-piece set can be built into a red fox, owl, or red squirrel, expanding the creative possibilities. The animal figures are posable with moving paws and ears to bring the scene you create to life. The owl model can even turn its head 360º. There are also small accessories for each of the animals. The fox has a patch of snow, the squirrel has an acorn, and the owl has a tree to perch on. On the tree, the owl stands at 7 inches tall, making it a real statement decorative piece." data-dimension25="$34">View Deal</a></p></div><h3 class="article-body__section" id="section-today-s-best-home-reddit-deals"><span>Today's best home Reddit deals</span></h3><blockquote class="reddit-card"  ><a href="https://www.reddit.com/r/smartbuysforlife/comments/1udydqj/buy_once_cry_once_i_sorted_60_prime_day_picks_by">Buy once, cry once - I sorted ~60 Prime Day picks by what's discounted right now so you don't have to</a> from <a href="https://www.reddit.com/r/smartbuysforlife">r/smartbuysforlife</a></blockquote><script async src="//embed.redditmedia.com/widgets/platform.js" charset="UTF-8"></script><div class="product"><a data-dimension112="f6f7e58e-118d-4245-9aeb-75c77143f430" data-action="Deal Block" data-label="The AeroPress is renowned in the coffee world for its unique flavor: strong and full-bodied yet incomprehensibly light and floral. There's seriously nothing like the AeroPress. It's easy to use, and is very portable given its light weight and compact design. It's a winner for anyone on the go who adores a fresh cup of Joe." data-dimension48="The AeroPress is renowned in the coffee world for its unique flavor: strong and full-bodied yet incomprehensibly light and floral. There's seriously nothing like the AeroPress. It's easy to use, and is very portable given its light weight and compact design. It's a winner for anyone on the go who adores a fresh cup of Joe." data-dimension25="$27" href="https://www.amazon.com/AeroPress-Original-Coffee-Press-Bitterness/dp/B0047BIWSK" 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="P9vigJjERVUDB5wmazjYp8" name="aeropress-original-coffee-press--allinon-9f5b7c0d-ed9e-4006-9131-21a2e7abcdc4.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/P9vigJjERVUDB5wmazjYp8.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The AeroPress is renowned in the coffee world for its unique flavor: strong and full-bodied yet incomprehensibly light and floral. There's seriously nothing like the AeroPress. It's easy to use, and is very portable given its light weight and compact design. It's a winner for anyone on the go who adores a fresh cup of Joe. <a class="view-deal button" href="https://www.amazon.com/AeroPress-Original-Coffee-Press-Bitterness/dp/B0047BIWSK" target="_blank" rel="nofollow" data-dimension112="f6f7e58e-118d-4245-9aeb-75c77143f430" data-action="Deal Block" data-label="The AeroPress is renowned in the coffee world for its unique flavor: strong and full-bodied yet incomprehensibly light and floral. There's seriously nothing like the AeroPress. It's easy to use, and is very portable given its light weight and compact design. It's a winner for anyone on the go who adores a fresh cup of Joe." data-dimension48="The AeroPress is renowned in the coffee world for its unique flavor: strong and full-bodied yet incomprehensibly light and floral. There's seriously nothing like the AeroPress. It's easy to use, and is very portable given its light weight and compact design. It's a winner for anyone on the go who adores a fresh cup of Joe." data-dimension25="$27">View Deal</a></p></div><div class="product"><a data-dimension112="9dc9a3ee-7fc4-48e0-ab0f-4332e1e12d8c" data-action="Deal Block" data-label="The Dyson V8 Cordless Vacuum can work on all floor types, and is designed for shoppers who want a cordless vacuuming experience but don't want to spend big bucks on a V15. The V8 is for the discerning vacuum user who wants some of the bells and whistles they just can't get in the lower-end models." data-dimension48="The Dyson V8 Cordless Vacuum can work on all floor types, and is designed for shoppers who want a cordless vacuuming experience but don't want to spend big bucks on a V15. The V8 is for the discerning vacuum user who wants some of the bells and whistles they just can't get in the lower-end models." data-dimension25="$269" href="https://www.amazon.com/Dyson-626423-01-V8TM-Cordless-Vacuum/dp/B0GT2DG9SK" 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="2qoM5k2dWYFkQ7mZwtMHo8" name="dyson-v8-cordless-vacuum-39f3c194-fcc6-484c-8b3e-d2d58c5b1e70.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2qoM5k2dWYFkQ7mZwtMHo8.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Dyson V8 Cordless Vacuum can work on all floor types, and is designed for shoppers who want a cordless vacuuming experience but don't want to spend big bucks on a V15. The V8 is for the discerning vacuum user who wants some of the bells and whistles they just can't get in the lower-end models.<a class="view-deal button" href="https://www.amazon.com/Dyson-626423-01-V8TM-Cordless-Vacuum/dp/B0GT2DG9SK" target="_blank" rel="nofollow" data-dimension112="9dc9a3ee-7fc4-48e0-ab0f-4332e1e12d8c" data-action="Deal Block" data-label="The Dyson V8 Cordless Vacuum can work on all floor types, and is designed for shoppers who want a cordless vacuuming experience but don't want to spend big bucks on a V15. The V8 is for the discerning vacuum user who wants some of the bells and whistles they just can't get in the lower-end models." data-dimension48="The Dyson V8 Cordless Vacuum can work on all floor types, and is designed for shoppers who want a cordless vacuuming experience but don't want to spend big bucks on a V15. The V8 is for the discerning vacuum user who wants some of the bells and whistles they just can't get in the lower-end models." data-dimension25="$269">View Deal</a></p></div><div class="product"><a data-dimension112="c8da1bae-6b92-4eed-a4da-e962b378d76e" data-action="Deal Block" data-label="The 5200 is an oldie but a goodie. It comes with variable speed control to hit a range of textures, from chopping to emulsifying, and you can easily switch it up with the control dial. It also has an immense 64-oz pitcher, meaning you can blend for a crowd." data-dimension48="The 5200 is an oldie but a goodie. It comes with variable speed control to hit a range of textures, from chopping to emulsifying, and you can easily switch it up with the control dial. It also has an immense 64-oz pitcher, meaning you can blend for a crowd." data-dimension25="$349" href="https://www.amazon.com/Vitamix-Blender-Professional-Grade-Container-Black/dp/B008H4SLV6" 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="yMpt2h34A2fLv6eHmKM6s8" name="vitamix-5200-blender-professionalgrade-b-ab8df9cb-1c26-4fd1-a13f-757d42fa458b.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yMpt2h34A2fLv6eHmKM6s8.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The 5200 is an oldie but a goodie. It comes with variable speed control to hit a range of textures, from chopping to emulsifying, and you can easily switch it up with the control dial. It also has an immense 64-oz pitcher, meaning you can blend for a crowd.<a class="view-deal button" href="https://www.amazon.com/Vitamix-Blender-Professional-Grade-Container-Black/dp/B008H4SLV6" target="_blank" rel="nofollow" data-dimension112="c8da1bae-6b92-4eed-a4da-e962b378d76e" data-action="Deal Block" data-label="The 5200 is an oldie but a goodie. It comes with variable speed control to hit a range of textures, from chopping to emulsifying, and you can easily switch it up with the control dial. It also has an immense 64-oz pitcher, meaning you can blend for a crowd." data-dimension48="The 5200 is an oldie but a goodie. It comes with variable speed control to hit a range of textures, from chopping to emulsifying, and you can easily switch it up with the control dial. It also has an immense 64-oz pitcher, meaning you can blend for a crowd." data-dimension25="$349">View Deal</a></p></div><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-deals"><span>We're tracking all the best Prime Day deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            if (!this.processArticleFired) {                  this.processArticleFired = true;                  document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));               }            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I've been building Lego sets for more than 40 years, and these are the 15 Prime Day Lego deals I'd get ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/ive-been-building-lego-sets-for-more-than-40-years-and-these-are-the-15-prime-day-lego-deals-id-get</link>
                                                                            <description>
                            <![CDATA[ I found 15 Prime Day Lego deals that I'd either buy for myself or for a kid's present. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">W4g2BhjRww6FDATbK4CsXR</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/V7a6i6JVFNubhCURXLqkRf-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 23 Jun 2026 15:14:24 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ mike.prospero@futurenet.com (Mike Prospero) ]]></author>                    <dc:creator><![CDATA[ Mike Prospero ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/6ZM8mX4UwccqDJTh9gLPqV.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Michael A. Prospero is the U.S. Editor-in-Chief for Tom’s Guide. He oversees all evergreen content and oversees the Homes, Smart Home, and Fitness/Wearables categories for the site. In his spare time, he also tests out the latest drones, electric scooters, and smart home gadgets, such as video doorbells. Before his tenure at Tom&#039;s Guide, he was the Reviews Editor for Laptop Magazine, a reporter at Fast Company, the Times of Trenton, and, many eons back, an intern at George magazine. He received his undergraduate degree from Boston College, where he worked on the campus newspaper The Heights, and then attended the Columbia University school of Journalism. When he’s not testing out the latest running watch, electric scooter, or skiing or training for a marathon, he’s probably using the latest sous vide machine, smoker, or pizza oven, to the delight — or chagrin — of his family.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/V7a6i6JVFNubhCURXLqkRf-1280-80.jpg">
                                                            <media:credit><![CDATA[Lego]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Lego R2-D2]]></media:description>                                                            <media:text><![CDATA[Lego R2-D2]]></media:text>
                                <media:title type="plain"><![CDATA[Lego R2-D2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/V7a6i6JVFNubhCURXLqkRf-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Yet another Prime Day has arrived, and with it come lots of sales on Lego sets, which makes it a good — not great — time to stock up. Sadly, some of the bigger sets, like the Star Wars UCS or the full-size F1 sets, aren't on sale, which will disappoint many AFOLs.</p><p>However, a lot of the less-expensive sets are discounted somewhat, so if you're planning ahead for a kid's birthday or some other event, now is a good time to look around. The Lego Speed Champions Ferrari SF-24 F1 set, which is now just <a href="https://www.amazon.com/LEGO-Speed-Champions-Ferrari-SF-24/dp/B0DHLHWZT7" target="_blank" rel="nofollow">$21 on Amazon</a>, is a great example.</p><p>I'm still combing through all of the Lego deals, so this is a list of 15 I like so far; I'm partial to a lot of Lego cars, which is why you'll see a lot of those deals in this roundup, as well as Star Wars-themed sets. But, we have a neat little deal finder at the bottom of the page, which scours the web for all the best Lego deals — and saves you the trouble of having to go to Amazon.</p><h3 class="article-body__section" id="section-cars"><span>Cars</span></h3><div class="product"><a data-dimension112="611137e6-0176-4d13-b69d-20d8b4a9278d" data-action="Deal Block" data-label="All of the Lego Speed Champions kits are on sale, but I've always been partial to Ferrari's livery, so I'm highlighting this model here." data-dimension48="All of the Lego Speed Champions kits are on sale, but I've always been partial to Ferrari's livery, so I'm highlighting this model here." data-dimension25="$21" href="https://www.amazon.com/LEGO-Speed-Champions-Ferrari-SF-24/dp/B0DHLHWZT7" 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.93%;"><img id="7QmgNiJrmVE7cXf5gdNace" name="81SIAvPac3L._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7QmgNiJrmVE7cXf5gdNace.jpg" mos="" align="middle" fullscreen="" width="1500" height="1499" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>All of the Lego Speed Champions kits are on sale, but I've always been partial to Ferrari's livery, so I'm highlighting this model here. <a class="view-deal button" href="https://www.amazon.com/LEGO-Speed-Champions-Ferrari-SF-24/dp/B0DHLHWZT7" target="_blank" rel="nofollow" data-dimension112="611137e6-0176-4d13-b69d-20d8b4a9278d" data-action="Deal Block" data-label="All of the Lego Speed Champions kits are on sale, but I've always been partial to Ferrari's livery, so I'm highlighting this model here." data-dimension48="All of the Lego Speed Champions kits are on sale, but I've always been partial to Ferrari's livery, so I'm highlighting this model here." data-dimension25="$21">View Deal</a></p></div><div class="product"><a data-dimension112="918babbf-1afb-469d-ad9b-5bfce576f91d" data-action="Deal Block" data-label="The full-size Ferrari models aren't on sale, but this smaller set is perfect for kids who want a taste of what's to come. This 837-piece kit has working butterfly doors, an opening hood, and an engine cover that opens." data-dimension48="The full-size Ferrari models aren't on sale, but this smaller set is perfect for kids who want a taste of what's to come. This 837-piece kit has working butterfly doors, an opening hood, and an engine cover that opens." data-dimension25="$51" href="https://www.amazon.com/LEGO-Technic-Ferrari-FXX-Kids/dp/B0DRW6KZKF/" 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="wmvTpMaaXxwG673dQej4YA" name="Technic Ferrari FXX K" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wmvTpMaaXxwG673dQej4YA.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The full-size Ferrari models aren't on sale, but this smaller set is perfect for kids who want a taste of what's to come. This 837-piece kit has working butterfly doors, an opening hood, and an engine cover that opens.<a class="view-deal button" href="https://www.amazon.com/LEGO-Technic-Ferrari-FXX-Kids/dp/B0DRW6KZKF/" target="_blank" rel="nofollow" data-dimension112="918babbf-1afb-469d-ad9b-5bfce576f91d" data-action="Deal Block" data-label="The full-size Ferrari models aren't on sale, but this smaller set is perfect for kids who want a taste of what's to come. This 837-piece kit has working butterfly doors, an opening hood, and an engine cover that opens." data-dimension48="The full-size Ferrari models aren't on sale, but this smaller set is perfect for kids who want a taste of what's to come. This 837-piece kit has working butterfly doors, an opening hood, and an engine cover that opens." data-dimension25="$51">View Deal</a></p></div><div class="product"><a data-dimension112="b742c078-e223-4ee1-bf2f-0236000e567e" data-action="Deal Block" data-label="Here's another offer for the Ferrari lover in your life. While an actual Ferrari F40 might set you back anywhere from two to four million dollars, this Lego replica will barely cost you more than a twenty-spot. And of course, it comes in the brand's legendary Racing Red color." data-dimension48="Here's another offer for the Ferrari lover in your life. While an actual Ferrari F40 might set you back anywhere from two to four million dollars, this Lego replica will barely cost you more than a twenty-spot. And of course, it comes in the brand's legendary Racing Red color." data-dimension25="$21" href="https://www.amazon.com/LEGO-Champions-Supercar-Minifigure-Collectible/dp/B0CV27Y7ZT/" 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="airedale-paZVr6QDcXdZSNayz9epo9-2" name="Speed Champions Ferrari F40.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4ARiJgCKn6ioEtWzm38SSg.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Here's another offer for the Ferrari lover in your life. While an actual Ferrari F40 might set you back anywhere from two to four million dollars, this Lego replica will barely cost you more than a twenty-spot. And of course, it comes in the brand's legendary Racing Red color. <a class="view-deal button" href="https://www.amazon.com/LEGO-Champions-Supercar-Minifigure-Collectible/dp/B0CV27Y7ZT/" target="_blank" rel="nofollow" data-dimension112="b742c078-e223-4ee1-bf2f-0236000e567e" data-action="Deal Block" data-label="Here's another offer for the Ferrari lover in your life. While an actual Ferrari F40 might set you back anywhere from two to four million dollars, this Lego replica will barely cost you more than a twenty-spot. And of course, it comes in the brand's legendary Racing Red color." data-dimension48="Here's another offer for the Ferrari lover in your life. While an actual Ferrari F40 might set you back anywhere from two to four million dollars, this Lego replica will barely cost you more than a twenty-spot. And of course, it comes in the brand's legendary Racing Red color." data-dimension25="$21">View Deal</a></p></div><div class="product"><a data-dimension112="a54484c7-5918-42a1-adcd-7d9a8f968625" data-action="Deal Block" data-label="This 1:12 scale model has a V6 engine with moving pistons, independent suspension on all wheels and front-axle steering." data-dimension48="This 1:12 scale model has a V6 engine with moving pistons, independent suspension on all wheels and front-axle steering." data-dimension25="$95" href="https://www.amazon.com/LEGO-Technic-42154-Model-Adults/dp/B0BLJ38RJR?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1462px;"><p class="vanilla-image-block" style="padding-top:102.60%;"><img id="btFYW2vtqgiqgoBUSEXrZU" name="Technic 2022 Ford GT" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/btFYW2vtqgiqgoBUSEXrZU.jpg" mos="" align="middle" fullscreen="" width="1462" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This 1:12 scale model has a V6 engine with moving pistons, independent suspension on all wheels and front-axle steering. <a class="view-deal button" href="https://www.amazon.com/LEGO-Technic-42154-Model-Adults/dp/B0BLJ38RJR?" target="_blank" rel="nofollow" data-dimension112="a54484c7-5918-42a1-adcd-7d9a8f968625" data-action="Deal Block" data-label="This 1:12 scale model has a V6 engine with moving pistons, independent suspension on all wheels and front-axle steering." data-dimension48="This 1:12 scale model has a V6 engine with moving pistons, independent suspension on all wheels and front-axle steering." data-dimension25="$95">View Deal</a></p></div><div class="product"><a data-dimension112="b18c2af2-9bea-48bc-b958-399d6e835c5d" data-action="Deal Block" data-label="The second movie in the "Fast &amp; Furious" saga may not have been the best (though certainly better than "Toyko Drift") but it did get us a look at the Skyline GT-R, one of the best cars from the whole series. And, this Lego set even lets you drift the car." data-dimension48="The second movie in the "Fast &amp; Furious" saga may not have been the best (though certainly better than "Toyko Drift") but it did get us a look at the Skyline GT-R, one of the best cars from the whole series. And, this Lego set even lets you drift the car." data-dimension25="$111" href="https://www.amazon.com/LEGO-Technic-Furious-Nissan-Skyline/dp/B0DRW6C13X" 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.60%;"><img id="7MsCDSeP5iP47FD8GzfLTF" name="Technic 2 Fast 2 Furious Nissan Skyline GT-R (R34)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7MsCDSeP5iP47FD8GzfLTF.jpg" mos="" align="middle" fullscreen="" width="1500" height="1494" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The second movie in the "Fast & Furious" saga may not have been the best (though certainly better than "Toyko Drift") but it did get us a look at the Skyline GT-R, one of the best cars from the whole series. And, this Lego set even lets you drift the car.<a class="view-deal button" href="https://www.amazon.com/LEGO-Technic-Furious-Nissan-Skyline/dp/B0DRW6C13X" target="_blank" rel="nofollow" data-dimension112="b18c2af2-9bea-48bc-b958-399d6e835c5d" data-action="Deal Block" data-label="The second movie in the "Fast &amp; Furious" saga may not have been the best (though certainly better than "Toyko Drift") but it did get us a look at the Skyline GT-R, one of the best cars from the whole series. And, this Lego set even lets you drift the car." data-dimension48="The second movie in the "Fast &amp; Furious" saga may not have been the best (though certainly better than "Toyko Drift") but it did get us a look at the Skyline GT-R, one of the best cars from the whole series. And, this Lego set even lets you drift the car." data-dimension25="$111">View Deal</a></p></div><div class="product"><a data-dimension112="1e961ccd-6d0c-4e47-8365-7b54c910b6d8" data-action="Deal Block" data-label="You built a time machine...out of Legos? This baby might not get up to 88 miles an hour, but lets you build three versions of the DeLorean — the original, the hover-conversion, and the 1955 model. And, it comes with Marty and Doc Brown minifigs." data-dimension48="You built a time machine...out of Legos? This baby might not get up to 88 miles an hour, but lets you build three versions of the DeLorean — the original, the hover-conversion, and the 1955 model. And, it comes with Marty and Doc Brown minifigs." data-dimension25="$159" href="https://www.amazon.com/LEGO-Future-Machine-Building-Detailed/dp/B09TBMHCXL" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1487px;"><p class="vanilla-image-block" style="padding-top:100.87%;"><img id="aEkuFQGWbe8HJCp22Tew8D" name="Icons Back to the Future Time Machine" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/aEkuFQGWbe8HJCp22Tew8D.jpg" mos="" align="middle" fullscreen="" width="1487" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>You built a time machine...out of Legos? This baby might not get up to 88 miles an hour, but lets you build three versions of the DeLorean — the original, the hover-conversion, and the 1955 model. And, it comes with Marty and Doc Brown minifigs.<a class="view-deal button" href="https://www.amazon.com/LEGO-Future-Machine-Building-Detailed/dp/B09TBMHCXL" target="_blank" rel="nofollow" data-dimension112="1e961ccd-6d0c-4e47-8365-7b54c910b6d8" data-action="Deal Block" data-label="You built a time machine...out of Legos? This baby might not get up to 88 miles an hour, but lets you build three versions of the DeLorean — the original, the hover-conversion, and the 1955 model. And, it comes with Marty and Doc Brown minifigs." data-dimension48="You built a time machine...out of Legos? This baby might not get up to 88 miles an hour, but lets you build three versions of the DeLorean — the original, the hover-conversion, and the 1955 model. And, it comes with Marty and Doc Brown minifigs." data-dimension25="$159">View Deal</a></p></div><div class="product"><a data-dimension112="94280c16-1d74-42af-bcc7-4d65bac04901" data-action="Deal Block" data-label="Autobots, roll out! Not only do you get to build an iconic 80s Transformer, but it actually transforms into the semi rig. This 15% off deal isn't huge, but it's better than nothing." data-dimension48="Autobots, roll out! Not only do you get to build an iconic 80s Transformer, but it actually transforms into the semi rig. This 15% off deal isn't huge, but it's better than nothing." data-dimension25="$152" href="https://www.amazon.com/LEGO-Optimus-Building-Collectible-Transformers/dp/B09XVH9ZWQ" 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="hBj2aUE4DPFqkEWJAVrdpY" name="Icons Optimus Prime" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hBj2aUE4DPFqkEWJAVrdpY.jpg" mos="" align="middle" fullscreen="" width="1488" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Autobots, roll out! Not only do you get to build an iconic 80s Transformer, but it actually transforms into the semi rig. This 15% off deal isn't huge, but it's better than nothing.<a class="view-deal button" href="https://www.amazon.com/LEGO-Optimus-Building-Collectible-Transformers/dp/B09XVH9ZWQ" target="_blank" rel="nofollow" data-dimension112="94280c16-1d74-42af-bcc7-4d65bac04901" data-action="Deal Block" data-label="Autobots, roll out! Not only do you get to build an iconic 80s Transformer, but it actually transforms into the semi rig. This 15% off deal isn't huge, but it's better than nothing." data-dimension48="Autobots, roll out! Not only do you get to build an iconic 80s Transformer, but it actually transforms into the semi rig. This 15% off deal isn't huge, but it's better than nothing." data-dimension25="$152">View Deal</a></p></div><div class="product"><a data-dimension112="ec4496bd-3650-494b-ad14-5dcf2ce13bfc" data-action="Deal Block" data-label="This model will have you ready to go offroading on safari. It comes with all sorts of gear, like shovels and gas cans, and you can even build it with the steering wheel on the left or the right, which will make it appeal to both UK and US builders." data-dimension48="This model will have you ready to go offroading on safari. It comes with all sorts of gear, like shovels and gas cans, and you can even build it with the steering wheel on the left or the right, which will make it appeal to both UK and US builders." data-dimension25="$167" href="https://www.amazon.com/LEGO-Defender-Building-Immersive-Graduation/dp/B0BSR933M2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1495px;"><p class="vanilla-image-block" style="padding-top:100.33%;"><img id="xHDTgvyxtKJth8RokWVcDY" name="Icons Land Rover Classic Defender 90" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xHDTgvyxtKJth8RokWVcDY.jpg" mos="" align="middle" fullscreen="" width="1495" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This model will have you ready to go offroading on safari. It comes with all sorts of gear, like shovels and gas cans, and you can even build it with the steering wheel on the left or the right, which will make it appeal to both UK and US builders.<a class="view-deal button" href="https://www.amazon.com/LEGO-Defender-Building-Immersive-Graduation/dp/B0BSR933M2" target="_blank" rel="nofollow" data-dimension112="ec4496bd-3650-494b-ad14-5dcf2ce13bfc" data-action="Deal Block" data-label="This model will have you ready to go offroading on safari. It comes with all sorts of gear, like shovels and gas cans, and you can even build it with the steering wheel on the left or the right, which will make it appeal to both UK and US builders." data-dimension48="This model will have you ready to go offroading on safari. It comes with all sorts of gear, like shovels and gas cans, and you can even build it with the steering wheel on the left or the right, which will make it appeal to both UK and US builders." data-dimension25="$167">View Deal</a></p></div><h3 class="article-body__section" id="section-star-wars"><span>Star Wars </span></h3><div class="product"><a data-dimension112="9732d18b-5dbd-48ab-9ade-d681a9a239e0" data-action="Deal Block" data-label="It's a shame that the U-Wing didn't make its appearance until "Rogue One," but I'm glad I got to see more of it in "Andor." This set comes with minifigs of Cassian Andor,  Dedra Meero, an ISB Tactical Agent, and K-2SO" data-dimension48="It's a shame that the U-Wing didn't make its appearance until "Rogue One," but I'm glad I got to see more of it in "Andor." This set comes with minifigs of Cassian Andor,  Dedra Meero, an ISB Tactical Agent, and K-2SO" data-dimension25="$55" href="https://www.amazon.com/LEGO-Rebel-U-Wing-Starfighter-Building/dp/B0DJ19GL96" 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.93%;"><img id="9JkFiPHWN44w5ExLD3UCXW" name="Star Wars Rebel U-Wing" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9JkFiPHWN44w5ExLD3UCXW.jpg" mos="" align="middle" fullscreen="" width="1500" height="1499" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>It's a shame that the U-Wing didn't make its appearance until "Rogue One," but I'm glad I got to see more of it in "Andor." This set comes with minifigs of Cassian Andor,  Dedra Meero, an ISB Tactical Agent, and K-2SO<a class="view-deal button" href="https://www.amazon.com/LEGO-Rebel-U-Wing-Starfighter-Building/dp/B0DJ19GL96" target="_blank" rel="nofollow" data-dimension112="9732d18b-5dbd-48ab-9ade-d681a9a239e0" data-action="Deal Block" data-label="It's a shame that the U-Wing didn't make its appearance until "Rogue One," but I'm glad I got to see more of it in "Andor." This set comes with minifigs of Cassian Andor,  Dedra Meero, an ISB Tactical Agent, and K-2SO" data-dimension48="It's a shame that the U-Wing didn't make its appearance until "Rogue One," but I'm glad I got to see more of it in "Andor." This set comes with minifigs of Cassian Andor,  Dedra Meero, an ISB Tactical Agent, and K-2SO" data-dimension25="$55">View Deal</a></p></div><div class="product"><a data-dimension112="7117ea89-1d59-49fe-bbcb-5b57ad552d1f" data-action="Deal Block" data-label="If you have to flee the Empire with stolen Death Star plans, the Tantive IV might not be the best option, but it will get you as far as Tattooine. This small model doesn't have any minifigs, but does come with a nice display stand." data-dimension48="If you have to flee the Empire with stolen Death Star plans, the Tantive IV might not be the best option, but it will get you as far as Tattooine. This small model doesn't have any minifigs, but does come with a nice display stand." data-dimension25="$62" href="https://www.amazon.com/LEGO-Star-Wars-Anniversary-Collectible/dp/B0CGYH4VG8/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1486px;"><p class="vanilla-image-block" style="padding-top:100.94%;"><img id="cUztFMVSHjHKaspJmuVshn" name="Star Wars: A New Hope Tantive IV" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/cUztFMVSHjHKaspJmuVshn.jpg" mos="" align="middle" fullscreen="" width="1486" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you have to flee the Empire with stolen Death Star plans, the Tantive IV might not be the best option, but it will get you as far as Tattooine. This small model doesn't have any minifigs, but does come with a nice display stand.<a class="view-deal button" href="https://www.amazon.com/LEGO-Star-Wars-Anniversary-Collectible/dp/B0CGYH4VG8/" target="_blank" rel="nofollow" data-dimension112="7117ea89-1d59-49fe-bbcb-5b57ad552d1f" data-action="Deal Block" data-label="If you have to flee the Empire with stolen Death Star plans, the Tantive IV might not be the best option, but it will get you as far as Tattooine. This small model doesn't have any minifigs, but does come with a nice display stand." data-dimension48="If you have to flee the Empire with stolen Death Star plans, the Tantive IV might not be the best option, but it will get you as far as Tattooine. This small model doesn't have any minifigs, but does come with a nice display stand." data-dimension25="$62">View Deal</a></p></div><div class="product"><a data-dimension112="559f11f8-05dc-4eec-9637-ae0b33268db6" data-action="Deal Block" data-label="As both a Star Wars nerd and Lego fan, owning a Millennium Falcon set always felt financially out of reach... until now. Discounted by a respectable 20%, the galaxy's arguably coolest ship can be yours for just $67, complete with a collectible display stand." data-dimension48="As both a Star Wars nerd and Lego fan, owning a Millennium Falcon set always felt financially out of reach... until now. Discounted by a respectable 20%, the galaxy's arguably coolest ship can be yours for just $67, complete with a collectible display stand." data-dimension25="$67" href="https://www.amazon.com/dp/B0CGY3ZB24" 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="airedale-paZVr6QDcXdZSNayz9epo9-9" name="Star Wars Millennium Falcon 25th Anniversary.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/TiqEWqmsWVDSpGynnhLCGE.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>As both a Star Wars nerd and Lego fan, owning a Millennium Falcon set always felt financially out of reach... until now. Discounted by a respectable 20%, the galaxy's arguably coolest ship can be yours for just $67, complete with a collectible display stand. <a class="view-deal button" href="https://www.amazon.com/dp/B0CGY3ZB24" target="_blank" rel="nofollow" data-dimension112="559f11f8-05dc-4eec-9637-ae0b33268db6" data-action="Deal Block" data-label="As both a Star Wars nerd and Lego fan, owning a Millennium Falcon set always felt financially out of reach... until now. Discounted by a respectable 20%, the galaxy's arguably coolest ship can be yours for just $67, complete with a collectible display stand." data-dimension48="As both a Star Wars nerd and Lego fan, owning a Millennium Falcon set always felt financially out of reach... until now. Discounted by a respectable 20%, the galaxy's arguably coolest ship can be yours for just $67, complete with a collectible display stand." data-dimension25="$67">View Deal</a></p></div><div class="product"><a data-dimension112="cc1d3a63-7ef4-4149-889b-93ad3aefbc2e" data-action="Deal Block" data-label="I realize this Star Wars Lego deal isn't exactly a barn burner, but that doesn't stop me from wanting to snag one for myself. Ultimately, Star Wars Legos don't often go on sale, especially cool Jedi starship sets like this. Either way, I'm hoping this one gets even cheaper as the Prime Day festivities roll on." data-dimension48="I realize this Star Wars Lego deal isn't exactly a barn burner, but that doesn't stop me from wanting to snag one for myself. Ultimately, Star Wars Legos don't often go on sale, especially cool Jedi starship sets like this. Either way, I'm hoping this one gets even cheaper as the Prime Day festivities roll on." data-dimension25="$27" href="https://www.amazon.com/LEGO-OBI-Wan-Kenobis-Starfighter-Building/dp/B09TC1BMBW/" 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="airedale-paZVr6QDcXdZSNayz9epo9-4" name="Star Wars OBI-Wan Kenobi's Jedi Starfighter.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PKpY6NsVDDhnfMVVQsF98Z.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>I realize this Star Wars Lego deal isn't exactly a barn burner, but that doesn't stop me from wanting to snag one for myself. Ultimately, Star Wars Legos don't often go on sale, especially cool Jedi starship sets like this. Either way, I'm hoping this one gets even cheaper as the Prime Day festivities roll on.<a class="view-deal button" href="https://www.amazon.com/LEGO-OBI-Wan-Kenobis-Starfighter-Building/dp/B09TC1BMBW/" target="_blank" rel="nofollow" data-dimension112="cc1d3a63-7ef4-4149-889b-93ad3aefbc2e" data-action="Deal Block" data-label="I realize this Star Wars Lego deal isn't exactly a barn burner, but that doesn't stop me from wanting to snag one for myself. Ultimately, Star Wars Legos don't often go on sale, especially cool Jedi starship sets like this. Either way, I'm hoping this one gets even cheaper as the Prime Day festivities roll on." data-dimension48="I realize this Star Wars Lego deal isn't exactly a barn burner, but that doesn't stop me from wanting to snag one for myself. Ultimately, Star Wars Legos don't often go on sale, especially cool Jedi starship sets like this. Either way, I'm hoping this one gets even cheaper as the Prime Day festivities roll on." data-dimension25="$27">View Deal</a></p></div><div class="product"><a data-dimension112="0792a99c-d5a9-4adf-9cf2-a03983306dc5" data-action="Deal Block" data-label="This deal shaves $20 off our favorite droid from the entire Star Wars saga. While it doesn't roll, it has a 360-degree rotating head, detachable third leg, an attachable periscope and removable tools." data-dimension48="This deal shaves $20 off our favorite droid from the entire Star Wars saga. While it doesn't roll, it has a 360-degree rotating head, detachable third leg, an attachable periscope and removable tools." data-dimension25="$79" href="https://www.amazon.com/LEGO-Star-Wars-R2-D2-Building/dp/B0CGY22J6Y" 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:98.13%;"><img id="ZfPjzWof5X9emR4b2ggr9P" name="Star Wars R2-D2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ZfPjzWof5X9emR4b2ggr9P.jpg" mos="" align="middle" fullscreen="" width="1500" height="1472" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This deal shaves $20 off our favorite droid from the entire Star Wars saga. While it doesn't roll, it has a 360-degree rotating head, detachable third leg, an attachable periscope and removable tools.<a class="view-deal button" href="https://www.amazon.com/LEGO-Star-Wars-R2-D2-Building/dp/B0CGY22J6Y" target="_blank" rel="nofollow" data-dimension112="0792a99c-d5a9-4adf-9cf2-a03983306dc5" data-action="Deal Block" data-label="This deal shaves $20 off our favorite droid from the entire Star Wars saga. While it doesn't roll, it has a 360-degree rotating head, detachable third leg, an attachable periscope and removable tools." data-dimension48="This deal shaves $20 off our favorite droid from the entire Star Wars saga. While it doesn't roll, it has a 360-degree rotating head, detachable third leg, an attachable periscope and removable tools." data-dimension25="$79">View Deal</a></p></div><h3 class="article-body__section" id="section-technics"><span>Technics</span></h3><div class="product"><a data-dimension112="d44a6c19-3b04-4682-b66d-9210998fff8a" data-action="Deal Block" data-label="Most of Lego's most expensive sets aren't yet on sale, but this massive crane is one exception. It's not cheap, but this Prime Day deal takes it down by 25%" data-dimension48="Most of Lego's most expensive sets aren't yet on sale, but this massive crane is one exception. It's not cheap, but this Prime Day deal takes it down by 25%" data-dimension25="$489" href="https://www.amazon.com/LEGO-Liebherr-Rewarding-Incredible-Including/dp/B0BSRFQLD6" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1496px;"><p class="vanilla-image-block" style="padding-top:100.27%;"><img id="FwdxnhcvMXQCo5WmWMucCH" name="Technic Liebherr Crawler Crane" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FwdxnhcvMXQCo5WmWMucCH.jpg" mos="" align="middle" fullscreen="" width="1496" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Most of Lego's most expensive sets aren't yet on sale, but this massive crane is one exception. It's not cheap, but this Prime Day deal takes it down by 25%<a class="view-deal button" href="https://www.amazon.com/LEGO-Liebherr-Rewarding-Incredible-Including/dp/B0BSRFQLD6" target="_blank" rel="nofollow" data-dimension112="d44a6c19-3b04-4682-b66d-9210998fff8a" data-action="Deal Block" data-label="Most of Lego's most expensive sets aren't yet on sale, but this massive crane is one exception. It's not cheap, but this Prime Day deal takes it down by 25%" data-dimension48="Most of Lego's most expensive sets aren't yet on sale, but this massive crane is one exception. It's not cheap, but this Prime Day deal takes it down by 25%" data-dimension25="$489">View Deal</a></p></div><div class="product"><a data-dimension112="e51608a5-6716-447c-b785-85a2900049e5" data-action="Deal Block" data-label="Looking for a challenge? Take the Lego Vincent Van Gogh three-dimensional Starry Night recreation for a spin. Currently on sale for 20% off, this kit includes a massive amount of bricks; more than 2,300!" data-dimension48="Looking for a challenge? Take the Lego Vincent Van Gogh three-dimensional Starry Night recreation for a spin. Currently on sale for 20% off, this kit includes a massive amount of bricks; more than 2,300!" data-dimension25="$136" href="https://www.amazon.com/dp/B09SM828FD?th=1" 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="airedale-paZVr6QDcXdZSNayz9epo9-10" name="Vincent Van Gogh The Starry Night.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2jUck8z2UJDh3DqoNZCxH8.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Looking for a challenge? Take the Lego Vincent Van Gogh three-dimensional Starry Night recreation for a spin. Currently on sale for 20% off, this kit includes a massive amount of bricks; more than 2,300! <a class="view-deal button" href="https://www.amazon.com/dp/B09SM828FD?th=1" target="_blank" rel="nofollow" data-dimension112="e51608a5-6716-447c-b785-85a2900049e5" data-action="Deal Block" data-label="Looking for a challenge? Take the Lego Vincent Van Gogh three-dimensional Starry Night recreation for a spin. Currently on sale for 20% off, this kit includes a massive amount of bricks; more than 2,300!" data-dimension48="Looking for a challenge? Take the Lego Vincent Van Gogh three-dimensional Starry Night recreation for a spin. Currently on sale for 20% off, this kit includes a massive amount of bricks; more than 2,300!" data-dimension25="$136">View Deal</a></p></div><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Construction+Toys&min_discount_ratio=0.95&offer_type=all&view_mode=carousel&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=light_blue" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            if (!this.processArticleFired) {                  this.processArticleFired = true;                  document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));               }            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Who needs A/C anyway? 7 heatwave essentials I'm relying on right now ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/who-needs-a-c-anyway-heatwave-essentials-im-relying-on-right-now</link>
                                                                            <description>
                            <![CDATA[ How a tech tester stays cool in 39C. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">rF8GEgEuWMPwJPCYMCbM3T</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/8yUAsJSJPjW4wRxAxWyv5X-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 22 Jun 2026 11:02:15 +0000</pubDate>                                                                                                                                <updated>Mon, 22 Jun 2026 11:27:45 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&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/8yUAsJSJPjW4wRxAxWyv5X-1280-80.jpg">
                                                            <media:credit><![CDATA[Peter Wolinski / Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A Warmco portable handheld fan in hand with green foliage in the background]]></media:description>                                                            <media:text><![CDATA[A Warmco portable handheld fan in hand with green foliage in the background]]></media:text>
                                <media:title type="plain"><![CDATA[A Warmco portable handheld fan in hand with green foliage in the background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/8yUAsJSJPjW4wRxAxWyv5X-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It's 10:30 on Monday as I write this, and it's already a crazy week, isn't it? The PM is headed off (again), and the Met Office app is already telling me we're in the late 20s celsius. </p><p>And it's only going to get worse. Where I am, near Bath Spa, it's forecast to hit 39C on Wednesday, with much of England's south in the same position.</p><p>Thankfully, I've got a few tricks up my sleeve. I'm the Senior Reviews Editor here at Tom's Guide, which means I get access to my fair share of tech. Ever since May, I've been calling in and testing products ready for the summer heat.</p><p>I'm not going to say I'm as cool as I'd like to be, but I'm certainly a lot more comfortable with this gear than without. And as a bonus, some of it is on sale for the <a href="https://www.tomsguide.com/uk/news/best-prime-day-deals-and-sales">Prime Day deals</a>. Here's my essential heatwave tech. </p><h2 id="beat-the-heat-my-essential-heatwave-gear">Beat the heat: My essential heatwave gear</h2><div class="product"><a data-dimension112="50d1b703-20ce-4241-adf2-1bc5e86d2497" data-action="Deal Block" data-label="Let's start with the obvious: a fan! I bought this handheld Warmco fan a few weeks back to keep me cool during a humid press trip to Vienna. And it hasn't left my bag since. It's powerful, and on the lower settings (which still give plenty of cooling), it lasts for hours. It's now seeing me through a second heatwave, in addition to the Austria trip and a late May camping trip in mid-20s heat. It's a cheap alternative to the Shark ChillPill 3-in-1, although lacks the Shark's misting function." data-dimension48="Let's start with the obvious: a fan! I bought this handheld Warmco fan a few weeks back to keep me cool during a humid press trip to Vienna. And it hasn't left my bag since. It's powerful, and on the lower settings (which still give plenty of cooling), it lasts for hours. It's now seeing me through a second heatwave, in addition to the Austria trip and a late May camping trip in mid-20s heat. It's a cheap alternative to the Shark ChillPill 3-in-1, although lacks the Shark's misting function." data-dimension25="£29.98" href="https://www.amazon.co.uk/Warmco-Portable-Handheld-Adjustable-Rechargeable/dp/B0F7KB3795" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1004px;"><p class="vanilla-image-block" style="padding-top:121.31%;"><img id="4hL6SWWidtvtFAt3VPWhDf" name="Warmco Mini Turbo Handheld fan" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4hL6SWWidtvtFAt3VPWhDf.jpg" mos="" align="middle" fullscreen="" width="1004" height="1218" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Let's start with the obvious: a fan! I bought this handheld Warmco fan a few weeks back to keep me cool during a humid press trip to Vienna. And it hasn't left my bag since. It's powerful, and on the lower settings (which still give plenty of cooling), it lasts for hours. It's now seeing me through a second heatwave, in addition to the Austria trip and a late May camping trip in mid-20s heat. It's a cheap alternative to the Shark ChillPill 3-in-1, although lacks the Shark's misting function. <a class="view-deal button" href="https://www.amazon.co.uk/Warmco-Portable-Handheld-Adjustable-Rechargeable/dp/B0F7KB3795" target="_blank" rel="nofollow" data-dimension112="50d1b703-20ce-4241-adf2-1bc5e86d2497" data-action="Deal Block" data-label="Let's start with the obvious: a fan! I bought this handheld Warmco fan a few weeks back to keep me cool during a humid press trip to Vienna. And it hasn't left my bag since. It's powerful, and on the lower settings (which still give plenty of cooling), it lasts for hours. It's now seeing me through a second heatwave, in addition to the Austria trip and a late May camping trip in mid-20s heat. It's a cheap alternative to the Shark ChillPill 3-in-1, although lacks the Shark's misting function." data-dimension48="Let's start with the obvious: a fan! I bought this handheld Warmco fan a few weeks back to keep me cool during a humid press trip to Vienna. And it hasn't left my bag since. It's powerful, and on the lower settings (which still give plenty of cooling), it lasts for hours. It's now seeing me through a second heatwave, in addition to the Austria trip and a late May camping trip in mid-20s heat. It's a cheap alternative to the Shark ChillPill 3-in-1, although lacks the Shark's misting function." data-dimension25="£29.98">View Deal</a></p></div><div class="product"><a data-dimension112="427d475a-663a-4f23-9c2c-3a6cd199c97b" data-action="Deal Block" data-label="Dyson Purifier Cool PC3" data-dimension48="Dyson Purifier Cool PC3" data-dimension25="£449" href="https://www.dyson.co.uk/air-treatment/purifiers/purifier-cool-pc2/de-nox-white-gold" 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="SKyi23fBfcUUzUYamXptpm" name="Dyson PC2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SKyi23fBfcUUzUYamXptpm.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Yep... another fan. But a much bigger one this time. I've been testing two <a href="https://www.tomsguide.com/home/home-appliances/dyson-find-follow-purifier-cool-pc3-review" data-dimension112="427d475a-663a-4f23-9c2c-3a6cd199c97b" data-action="Deal Block" data-label="Dyson Purifier Cool PC3" data-dimension48="Dyson Purifier Cool PC3" data-dimension25="£449">Dyson Purifier Cool PC3</a> fans since our last heatwave a few weeks back, and these things are life-savers. The PC2 is essentially the same as the newer PC3, but cheaper, as it lacks the PC3's automatic human detection / tracking mode (which isn't that good anyway). What I love about the Dyson PC range is that they're fans and purifiers. That means if you have your windows open to let a breeze in, it'll also clean the air of pollen, dust and nasty road emissions.<a class="view-deal button" href="https://www.dyson.co.uk/air-treatment/purifiers/purifier-cool-pc2/de-nox-white-gold" target="_blank" rel="nofollow" data-dimension112="427d475a-663a-4f23-9c2c-3a6cd199c97b" data-action="Deal Block" data-label="Dyson Purifier Cool PC3" data-dimension48="Dyson Purifier Cool PC3" data-dimension25="£449">View Deal</a></p></div><div class="product"><a data-dimension112="b439de8e-8d6c-4839-baed-1581c228c656" data-action="Deal Block" data-label="Sony REON Pocket Pro Plus" data-dimension48="Sony REON Pocket Pro Plus" data-dimension25="£139" href="https://www.amazon.co.uk/REON-POCKET-Sensing-Wearable-Cooler/dp/B0CXCDZ1FW" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:300px;"><p class="vanilla-image-block" style="padding-top:88.00%;"><img id="FfS3JcFkD46HQTwH6krz3B" name="Sony REON Pocket 5" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FfS3JcFkD46HQTwH6krz3B.jpg" mos="" align="middle" fullscreen="" width="300" height="264" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Another personal cooling device, the Sony REON goes about things a little differently. Instead of blowing air at you, it sits on the back of your neck (or wherever you want to place it) and cools down your whole body. We recently tested the <a href="https://www.tomsguide.com/home/reon-pocket-pro-plus-review" data-dimension112="b439de8e-8d6c-4839-baed-1581c228c656" data-action="Deal Block" data-label="Sony REON Pocket Pro Plus" data-dimension48="Sony REON Pocket Pro Plus" data-dimension25="£139">Sony REON Pocket Pro Plus</a> and awarded our Editor's Choice badge — these things are seriously good.<a class="view-deal button" href="https://www.amazon.co.uk/REON-POCKET-Sensing-Wearable-Cooler/dp/B0CXCDZ1FW" target="_blank" rel="nofollow" data-dimension112="b439de8e-8d6c-4839-baed-1581c228c656" data-action="Deal Block" data-label="Sony REON Pocket Pro Plus" data-dimension48="Sony REON Pocket Pro Plus" data-dimension25="£139">View Deal</a></p></div><div class="product"><a data-dimension112="64ceaca6-4ea6-4af9-97d9-14b72b003625" data-action="Deal Block" data-label="If you aren't doing this hack already, you need to be. I may have access to loads of high-end gadgets, but sometimes the low-tech solutions are the best. Putting ice in front of a fan cools down the air it pushes through, creating a jerry-rigged AC system. It doesn't have to be complicated: you can simply use a bowl of ice if you like, but I prefer to use large, re-freezable ice packs like these. For under £6, this is a cheap, simple and reusable way to increase your fan's performance." data-dimension48="If you aren't doing this hack already, you need to be. I may have access to loads of high-end gadgets, but sometimes the low-tech solutions are the best. Putting ice in front of a fan cools down the air it pushes through, creating a jerry-rigged AC system. It doesn't have to be complicated: you can simply use a bowl of ice if you like, but I prefer to use large, re-freezable ice packs like these. For under £6, this is a cheap, simple and reusable way to increase your fan's performance." data-dimension25="£5.99" href="https://www.amazon.co.uk/KEPLIN-Freezer-Family-Blocks-17x10x2cm/dp/B07CHWHPR4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:256px;"><p class="vanilla-image-block" style="padding-top:117.19%;"><img id="hNhSXxZHgCJEWTJSBMVEZZ" name="Kelpin Freezer Blocks" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hNhSXxZHgCJEWTJSBMVEZZ.jpg" mos="" align="middle" fullscreen="" width="256" height="300" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you aren't doing this hack already, you need to be. I may have access to loads of high-end gadgets, but sometimes the low-tech solutions are the best. Putting ice in front of a fan cools down the air it pushes through, creating a jerry-rigged AC system. It doesn't have to be complicated: you can simply use a bowl of ice if you like, but I prefer to use large, re-freezable ice packs like these. For under £6, this is a cheap, simple and reusable way to increase your fan's performance.<a class="view-deal button" href="https://www.amazon.co.uk/KEPLIN-Freezer-Family-Blocks-17x10x2cm/dp/B07CHWHPR4" target="_blank" rel="nofollow" data-dimension112="64ceaca6-4ea6-4af9-97d9-14b72b003625" data-action="Deal Block" data-label="If you aren't doing this hack already, you need to be. I may have access to loads of high-end gadgets, but sometimes the low-tech solutions are the best. Putting ice in front of a fan cools down the air it pushes through, creating a jerry-rigged AC system. It doesn't have to be complicated: you can simply use a bowl of ice if you like, but I prefer to use large, re-freezable ice packs like these. For under £6, this is a cheap, simple and reusable way to increase your fan's performance." data-dimension48="If you aren't doing this hack already, you need to be. I may have access to loads of high-end gadgets, but sometimes the low-tech solutions are the best. Putting ice in front of a fan cools down the air it pushes through, creating a jerry-rigged AC system. It doesn't have to be complicated: you can simply use a bowl of ice if you like, but I prefer to use large, re-freezable ice packs like these. For under £6, this is a cheap, simple and reusable way to increase your fan's performance." data-dimension25="£5.99">View Deal</a></p></div><div class="product"><a data-dimension112="bca5131b-6f87-471b-9561-62f73ca13946" data-action="Deal Block" data-label=""How is a pizza oven going to help me beat the heat?" Just... hear me out. I've been rinsing the pizzas for the last few weeks, in large part because cooking in my kitchen is absolutely dire in this heat. The Ooni needs to be run outside, and cooking outside stops your kitchen and house being heated up by the oven, hob or air fryer. Oh, and the Karu 2 is an awesome, affordable little oven which heats up quickly, can use various fuels, and cooks pro-quality pizzas in as little as 90 seconds. Dine al fresco." data-dimension48=""How is a pizza oven going to help me beat the heat?" Just... hear me out. I've been rinsing the pizzas for the last few weeks, in large part because cooking in my kitchen is absolutely dire in this heat. The Ooni needs to be run outside, and cooking outside stops your kitchen and house being heated up by the oven, hob or air fryer. Oh, and the Karu 2 is an awesome, affordable little oven which heats up quickly, can use various fuels, and cooks pro-quality pizzas in as little as 90 seconds. Dine al fresco." data-dimension25="£383.2" href="https://www.amazon.co.uk/Ooni-Karu-Pizza-Essentials-Bundle/dp/B0H4RPXNWC/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1400px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="ZWXfKDKexA6grx2C7HXLoN" name="Ooni Karu 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ZWXfKDKexA6grx2C7HXLoN.jpg" mos="" align="middle" fullscreen="" width="1400" height="1400" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>"How is a pizza oven going to help me beat the heat?" Just... hear me out. I've been rinsing the pizzas for the last few weeks, in large part because cooking in my kitchen is absolutely dire in this heat. The Ooni needs to be run outside, and cooking outside stops your kitchen and house being heated up by the oven, hob or air fryer. Oh, and the Karu 2 is an awesome, affordable little oven which heats up quickly, can use various fuels, and cooks pro-quality pizzas in as little as 90 seconds. Dine al fresco.<a class="view-deal button" href="https://www.amazon.co.uk/Ooni-Karu-Pizza-Essentials-Bundle/dp/B0H4RPXNWC/" target="_blank" rel="nofollow" data-dimension112="bca5131b-6f87-471b-9561-62f73ca13946" data-action="Deal Block" data-label=""How is a pizza oven going to help me beat the heat?" Just... hear me out. I've been rinsing the pizzas for the last few weeks, in large part because cooking in my kitchen is absolutely dire in this heat. The Ooni needs to be run outside, and cooking outside stops your kitchen and house being heated up by the oven, hob or air fryer. Oh, and the Karu 2 is an awesome, affordable little oven which heats up quickly, can use various fuels, and cooks pro-quality pizzas in as little as 90 seconds. Dine al fresco." data-dimension48=""How is a pizza oven going to help me beat the heat?" Just... hear me out. I've been rinsing the pizzas for the last few weeks, in large part because cooking in my kitchen is absolutely dire in this heat. The Ooni needs to be run outside, and cooking outside stops your kitchen and house being heated up by the oven, hob or air fryer. Oh, and the Karu 2 is an awesome, affordable little oven which heats up quickly, can use various fuels, and cooks pro-quality pizzas in as little as 90 seconds. Dine al fresco." data-dimension25="£383.2">View Deal</a></p></div><div class="product"><a data-dimension112="90ef7b34-8055-4d69-a911-ce28ea2f41de" data-action="Deal Block" data-label="No parasol? No problem. A camping tarp is a great budget alternative. I bought one like this Wadeo heavy duty tarpaulin, initially for camping, but I've put it up in my garden for the coming week to provide some more shade for my family and dogs." data-dimension48="No parasol? No problem. A camping tarp is a great budget alternative. I bought one like this Wadeo heavy duty tarpaulin, initially for camping, but I've put it up in my garden for the coming week to provide some more shade for my family and dogs." data-dimension25="£46.99" href="https://www.amazon.co.uk/WADEO-Camping-Waterproof-Heavy-Duty-Hammock/dp/B0BLMJLMPR" 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:92.20%;"><img id="F9Xb5pu5sbgPvNVubsDvdi" name="WADEO Camping Tarp Shelter" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/F9Xb5pu5sbgPvNVubsDvdi.jpg" mos="" align="middle" fullscreen="" width="1500" height="1383" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>No parasol? No problem. A camping tarp is a great budget alternative. I bought one like this Wadeo heavy duty tarpaulin, initially for camping, but I've put it up in my garden for the coming week to provide some more shade for my family and dogs. <a class="view-deal button" href="https://www.amazon.co.uk/WADEO-Camping-Waterproof-Heavy-Duty-Hammock/dp/B0BLMJLMPR" target="_blank" rel="nofollow" data-dimension112="90ef7b34-8055-4d69-a911-ce28ea2f41de" data-action="Deal Block" data-label="No parasol? No problem. A camping tarp is a great budget alternative. I bought one like this Wadeo heavy duty tarpaulin, initially for camping, but I've put it up in my garden for the coming week to provide some more shade for my family and dogs." data-dimension48="No parasol? No problem. A camping tarp is a great budget alternative. I bought one like this Wadeo heavy duty tarpaulin, initially for camping, but I've put it up in my garden for the coming week to provide some more shade for my family and dogs." data-dimension25="£46.99">View Deal</a></p></div><div class="product"><a data-dimension112="78ae8918-6a93-4837-bc3c-078016ef9fd4" data-action="Deal Block" data-label="If, like me, you've got pets, you'll know that the severe heat brings an extra stressor: keeping your animals comfortable and safe from the heat. I have two large ex-racing greyhounds, who really struggle in the heat (especially at night). We use two large cooling pads, which are very effective. You can put them underneath a thin blanket if your pet isn't liking the look of the mat, and they'll still benefit from the cooling effect. Our dogs actually get a little chilly on these during the night, and go back to their fluffy warm beds in the early hours!" data-dimension48="If, like me, you've got pets, you'll know that the severe heat brings an extra stressor: keeping your animals comfortable and safe from the heat. I have two large ex-racing greyhounds, who really struggle in the heat (especially at night). We use two large cooling pads, which are very effective. You can put them underneath a thin blanket if your pet isn't liking the look of the mat, and they'll still benefit from the cooling effect. Our dogs actually get a little chilly on these during the night, and go back to their fluffy warm beds in the early hours!" data-dimension25="£39.09" href="https://www.amazon.co.uk/Pecute-Cooling-Summer-Durable-Non-Toxic/dp/B08M478X8C" 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:49.40%;"><img id="Y3J4y2vtb5QJU3vSGwpr3J" name="Pecute pet cooling mat" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Y3J4y2vtb5QJU3vSGwpr3J.jpg" mos="" align="middle" fullscreen="" width="1500" height="741" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If, like me, you've got pets, you'll know that the severe heat brings an extra stressor: keeping your animals comfortable and safe from the heat. I have two large ex-racing greyhounds, who really struggle in the heat (especially at night). We use two large cooling pads, which are very effective. You can put them underneath a thin blanket if your pet isn't liking the look of the mat, and they'll still benefit from the cooling effect. Our dogs actually get a little chilly on these during the night, and go back to their fluffy warm beds in the early hours!<a class="view-deal button" href="https://www.amazon.co.uk/Pecute-Cooling-Summer-Durable-Non-Toxic/dp/B08M478X8C" target="_blank" rel="nofollow" data-dimension112="78ae8918-6a93-4837-bc3c-078016ef9fd4" data-action="Deal Block" data-label="If, like me, you've got pets, you'll know that the severe heat brings an extra stressor: keeping your animals comfortable and safe from the heat. I have two large ex-racing greyhounds, who really struggle in the heat (especially at night). We use two large cooling pads, which are very effective. You can put them underneath a thin blanket if your pet isn't liking the look of the mat, and they'll still benefit from the cooling effect. Our dogs actually get a little chilly on these during the night, and go back to their fluffy warm beds in the early hours!" data-dimension48="If, like me, you've got pets, you'll know that the severe heat brings an extra stressor: keeping your animals comfortable and safe from the heat. I have two large ex-racing greyhounds, who really struggle in the heat (especially at night). We use two large cooling pads, which are very effective. You can put them underneath a thin blanket if your pet isn't liking the look of the mat, and they'll still benefit from the cooling effect. Our dogs actually get a little chilly on these during the night, and go back to their fluffy warm beds in the early hours!" data-dimension25="£39.09">View Deal</a></p></div><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-deals"><span>We're tracking all the best Prime Day deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&min_discount_ratio=0.95&offer_type=all&view_mode=carousel&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=light_blue" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right {      right: 0;      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>\n        \x3C/div>\n      \x3C/div>\n    \x3C/div>          \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                if(!r) return;                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const encodedTag = encodeURIComponent(this.activeDealTag.toLowerCase().replace(/\s+/g, '-'));             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map(v => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              return `                \x3Ca href="${this.escapeHTML(linkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item">                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let existingChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             if (this.getViewMode() === 'carousel') {                 if (!existingChevron) {                     gridWrapper.insertAdjacentHTML('beforeend', '\n                 \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: \'smooth\'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>');                 }             } else {                 if (existingChevron) {                     existingChevron.remove();                 }             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Tom's Guide AI Awards 2026: 20 gadgets and tools shaping our future ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/ai/toms-guide-ai-awards-2026</link>
                                                                            <description>
                            <![CDATA[ The Tom’s Guide AI Awards 2026 recognize the standout tools and gadgets that moved beyond the hype to deliver a genuine taste of the future. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">XmzqFRk3ydoCucoEkH57pn</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/wpZWSEMKLcJxvFB68NHrG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 08 May 2026 11:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 14 May 2026 15:03:13 +0000</updated>
                                                                                                                                            <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                        <dc:contributor><![CDATA[ Tom&#039;s Guide Staff ]]></dc:contributor>
                                                                    <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/wpZWSEMKLcJxvFB68NHrG-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide/Samsung]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A collage of four images showing off AI gadgets with a Tom&#039;s Guide AI Awards 2026 badge in the middle]]></media:description>                                                            <media:text><![CDATA[A collage of four images showing off AI gadgets with a Tom&#039;s Guide AI Awards 2026 badge in the middle]]></media:text>
                                <media:title type="plain"><![CDATA[A collage of four images showing off AI gadgets with a Tom&#039;s Guide AI Awards 2026 badge in the middle]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/wpZWSEMKLcJxvFB68NHrG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Let’s hear it for the winners of the Tom’s Guide AI Awards 2026. Although AI is everywhere, these are the tools, appliances and gadgets worth celebrating for being useful, impactful and innovative. </p><p>Over the past few months, we’ve rigorously tested dozens of the latest AI tools and devices to find the ones that go beyond the hype and<em> actually</em> make your life easier. We’ve looked past the trends and "wow factor" to focus on the ones worth the recognition. Whether it’s a smarter home that anticipates your needs or a local solution that supercharges your creativity, these awards represent the best of AI because they are practical, powerful and ready to use right now. </p><p>The winners of the Tom’s Guide AI Awards 2026 are the tools and devices we couldn’t put down, use ourselves and keep coming back to, because they solve real problems. Some help you save time without adding complexity while others offer ingenuity that make them stand out from the rest. All deliver on the promise of AI that feels intuitive and practical. And more importantly, they’re ready to fit into your daily routine right now.</p><h3 class="article-body__section" id="section-personal-tech-phones-pcs-wearables"><span>Personal Tech (Phones, PCs, & Wearables)</span></h3><h2 id="hp-eliteboard-g1a">HP EliteBoard G1a</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3026px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HQxsjp2mw6EompJ33i4Vud" name="hp-elite-board-g1a-1" alt="The HP EliteBoard G1a in hand with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/HQxsjp2mw6EompJ33i4Vud.jpg" mos="" align="middle" fullscreen="" width="3026" height="1702" 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 HP EliteBoard G1a might look like a common office keyboard, but it’s actually a fully functional PC. This Commodore 64-like computer seems unusual, but this form factor could be ideal for certain users. According to HP, the EliteBoard is for workers who frequently move between workstations and often keep their laptops closed when connected to a monitor.</p><p>Inside, it packs a CPU, storage, RAM, and connectivity. All that’s required on your end is to connect it to a monitor. Before you ask, yes, it includes a mouse and a dongle with an Ethernet port, HDMI, and two USB-C ports. Thanks to Bluetooth support, you can connect additional peripherals.</p><p>While the HP EliteBoard G1a is a remarkably capable computer, it’s admittedly not for everyone. If you own a laptop, you’re probably better off with that. However, if you’re the kind of worker this machine was designed for, it could be very useful. It’s currently listed as “coming soon” on its <a href="https://www.hp.com/us-en/desktops/business/eliteboard.html" target="_blank" rel="nofollow">official product page</a>, but you can pick it up now for <a href="https://www.adorama.com/hp-eliteboard-g1a-ai-mini-pc-16gb-256gb/p/ihd6jg0utaba" target="_blank" rel="nofollow">$1,499 on Adorama</a>. — <em>Tony Polanco</em></p><h2 id="oura-advisor">Oura Advisor</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2610px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="b3kr3DUtJjyAjN5Fgpvaqn" name="oura-ring-oura-advisor-1" alt="The Oura Ring 4 in hand with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/b3kr3DUtJjyAjN5Fgpvaqn.jpg" mos="" align="middle" fullscreen="" width="2610" height="1468" 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 AI-powered <a href="https://www.tomsguide.com/wellness/fitness/ouras-ai-powered-advisor-is-rolling-out-heres-what-it-means-for-you">Oura Advisor</a> feature — available in the Oura app for the latest <a href="https://www.tomsguide.com/wellness/fitness-trackers/oura-ring-4-review">Oura Ring 4</a> and older <a href="https://www.tomsguide.com/reviews/oura-ring-generation-3">Oura Ring 3</a> —  is one of the most actionable and insightful AI wellness coaches we’ve tested. While other wearables provide a laundry list of tracked metrics, the Oura Advisor <em>actually</em> makes sense of all the data, offering digestible trend observations and training tips based on your current goals and recent physical and mental performance.</p><p>Users can set Oura Advisor's voice and how often it checks in. You can also ask it questions anytime using the app. Designed to help you improve your overall well-being in any number of ways, the Advisor can do everything from guiding you to progressively wake up earlier for more productive mornings, to generating detailed training plans for an upcoming marathon/triathlon. Better yet, the more you interact with the Advisor, the better it gets to know you, ultimately leading to even more personalized insights and advice. — <em>Dan Bracaglia</em></p><h2 id="amd-ryzen-ai-max-395">AMD Ryzen AI Max+ 395 </h2><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="u76xxJ9oVeR9cyW3D5v3i8" name="amd-ryzen-ai-max-1" alt="A motherboard with a AMD Ryzen AI Max chip on it in hand with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/u76xxJ9oVeR9cyW3D5v3i8.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Great silicon for local AI isn’t just about raw horsepower, it’s about doing the job efficiently too — especially when it comes to a laptop chip. And for that reason, the <a href="https://www.tomsguide.com/computing/cpus/two-new-amd-ryzen-ai-max-chips-just-dropped-and-they-could-change-mid-range-gaming-laptops-forever">AMD Ryzen AI Max+ 395</a> manages to nail a pretty effective balance between performance and power efficiency.</p><p>And it all comes down to that monstrous internal GPU 40 cores, and support for up to 128GB of RAM allowing me to easily run gigantic 120 billion parameter models at zippy speeds, or even get agentic on all your daily to-dos with OpenClaw. The strength of local AI is security and versatility to have it do whatever you want it to do, and this is the best portable chip to run it. — <em>Jason England</em></p><h2 id="even-g2-display-smart-glasses-and-r1-smart-ring">Even G2 Display Smart Glasses and R1 Smart Ring</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uszHatDp2RmxPWubtebLBE" name="even-g2-1" alt="A pair of Even Realities G2 smart glasses in a case with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/uszHatDp2RmxPWubtebLBE.jpg" mos="" align="middle" fullscreen="" width="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>As someone who’s tested smart glasses for over five years, AI has felt like the missing link to this category — unlocking so many more use cases on something so immediately wearable than the other crop of AI hardware form factors. And out of all of them, the <a href="https://www.tomsguide.com/computing/smart-glasses/even-realities-g2-smart-glasses-review">Even Realities G2</a> finds a great balance of sensible, genuinely user friendly implementations across the board.</p><p>You’ve got your standard array of AI features like a chatbot and live translation (all great for on-the-go), but the biggest ones here come courtesy of <a href="https://www.tomsguide.com/computing/smart-glasses/i-zoned-out-and-stopped-listening-to-my-fiancee-and-the-even-realities-g2-made-sure-she-never-knew">Conversate</a> and <a href="https://www.tomsguide.com/computing/smart-glasses/i-fed-my-tamagotchi-looked-like-a-d1-athlete-and-fact-checked-my-boss-my-time-with-even-g2s-secret-smart-glasses-app-store">Even Hub</a> — basically an app store for smart glasses.</p><p>The former not only listens to and transcripts conversations, but also gives you smart context and follow-up questions to ask (saving me from when my mind drifted away when on the phone with my fiancée), and the second is growing by the day with more and more AI capabilities. — <em>Jason England</em></p><h2 id="napster-view">Napster View</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3700px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="7kT4sva7ZSaUrtF6hwxn9H" name="napster-view-2" alt="The Napster View on top of a laptop with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/7kT4sva7ZSaUrtF6hwxn9H.jpg" mos="" align="middle" fullscreen="" width="3700" height="2081" 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>Napster View deserves recognition for pushing AI beyond the flat chatbot interface and into a more human, spatial experience. By combining a glasses-free holographic display with AI companions, it reimagines how people interact with AI assistants, which makes collaboration feel more natural and engaging. </p><p>Instead of another app window, Napster View gives AI a physical presence on your desk, helping to manage tasks in a way that feels futuristic yet practical. In a crowded market of lookalike AI tools, Napster View stands out for bold innovation and fresh design highlighting what the next generation of human-AI interaction looks like. — <em>Amanda Caswell</em></p><h2 id="fitnexa-somnipods">Fitnexa SomniPods</h2><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="KNZrJZ5z73zwrDYNaF59aJ" name="fitnexa-somnipods-2" alt="The Fitnexa SomniPods 2 in a case on a table with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/KNZrJZ5z73zwrDYNaF59aJ.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>Good sleep is vital to your wellbeing and longevity so leaving it in the hands of an AI chatbot might be an unnerving prospect. However, the <a href="https://www.tomsguide.com/wellness/sleep-tech/fitnexa-somnipods-3-review">Fitnexa SomniPods 3 Sleep Earbuds</a> impress with an integrated AI helper that uses your sleep tracking data (recorded directly from the earbuds) combined with the best advice sourced from the web to deliver personalized insight into your snooze. Don’t expect sleep doctor level insight, but you will get helpful pointers into taking your eight hours to the next level.</p><p>It helps that as a pair of sleep headphones, the SomniPods 3 rate among the best. The ANC is strong enough to muffle your snoring bed partner and while the sound quality won’t impress audiophiles, it delivers white noise with enough clarity to immerse you in a soothing cocoon. So the SomniPods not only help you sleep better, they can show you just how much good kip you got and give you advice to make the next night even better. — <em>Ruth Jones</em></p><h2 id="rokid-ai-glasses-style">Rokid AI Glasses Style</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MHZ9nihne2XPvz4wPmPfGN" name="rokid-ai-glasses-1" alt="The Rokid AI Glasses Style on a table with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/MHZ9nihne2XPvz4wPmPfGN.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Think the Ray-Ban Meta smart glasses, but cheaper, lighter and open to other AI models and that’s what you get with the <a href="https://www.tomsguide.com/computing/smart-glasses/rokid-ai-glasses-style-review">Rokid AI Glasses Style</a>. You can pick from ChatGPT or Gemini to drive the multi-modal capabilities of just asking questions, using image recognition to get answers to problems around you, take notes from meetings, and more.</p><p>And even better, all of this is packed into a sleek pair of shades that nobody will really notice is actually a pair of smart glasses (unless they’re looking really closely at those corners). No display to distract you, just a natural-feeling upgrade to your AI tech arsenal. — <em>Jason England</em></p><h2 id="framework-desktop">Framework Desktop</h2><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="NM5YYdA2Hsh8YGV37JywrS" name="framework-desktop-2" alt="The Framework Desktop on a desk with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/NM5YYdA2Hsh8YGV37JywrS.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/mini-pcs/framework-desktop-review">Framework Desktop</a> completely flipped the idea of what a mini PC is on its head but it also did so for local AI. This DIY and repairable desktop proved that local AI power doesn’t have to come in a locked-down box. By pairing AMD’s AI Max processors with up to 128GB of unified memory, Framework created a mini PC that can run local LLMs just as well as it can handle demanding workloads and even gaming.</p><p>Instead of using a more expensive and power-hungry discrete GPU, the Framework Desktop combines the power of AMD’s Ryzen AI Max chips with unified memory to side-step VRAM limitations. Likewise, it does so in a small, portable case that you can customize to your workflow and even your workspace. It’s hard to find a machine that does it all at this size and price. However, the Framework Desktop delivers and then some with enough versatility that you can edit video and run local AI models during the day and then play games at night. — <em>Anthony Spadafora</em></p><h2 id="msi-stealth-16-ai">MSI Stealth 16 AI+</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fr65MAwH2NknRPwWv5BNzW" name="msi-steal-16-ai-1" alt="The MSI Stealth 16 AI+ (2026) on a table with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/fr65MAwH2NknRPwWv5BNzW.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/gaming-laptops/i-went-hands-on-with-the-redesigned-msi-stealth-16-ai-its-actually-stealthy-now-and-gunning-for-the-macbook-pro">MSI Stealth 16 AI+</a> is not just a great gaming laptop, it’s an AI powerhouse with its monstrous internals — a solid pairing of Intel’s Panther Lake chipset with the next-gen NPU for small local AI tasks, and up to an RTX 5080 for running gigantic models really brings it altogether.</p><p>Throw in Nvidia’s huge toolbox of AI models across agentic capabilities, creativity and more, and you’ve got a really impressive system that can do it all from crunching a massive LLM to creating your next coding masterpiece. And all of this is packed into what I’d call the Windows MacBook Pro aesthetic — an all aluminum shell with great ergonomics, a gorgeous 240Hz OLED panel and plenty of connectivity. — <em>Jason England</em></p><h2 id="samsung-galaxy-s26-ultra-2">Samsung Galaxy S26 Ultra</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4952px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="tzphhhAwFZUnDrVag3rcNc" name="galaxy-s26-ultra-2" alt="The Samsung Galaxy S26 Ultra in hand with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/tzphhhAwFZUnDrVag3rcNc.jpg" mos="" align="middle" fullscreen="" width="4952" height="2786" 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>Smartphones are quickly becoming the ultimate AI hardware — embracing the raw power of that built-in silicon to deliver some nifty new features. Sometimes they’re gimmicks, but in the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Samsung Galaxy S26 Ultra</a>, they definitely are not.</p><p>It starts with fun moments of creativity like AI generative photo edits to move subjects and fill gaps left behind based on the context of everything around it, or Google’s classic circle to search image model. </p><p>But it rapidly gets more ambitious with the likes of Now Nudge giving you contextual multimodal actions based on your messages (setting up a calendar appointment if someone asks if you’re free at 11:30 for brunch), or just full automated app actions giving you full agentic AI across key apps like building a grocery cart in Instacart. — <em>Jason England</em></p><h2 id="dnsys-z1-exoskeleton">Dnsys Z1 Exoskeleton</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:7952px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fSej5QSdQ7rE6LcEFgNXs7" name="dnysys-z1-exoskeleton-2" alt="A person wearing the Dnsys Z1 Exoskeleton with a Tom's Guide Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/fSej5QSdQ7rE6LcEFgNXs7.jpg" mos="" align="middle" fullscreen="" width="7952" height="4473" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dnsys)</span></figcaption></figure><p>Improved mobility can be the difference between going somewhere new or staying home and for those with injuries, disabilities or long-term health conditions, the Dnsys’ exoskeletons are a game changer. This wearable, lower-body exoskeleton makes movements easier by providing strong support and assistance while reducing joint pain.</p><p>While we tested the original<a href="https://www.tomsguide.com/ai/dnsys-x1-exoskeleton-review#viafoura-comments"> X1 Exoskeleton</a> which targets the hips, Dnsys also released a Z1 Exoskeleton that focuses on your knees. Both devices use AI algorithms to predict muscle exertion so that they can provide adaptive assistance in real time. The X1 and Z1 learn your gait and from there, they can predict your movement and send power to your hips or knees right before you move your legs. Dnsys’ algorithms show how AI can often do its best work in the background. — <em>Anthony Spadafora</em></p><h3 class="article-body__section" id="section-smart-home-appliances-security"><span>Smart Home, Appliances & Security</span></h3><h2 id="dyson-spot-scrub-ai">Dyson Spot+Scrub AI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PVrwGejTmkhvK5zxgWWipg" name="dyson-spot-scrub-ai-3" alt="The Dyson Spot+Scrub AI cleaning a floor with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/PVrwGejTmkhvK5zxgWWipg.jpg" mos="" align="middle" fullscreen="" width="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>Dyson is a popular brand known for its incredible power, innovative technology and eye-catching designs. And so it comes as no surprise that its newest robot vacuum and mop should throw AI tech into the mix. The <a href="https://www.tomsguide.com/home/smart-home/dyson-spot-scrub-ai-robot-vacuum-review">Spot + Scrub AI</a> is a wet and dry robot vacuum that combines AI vision and ‘green light illumination’ to detect invisible stains and objects. Its capabilities can quickly identify and  adapt to 190 types of household substances and objects, and navigate around them. </p><p>Other impressive features include an advanced dual-laser LiDAR, HD camera, fluffy optic tech and edge-to-edge cleaning to ensure spotless results. Unlike its predecessor, the Spot +Scrub AI uses a heated cleaning system to keep the roller clean and hygienic and dries it with a 113°F (45°C) hot air cycle to prevent lingering smells. — <em>Cynthia Lawrence</em></p><h2 id="malwarebytes-scam-guard">Malwarebytes Scam Guard</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2049px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="5HfNYxodzoba3oMQn5xXg5" name="malwarebytes-scam-guard" alt="Malwarebytes Scam Guard running on a laptop with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/5HfNYxodzoba3oMQn5xXg5.jpg" mos="" align="middle" fullscreen="" width="2049" height="1153" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Malwarebytes)</span></figcaption></figure><p>Even when you think you’re up to date on the latest online scams, a new one comes around that’s a whole lot easier to fall for and many people do. That’s why scam protection has become such an essential cybersecurity tool. Malwarebytes’ Scam Guard provides real-time AI-powered protection against all manner of scams.</p><p>Available on both your computer and your phone, Scam Guard can check text messages, links, phone calls, emails and more with just a simple upload. From there, you get real-time answers on whether or not something is a scam with tips to help you avoid falling for similar scams in the future. Scam Guard is also fast and easy to use with a clean interface. The best part though, it doesn’t slow down your devices while keeping you safe. — <em>Anthony Spadafora</em></p><h2 id="switchbot-ai-hub">SwitchBot AI Hub</h2><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="97NLraexQsyKYC9Kh5FgK" name="switchbot-ai-hub-press.jpg" alt="The SwitchBot AI Hub with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/97NLraexQsyKYC9Kh5FgK.png" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: SwitchBot)</span></figcaption></figure><p>It would be great if your smart home were actually, you know, smart. Switchbot’s AI Hub might actually get us there. This smart home hub has OpenClaw support, which not only allows it to work with the dozens of smart home systems on the market, but lets you communicate with it how you want — be it WhatsApp, iMessage, Discord, or pretty much any other messaging platform.</p><p>The AI Hub can look at connected video streams as well as inputs from other sensors around your home, and analyze what’s going on, predict trends, suggest smart home routines, and more. The Hub supports over 100 SwitchBot devices, offers Matter bridging for up to 30 devices, and integrates with Apple Home, Google Home, and Home Assistant. Best of all, the AI processing is done locally, which means a faster response — and better privacy for you. — <em>Mike Prospero</em></p><h2 id="thermal-camera-p3">Thermal Camera P3</h2><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="QpwEXrAPJAxhn4XEmHTy9K" name="thermal-master-p3" alt="An iPhone with the Thermal Master P3 thermal camera attached with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/QpwEXrAPJAxhn4XEmHTy9K.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Apple’s iPhones are known for taking exceptional photos, including my own iPhone 17 Pro, but there’s one thing they really can’t do — see in the dark. That’s why I’ve been augmenting my phone’s imaging capabilities with the <a href="https://www.tomsguide.com/phones/i-just-gave-my-iphone-night-vision-with-this-usb-c-thermal-camera-and-now-i-can-see-in-the-dark">Thermal Master P3</a>. The great thing about this accessory is that it shows me, in real-time, the heat signatures of whatever I’m pointing it at, essentially giving me Predator-like vision to see through the darkness.</p><p>It specifically leans on an AI algorithm that helps tweak the thermal signature so that it lines up with the actual image. Other thermal cameras tend to have mushy-looking captures, dominated mostly by the colors of different temperatures. However, the AI analyzes the data from the thermal camera and aligns it with my iPhone’s camera, resulting in a sharp image where finer details are exposed. — <em>John Velasco</em></p><h2 id="simplisafe">SimpliSafe</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eHvBJbjTph7XFgkegoGBib" name="Simplisafe-1" alt="A SimpliSafe camera in hand with a Tom's Guide Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/eHvBJbjTph7XFgkegoGBib.jpg" mos="" align="middle" fullscreen="" width="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>Many of the best security cameras have AI to help you better determine what’s lurking inside or outside your house — is it an animal, a person, a vehicle, and what are they doing there? But SimpliSafe is combining that AI with its professional monitoring service, so they can more easily and quickly diagnose if there’s an actual threat. </p><p>Once SimpliSafe’s outdoor camera detects motion, its AI analyzes the video and, if it determines that it’s a threat, can alert an agent within 30 seconds, so that they can either warn the intruder via the camera’s built-in speakers or alert the police. And, the AI can identify familiar faces, so your teen won’t get arrested if they’re caught sneaking back home after curfew — but they’ll still be in trouble! — <em>Mike Prospero</em></p><h2 id="eight-sleep-the-pod-5-ultra">Eight Sleep The Pod 5 Ultra</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bjBQHeaxe8cwNxssD8PYyY" name="eight-sleep-pod-5-ultra" alt="The Eight Sleep Pod 5 Ultra with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/bjBQHeaxe8cwNxssD8PYyY.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: Eight Sleep)</span></figcaption></figure><p>Since we spend a third of our lives sleeping, why not do so smarter? Well, that’s exactly what Eight Sleep has done with its new <a href="https://www.tomsguide.com/wellness/sleep-tech/eight-sleep-pod-4-vs-pod-5-ultra-which-smart-mattress-cover-should-you-buy">Pod 5 Ultra</a> AI-powered mattress cover and blanket system. With help from its Autopilot system, the Pod 5 can make automated changes to your sleep temperature, bed elevation and more in the background so you get the best rest possible.</p><p>Surprisingly, the Pod 5 is also able to predict illness using its AI sensors which recognize and report on any anomalies in your heart rate and respiration. Its AI can even detect snoring and automatically elevate your bed to improve breathing. Likewise, if you’re having trouble falling asleep, Eight Sleep’s personalized AI coach can analyze your sleep data and provide tailored advice to rectify any problems. The Pod 5 is another great example of AI working in the background to help improve your life. — <em>Anthony Spadafora</em></p><h2 id="govee-lightwall">Govee Lightwall</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="8pddvMrJeHjcCpiF3fkLQi" name="govee-lightwall-1" alt="The Govee Lightwall with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/8pddvMrJeHjcCpiF3fkLQi.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" 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>Govee’s new <a href="https://www.tomsguide.com/home/smart-home/govee-lightwall-review">Lightwall</a> isn’t the company’s first product to feature its conversational AI Lighting Bot but it does give you the largest canvas yet to work with. Right from within the Lightwall’s settings in the app, tapping “AI” brings up a chatbot that can make highly detailed lighting effects, pictures and even animated GIFs with just a short prompt.</p><p>With a 7.9 x 5.3 foot display, Govee’s Lightwall lets you bring any idea you can think of to life in 60 to 90 seconds. The Govee app already features hundreds of preset scenes but with its Lighting Bot 2.0, you can fill in the gaps and create bespoke scenes based on the occasion or even your mood. Govee’s chatbot isn’t just for its new Lightwall though and you can use it to customize smart bulbs, permanent outdoor lights or even Christmas lights. It’s intuitive AI you’ll actually use even if you don’t know the difference between ChatGPT and Google Gemini. —<em> Anthony Spadafora</em></p><h2 id="lg-alpha-11-processor">LG Alpha 11 Processor </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="BY47cZyC8LJZEVe7Gq8uKn" name="lg-c6-2" alt="The LG G6 OLED on a stand with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/BY47cZyC8LJZEVe7Gq8uKn.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" 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>At the heart of LG’s latest OLED TV lineup is the latest version of the Alpha 11 Processor. While LG has hyped many of the AI-based software features that this chipset powers (like chatbots and content-recommendation tools), its biggest contribution to LG’s <a href="https://www.tomsguide.com/tvs/oled-tvs/best-oled-tvs">best OLED TVs</a> is the way in which it elevates the picture.</p><p>Ahead of the release of the <a href="https://www.tomsguide.com/tvs/oled-tvs/lg-c6-oled-review">LG C6</a> and G6 OLED TVs, we were given a demonstration of the third-generation Alpha 11 Processor in action at LG headquarters. In front of a row of four OLED TVs (the <a href="https://www.tomsguide.com/tvs/4k-tvs/samsung-s95f-oled-tv-review">Samsung S95F</a>, the <a href="https://www.tomsguide.com/tvs/oled-tvs/sony-bravia-8-ii-review">Sony Bravia 8 II</a>, the LG G6 and <a href="https://www.tomsguide.com/tvs/oled-tvs/lg-g5-oled-tv-review">G5 OLED</a>), an LG representative showcased how the newest picture processing algorithms work to improve a common issue on these TVs: color banding (otherwise known as posterization).</p><p>This pesky visual problem occurs across color gradients, rendering what should be seamless transitions into chunky, harshly separated bands of light. During the demo, a visually punishing sequence from “The Green Knight” — in which a person swims underwater in a vast, crimson-colored sea — was simultaneously shown across all of the flagship OLED TVs. On all but one of these sets (including the LG G5), the red-colored light illuminating the sea appeared unnaturally striped to varying degrees. Only the G6 was able to render this sequence without color banding.</p><p>This year, the third-generation Alpha 11 AI Processor power can be found in both the G6 and C6 OLED TVs, and while the ultimate success of these TVs depends on factors beyond just their processing power, this handy piece of hardware is already leaving its mark on some of the year’s <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TVs</a>. — <em>Michael Desjardin</em></p><h2 id="mova-lidax-ultra-awd-series">MOVA LiDAX Ultra AWD Series</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1282px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="GU2dxjRFiS5dCTEfkTDD8F" name="MOVA-lidax-ultra-series-press-shot" alt="The Mova Lidax Ultra robot vacuum cutting grass with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/GU2dxjRFiS5dCTEfkTDD8F.jpg" mos="" align="middle" fullscreen="" width="1282" height="721" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Mova)</span></figcaption></figure><p>Robot lawnmowers are getting smarter and smarter. MOVA’s new <a href="https://www.tomsguide.com/home/lawn-care/best-robot-lawnmowers-of-ces">LiDAX Ultra AWD Series </a>can not only keep your grass trimmed, but using a combination of 360° 3D LiDAR and an AI-enhanced 1080p HDR camera, can avoid all of your kids’ toys in the process — it can identify more than 300 different objects. </p><p>One of the neatest features of MOVA’s lawnmower is that, in addition to cutting straight patterns like diamonds or parallel lines, it can also cut shapes in your lawn — like hearts, stars, and moons. We can only imagine that the company will add more shapes as time goes on. And, when it’s not mowing your lawn, the MOVA can even act as a security guard, patrolling your yard and letting you view a live feed from its camera. Can your push mower do that? — <em>Mike Prospero</em></p><h2 id="samsung-bespoke-ai-4-door-family-hub">Samsung Bespoke AI 4-Door Family Hub</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1232px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ccaTcc5icGqdnWtpgWGESe" name="Samsung-Bespoke-AI-3-Door-Refrigerator-AutoView-scaled" alt="The Samsung Bespoke AI 4 Door Refrigerator with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/ccaTcc5icGqdnWtpgWGESe.jpg" mos="" align="middle" fullscreen="" width="1232" height="693" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>What’s for dinner? That perennial question could be a thing of the past, thanks to the food recognition inside Samsung’s premium <a href="https://www.tomsguide.com/home/i-didnt-expect-to-like-samsungs-new-ai-fridge-that-can-suggest-recipes-tell-you-the-weather-and-stream-your-favorite-playlists-but-now-im-obsessed">Bespoke AI 4-Door Family Hub</a> fridge, which has just been given a real boost thanks to the addition of Google’s AI. Now, it uses a combination of Samsung’s own AI and Gemini to better identify everything you put in or take out. It can tag everything from avocados to zucchini, and even knows the difference between regular and diet Coke.</p><p>The fridge goes a step further, suggesting meals based on what you have on hand, adding things to grocery lists that you use often, and even letting you know if that milk in the back is starting to go bad. You might never let food go to waste again. — <em>Mike Prospero</em></p><h2 id="lg-signature-iconic-oven-with-gourmet-ai">LG SIGNATURE Iconic Oven with Gourmet AI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WdTAja9qcrgKmi4EXeBsPi" name="lg-signature-iconic-oven-press-shot" alt="The LG Signature Iconic Oven in a kitchen with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/WdTAja9qcrgKmi4EXeBsPi.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: LG)</span></figcaption></figure><p>Never overcook anything again! <a href="https://www.tomsguide.com/home/kitchen-dining/lg-signature-just-announced-a-smart-oven-with-an-in-built-camera-and-its-ideal-for-bakers">LG’s Signature Iconic Oven</a> has a camera on the inside that, when combined with its Gourmet AI, can identify more than 85 dishes </p><p>Gourmet AI, powered by an intelligent AI camera inside the oven cavity that identifies more than 85 distinct dishes and automatically selects the ideal cooking settings to deliver flawless results — removing the complexity from gourmet cooking and placing perfection within effortless reach. Complementing this is the AI Browning feature, which monitors baked goods as they cook and sends a personalized notification through the ThinQ™ app the moment they reach a user's preset level of golden perfection. — <em>Mike Prospero</em></p><h2 id="aqara-fp400">Aqara FP400</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="nowwBQEvwaHHVvxR3UHsw3" name="Aqara-fp400-press-shot" alt="The Aqara FP400 sensor on a wall with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/nowwBQEvwaHHVvxR3UHsw3.png" mos="" align="middle" fullscreen="" width="3000" height="1688" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Aqara)</span></figcaption></figure><p>“Help, I’ve fallen and I can’t get up!” Remember those commercials? If you’re caring for an elderly person and want to make sure they’re safe — without the intrusiveness of a security camera — the Aqara FP400 could be it. This wall- or ceiling-mounted device uses mmWave technology to sense the presence of up to 10 people in a room, but that’s just the start. </p><p>Using AI, it can detect if each person is walking, sitting, or lying down, and where they are in the room — and if they fell. From there, this Matter-enabled device can trigger all sorts of routines, be it turning on the lights, adjusting the thermostat, unlocking the door, or calling for help. </p><p>Its uses go beyond the elderly, too. Imagine if you could just sit down on your couch in the evening, and the FP400 could automatically dim the lights, close the blinds, and turn your TV on to your favorite streaming service — and then automatically pause the movie if you have to run to the bathroom. Now that’s a practical use for AI if we ever saw one. — <em>Mike Prospero</em></p><h3 class="article-body__section" id="section-specialty-future-tech"><span>Specialty & Future Tech</span></h3><h2 id="xreal-real3d">Xreal Real3D </h2><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="D85y8oiwyZFGoAR5S9Kzv8" name="xreal-real3d-2" alt="The Xreal One Pro AR glasses worn by a person with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/D85y8oiwyZFGoAR5S9Kzv8.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Xreal’s <a href="https://www.tomsguide.com/computing/smart-glasses/xreal-one-pros-huge-3d-update-just-landed-and-the-usd170-discount-couldnt-be-better-timed">Real3D</a> mode debuted alongside the release of its <a href="https://www.tomsguide.com/computing/smart-glasses/xreal-1s-review">Xreal 1S</a> AR glasses. However, the company then brought this same functionality to the <a href="https://www.tomsguide.com/computing/vr-ar/xreal-one-ar-glasses-review">Xreal One</a> and <a href="https://www.tomsguide.com/computing/vr-ar/smart-glasses/xreal-one-pro-ar-glasses-review">Xreal One Pro</a> AR glasses via a firmware update. What sets Xreal’s implementation of real-time 2D to 3D content conversion apart is that it’s done entirely on the glasses themselves.</p><p>The X1 chip inside Xreal’s AR glasses does all the work which helps lower latency across the board. More importantly though, since this conversion is being done on device, you don’t have to worry about DRM getting in the way of watching your favorite shows and movies in 3D. Gaining access to this new dimension via a software update adds even more immersion and makes Xreal’s AR glasses an ideal choice for both productivity and entertainment. — <em>Anthony Spadafora</em></p><h2 id="norton-neo">Norton Neo</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="idTd8NCj2rHqcG2DzttERC" name="norton-neo" alt="The Norton Neo browser on a laptop with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/idTd8NCj2rHqcG2DzttERC.jpg" mos="" align="middle" fullscreen="" width="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>Norton is best known for its antivirus software but <a href="https://www.tomsguide.com/computing/browsers/i-tried-nortons-ai-powered-neo-browser-and-it-finally-made-sense-out-of-my-dozens-of-open-tabs">Neo</a> is a fresh new take on a web browser. It’s built on Chromium so all of your favorite extensions and integrations still work as you’d expect but with useful AI features throughout. When you boot up Neo for the first time, you’re greeted with its calmer and clutter-free Magic Page. Then, instead of your standard address bar, its central command bar Magic Box combines that functionality with an AI chatbot interface. No more typing out URLs, you just tell Neo where you want to go or what you want to find and it intelligently handles the rest.</p><p>Norton Neo also includes a bunch of other useful features for a better browsing experience. From auto-organized horizontal and vertical tabs to its Link Peek feature which lets you preview sites in a lightweight overlay, Neo makes web browsing feel much more intentional. Then when you need some extra help, Norton’s Neo chatbot is just a click away and shows up in a sidebar on the right so you don’t have to navigate away from the page you’re on. Norton might be a household name for security but Neo is proof the company isn’t resting on its laurels. — <em>Anthony Spadafora</em></p><h2 id="mixbook">Mixbook</h2><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="YFzafcFXL4YfwCMg6EwKeF" name="Mixbook-3" alt="A photobook made with Mixbook with a Tom's Guide AI Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/YFzafcFXL4YfwCMg6EwKeF.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 hardest part when creating a photo book is getting started. We have so many photos on our phones and in online photo albums, it’s difficult to know where to begin. That’s where <a href="https://www.tomsguide.com/cameras-photography/mixbook-photo-book-review">Mixbook Studio</a> comes in. A new feature from the company that makes some of the best photo books, MixBook Studio uses AI to help you organize your photos into a compelling narrative, generate captions from the photos, pick the best layouts and themes for your photo book, and even touch up photos that would otherwise be too low-resolution to print.</p><p>Mixbook Studio also lets you collaborate with others on your projects which helps ensure everyone’s contributions don’t get overwritten and that the overall feel of the book remains consistent. Most importantly, its AI is aimed at aiding your creativity, not replacing it. — <em>Mike Prospero</em></p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 20 years ago the Nintendo Wii changed everything — 9 wonderfully weird gadgets from the 2000s that put today’s AI slop to shame ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/i-miss-when-gadgets-were-weird-9-icons-from-20-years-ago-that-put-todays-ai-to-shame</link>
                                                                            <description>
                            <![CDATA[ From the Nintendo Wii to the Flip Video camcorder, a look back 20 years into the past reveals a tech industry that was willing to take much bigger risks with hardware and innovate instead of iterate. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">xtMGNT9ZmvbAdJN4ZMSTD6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MMwaPQyHQhzs5zTHT3zf7S-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 07 May 2026 04:01:00 +0000</pubDate>                                                                                                                                <updated>Thu, 07 May 2026 11:05:38 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Mark has a passion for covering all things mobile, having reviewed dozens of smartphones and other gadgets. He enjoys testing the top mobile devices and putting them up against each other in our in-depth face-offs. He also works hand in hand with our editors and testing team to continually improve how we evaluate products.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Having led Tom&#039;s Guide since 2013, Mark has focused on growing the core tech coverage of the site while also expanding into new areas, such as entertainment, fitness and home, recruiting talented writers and editors to help our readers figure out what to buy and how to get the most out of the products and services they use every day.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Mark has spoken at key industry events and appears regularly on TV to discuss the latest trends, including &lt;a href=&quot;https://cheddar.com/media/pixel-watch-gets-a-release-date-at-google-i-o-2022&quot;&gt;Cheddar&lt;/a&gt;, Fox 5, &lt;a href=&quot;https://www.foxbusiness.com/technology/apple-march-event-5g-iphone&quot;&gt;Fox Business&lt;/a&gt; and other outlets. Mark was previously editor in chief of Laptop Mag, and his work has appeared in Wired, Popular Science and Inc. Follow him on Twitter at @mspoonauer.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/MMwaPQyHQhzs5zTHT3zf7S-1280-80.jpg">
                                                            <media:credit><![CDATA[Motorola/Nokia/Nintendo/Pure Digital/BlackBerry]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Motorola O Rokr, Nokia N95, Nintendo Wii, Pure Digital Flip Video and BlackBerry Pearl 8100]]></media:description>                                                            <media:text><![CDATA[Motorola O Rokr, Nokia N95, Nintendo Wii, Pure Digital Flip Video and BlackBerry Pearl 8100]]></media:text>
                                <media:title type="plain"><![CDATA[Motorola O Rokr, Nokia N95, Nintendo Wii, Pure Digital Flip Video and BlackBerry Pearl 8100]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MMwaPQyHQhzs5zTHT3zf7S-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Since I cover tech for a living I get asked the same questions by friends and family every time we get together. Like “What’s new and cool right now,” or “What’s the next big thing?"</p><p>My answers have gotten less and less exciting over time. In the last 20 years, we’ve traded fun and sometimes wonderfully weird hardware innovation for iteration. Yes, smart phones are getting thinner and their cameras are getting better. But today, AI features are a much bigger deal now than hardware.</p><p>Think about gadgets 20 years ago and how interesting and different they were compared to what we’re getting today. In 2006-27, Nintendo re-invented the game console, Pure Digital made capturing and uploading video super cheap and Apple introduced the first MacBook Pro.</p><p>Here are 9 top gadgets from 2006 that make me more than a little nostalgic.</p><h2 id="nintendo-wii-2006">Nintendo Wii (2006)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2078px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="8cCxfSjs6Dgi2MScidEAMJ" name="GettyImages-94664345-2" alt="Nintendo Wii" src="https://cdn.mos.cms.futurecdn.net/8cCxfSjs6Dgi2MScidEAMJ.jpg" mos="" align="middle" fullscreen="" width="2078" height="1169" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Robert Gilhooly/Bloomberg/Getty)</span></figcaption></figure><p>If you were old enough to pick up a controller in 2006, you are likely old enough to remember playing Wii Sports, especially bowling. Nintendo’s <strong>motion-sensing controllers</strong> revolutionized how we played video games, and the Nintendo Wii ($249) got millions of people off the couch and moving. It also did an amazing job of bringing families together and was also just a great party game console. <strong>Despite some broken TVs</strong> — how many of you forgot to attach the strap to your wrist — overall the Wii was about as fun as gaming gets.</p><h2 id="flip-video-2007">Flip Video (2007)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XuvmPoBdv4tsBAHW5TpdFJ" name="Pure Digital Flip Video" alt="Pure Digital Flip Video" src="https://cdn.mos.cms.futurecdn.net/XuvmPoBdv4tsBAHW5TpdFJ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Pure Digital)</span></figcaption></figure><p>I was lucky enough to test the Flip Video ($130) from Pure Digital back in the day, and it was a huge deal because it allowed users to simply <strong>flip-out the USB arm</strong> and plug it into a computer. Video recording phones were not quite the rage yet, and this design made it delightfully simple to upload and share your footage. Yes, the 720p resolution was low-res and you didn’t get expandable SD storage, but I had a blast capturing family memories on this thing.</p><h2 id="nokia-n95-2006">Nokia N95 (2006)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SHUA9jucbvPUpTEh4iZBGJ" name="Nokia N95" alt="Nokia N95" src="https://cdn.mos.cms.futurecdn.net/SHUA9jucbvPUpTEh4iZBGJ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nokia)</span></figcaption></figure><p>I didn’t know it at the time, but the Nokia World event I attended in Amsterdam in 2006 was the beginning of the end for a brand that reached as high as <strong>40% market share</strong> for mobile phones. Of course, the iPhone would come along and change everything in 2007. But before that, Nokia announced the Nokia N95, which it called a <strong>“multimedia computer.”</strong> The N95 was the most feature-packed mobile to date with a <strong>5MP Carl Zeiss camera</strong>, built-in GPS and an iconic dual-slide mechanism. Sliding the screen up revealed the keypad, and sliding it down revealed media playback controls.</p><h2 id="slingbox-2005">Slingbox (2005)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mg6noW4BBK78ZazFNCUcAJ" name="Slingbox" alt="Slingbox" src="https://cdn.mos.cms.futurecdn.net/mg6noW4BBK78ZazFNCUcAJ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Slingbox)</span></figcaption></figure><p>Before there was YouTube TV, this was the best game in town. The original Slingbox was introduced in 2005, but sales started to take off in 2006. The premise was simple. <strong>Connect this device to your cable box</strong>, and you’d be able to watch your favorite shows, movies and sports away from home on your laptop. The original model supported only one-to-one connections but the Slingbox Pro could handle up to four different sources. </p><h2 id="blackberry-pearl-2006">BlackBerry Pearl (2006)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1083px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="BL7nF6zMXcbdVGmoRdmU6J" name="GettyImages-165223652-David Cooper-2" alt="BlackBerry Pearl 8100" src="https://cdn.mos.cms.futurecdn.net/BL7nF6zMXcbdVGmoRdmU6J.jpg" mos="" align="middle" fullscreen="" width="1083" height="609" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: David Cooper/Getty)</span></figcaption></figure><p>Remember when phones were weird? The BlackBerry Pearl attempted to take the mobile email machine from the business world to the masses. And the experiment worked with a much slimmer design than previous BlackBerries, an <strong>innovative trackball for navigation</strong> and a built-in camera (a first for the lineup). The <strong>SureType keyboard was controversial</strong> because it stuffed two letters on a single key, but overall it was a hit.</p><h2 id="kodak-easyshare-v570-2006">Kodak EasyShare V570 (2006)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2100px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="fgzuRNLsPgVzqUxemC7ynd" name="GettyImages-94825502-2" alt="Kodak EasyShare V570" src="https://cdn.mos.cms.futurecdn.net/fgzuRNLsPgVzqUxemC7ynd.jpg" mos="" align="middle" fullscreen="" width="2100" height="1181" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Neal Ulevich/Bloomberg/Getty)</span></figcaption></figure><p>Today we take multiple-camera setups on our phones for granted, but the Kodak EasyShare V570 was a groundbreaking point-and-shoot in 2006 because it offered a dual-lens system. You got both a <strong>23mm ultra-wide lens</strong> and a <strong>29-117mm optical zoom lens</strong> in a single design. The lenses also used <strong>folded optics</strong> so they didn’t extend outside the camera, which is pretty remarkable for a 5x optical zoom camera. No wonder this camera won a gold medal at the 2006 Industrial Design Excellence Awards.</p><h2 id="apple-macbook-pro-2006">Apple MacBook Pro (2006)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bbYNEgJFWzqKiFGnfB25kT" name="Apple MacBook Pro 2006" alt="Apple MacBook Pro (2006)" src="https://cdn.mos.cms.futurecdn.net/bbYNEgJFWzqKiFGnfB25kT.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple/Tom's Guide)</span></figcaption></figure><p>When Apple launched the first MacBook Pro back in 2006, it was chock-full of firsts. This was the first MacBook to use an Intel processor, ditching the previous PowerPC G4. It also introduced a <strong>MagSafe power connector</strong>, a magnetic charging port that disconnected safely if someone tripped over the cord. And you got a built-in <strong>iSight camera </strong>for the first time. The inch-thick notebook was bulky by today’s standards, but this 15.4-inch aluminum widescreen beauty paved the way for modern laptops.</p><h2 id="garmin-nuvi-660-2006">Garmin nuvi 660 (2006)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dYb9r3UVzrv6f5HCiTekHJ" name="Garmin Nuvi 660" alt="Garmin nuvi 660" src="https://cdn.mos.cms.futurecdn.net/dYb9r3UVzrv6f5HCiTekHJ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Garmin)</span></figcaption></figure><p>Before GPS navigation became a standard feature in phones with Google Maps — the Motorola Droid in 2009 paved that road — the Garmin uni 660 was the pinnacle of standalone GPS units. It featured a <strong>4.3-inch sunlight readable touchscreen</strong> (a big leap from 3.5 inches on other units), Bluetooth for making and receiving calls and a built-in FM receiver for <strong>live traffic alerts</strong>. It even came with an FM transmitter so you could beam audio to your car’s radio.</p><h2 id="motorola-o-rokr-2006">Motorola O Rokr (2006)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="skE6jWAncdCcg4KnAwgYEJ" name="Motorola O Rokr" alt="Motorola O Rokr" src="https://cdn.mos.cms.futurecdn.net/skE6jWAncdCcg4KnAwgYEJ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Motorola)</span></figcaption></figure><p>Yes, it’s dorky looking by today’s standards, but the Motorola O Rokr was <strong>one of the first pieces of wearable tech</strong> and a precursor to today’s <a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">smart glasses</a>. A collaboration with Oakley, the O Rokr glasses delivered <strong>stereo music to your ears</strong> via Bluetooth with two small speakers attached to the arms of the glasses. And the frames featured physical buttons to play/pause music and skip tracks, as well as answer calls. You only got 5 hours of talk time and the $249 price was very pricey for 2006 money, but this was a very cool ahead-of-its-time gadget.</p><p><strong>Your turn: </strong>Now tell us which gadgets impressed you most in this list and which ones you miss the most overall. </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/the-50-moments-that-defined-apple">Apple at 50: The 51 best (and worst) moments in Apple's history</a></li><li><a href="https://www.tomsguide.com/sales-events/retro-gaming-is-back-relive-the-classics-with-these-9-retro-consoles-and-games">Retro gaming is back — relive the classics with these 9 retro consoles and games</a></li><li><a href="https://www.tomsguide.com/audio/i-ditched-my-smartphone-to-listen-to-music-on-my-decade-old-ipod-here-are-3-things-i-liked-and-2-i-didnt">I ditched my smartphone to listen to music on my decade-old iPod — 3 things I liked and 2 I didn't</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve found the Mother’s Day gifting sweet spot — these 12 tech items are all under AU$200 and make perfect prezzies ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/ive-found-the-mothers-day-gifting-sweet-spot-these-12-tech-items-are-all-under-au-usd200-and-make-perfect-prezzies</link>
                                                                            <description>
                            <![CDATA[ Mother's Day in Australia is just around the corner, and if you haven't found the perfect prezzie for mum yet, check out these 12 tech gifts on Amazon — all under AU$200. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">UdZWcQYqANZNbuQEzubTuC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/5EgNH765a9KvECesBbWUN-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 28 Apr 2026 00:00:29 +0000</pubDate>                                                                                                                                <updated>Thu, 07 May 2026 01:14:35 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ lucy.scotting@futurenet.com (Lucy Scotting) ]]></author>                    <dc:creator><![CDATA[ Lucy Scotting ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/UC9ncAYxkmJ5ipHEyX44ri.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Lucy Scotting is a staff writer for Tom’s Guide Australia, primarily covering lifestyle, streaming and internet-related news. Lucy started her career writing for HR and staffing industry publications, with articles covering emerging tech, business and finance.&lt;/p&gt;&lt;p&gt;In her spare time, Lucy can be found watching sci-fi movies, working on her dystopian fiction novel (in progress since 2017) or hanging out with her dog, Fletcher. If she’s not found doing any of the above, she’s likely on her next adventure to a new city, country, or continent. &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/5EgNH765a9KvECesBbWUN-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon / Edited with Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Products on white background ]]></media:description>                                                            <media:text><![CDATA[Products on white background ]]></media:text>
                                <media:title type="plain"><![CDATA[Products on white background ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/5EgNH765a9KvECesBbWUN-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>In a little less than two weeks, it'll be <a href="https://www.tomsguide.com/sales-events/mothers-day-gift-ideas-au">Mother's Day 2026</a> in Australia, with the big day landing on Sunday, May 10 this year. If you've been putting off picking up a perfect present for your mum (or mother figure), the clock is definitely ticking.</p><p>That said, sometimes shopping for mum-worthy gifts can be an insanely tricky task, as more often than not, spending big doesn't always equate to a useful gift. With that in mind, I've compiled a list of 12 great tech-focused buys that'll not only improve mum's daily routine, but keep your costs low, as these items are all under AU$200. </p><p>In fact, many of these picks are on special, and I've deliberately chosen a wide variety of items that includes top-notch tech gizmos like smart trackers, power banks, wireless headphones and security cameras. As a tech writer, I've also included some of my favourite devices that I use almost every day, such as a <a href="https://www.tomsguide.com/tablets/e-readers/kindle-scribe-2024-reviewhttps://www.tomsguide.com/tablets/e-readers/kindle-2024-review">Kindle (2024)</a>, a <a href="https://www.amazon.com.au/Laser-Wireless-Bluetooth-Adjustable-Playtime/dp/B0DFQFLSFY/ref=sr_1_5" target="_blank">Laser Bluetooth Sleep Mask</a>, and a <a href="https://www.amazon.com.au/Electronic-Auto-Rotate-Slideshow-Mountable-Remotely/dp/B0DZWS38S2" target="_blank">Frameo digital picture frame</a> (which my MIL may or may not be getting this year 👀).</p><p>All of these items have 4+ star ratings from Amazon users, and if you have a <a href="https://www.amazon.com.au/tryprimefree">Prime membership</a>, you can rest assured that your Mother's Day gift will get delivered quickly to most major metro locations in Australia. (If you don't have a Prime membership, you can sign up for a <a href="https://www.amazon.com.au/tryprimefree" target="_blank">free 30-day trial here</a>.)</p><p>If mum has a preferred hobby — whether that's baking, gardening or beauty, I've also rounded up the best Mother's Day<a href="https://www.tomsguide.com/home/gardening/im-taking-mothers-day-outside-this-year-here-are-12-gardening-gifts-that-are-too-good-to-miss" target="_blank"> gardening gifts</a>, <a href="https://www.tomsguide.com/wellness/stop-scrolling-ive-found-24-of-the-best-hair-and-skincare-deals-for-mum-this-mothers-day-2026" target="_blank">skincare and haircare deals</a>, and <a href="https://www.tomsguide.com/home/home-appliances/stop-scrolling-ive-found-12-home-and-kitchen-gadgets-that-will-instantly-upgrade-mums-house-this-mothers-day-2026" target="_blank">home and kitchen appliances</a>, too. </p><p>Enough preamble — here are the best Mother's Day tech gifts under AU$200 that I've found. </p>        <div class="featured_product_block featured_block_hero" data-id="64ecdd8e-9cff-4945-940d-c342cce32986">            <a href="https://www.amazon.com.au/All-new-Blink-Video-Doorbell-plug/dp/B0G358PTFV" data-model-name="Video Doorbell + Mini Camera System" 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/2gAvSCcsXAbcKDUXk48yJo.jpg" alt="Products on white background"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Blink</div>                                        <div class="featured__title">Video Doorbell + Mini Camera System</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="8552d390-ba80-4a10-9afb-abdc6a2183c3">            <a href="https://www.amazon.com.au/KODAK-Pixpro-C1-Ultra-Compact-Digital/dp/B0DY89Z83G" data-model-name="Pixpro C1 Digital Camera" 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/CPkSJq8rbm5ehdTHHE6wSo.jpg" alt="Products on white background"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Kodak</div>                                        <div class="featured__title">Pixpro C1 Digital Camera</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="a1e2b75f-181b-41c2-8bdd-eb98a712fdd9">            <a href="https://www.amazon.com.au/INIU-Smallest-20000mAh-Portable-Compatible/dp/B0DCMW8SJV" data-model-name="P512 Mini Power Bank (20,000mAh)" 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/vj2ao3u3VTQMmTaYeDUaVo.jpg" alt="Products on white background"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>INIU</div>                                        <div class="featured__title">P512 Mini Power Bank (20,000mAh)</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="4bf20484-916b-44a8-bcad-2935f7d1cc3a">            <a href="https://www.amazon.com.au/UGREEN-FineTrack-Bluetooth-Rechargeable-Compatible/dp/B0FG7MXDH6" data-model-name="Finetrack G Smart Finder (4-Pack)" 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/rNhnykDpQwARUFezkbvrPo.jpg" alt="Products on white background"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Ugreen</div>                                        <div class="featured__title">Finetrack G Smart Finder (4-Pack)</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="c1e4369e-398c-4f13-af50-944359d24dca">            <a href="https://www.amazon.com.au/TP-Link-Tapo-Detection-Notification-C211/dp/B0CHFG8XBZ" data-model-name="Tapo C211 Smart Home Security Camera" 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/qkDYYuxzRFkDe4hKFZ9oVo.jpg" alt="Products on white background"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>TP-Link</div>                                        <div class="featured__title">Tapo C211 Smart Home Security Camera</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="fd54108c-8215-4793-8b67-5327efdcd213">            <a href="https://www.amazon.com.au/New-Amazon-Kindle-2024-release/dp/B0CP31QS6R" data-model-name="Kindle (2024, Matcha)" 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/vRpSxffHQbr6sGy6eXDsPo.jpg" alt="Products on white background"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Kindle (2024, Matcha)</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="0080ed06-8531-4be9-9013-f92bf70ec23e">            <a href="https://www.amazon.com.au/Amazon-speaker-echo-dot-max-amethyst/dp/B0DKLT748X" data-model-name="Echo Dot Max" 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/aRMGCmMogCWbNchTVbDKQo.jpg" alt="Products on white background"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Amazon</div>                                        <div class="featured__title">Echo Dot Max</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="136374f2-56b9-4f85-94ea-98a94d737d54">            <a href="https://www.amazon.com.au/soundcore-Cancelling-Headphones-Bluetooth-Transparency/dp/B0C3KWT5V6" data-model-name="Q20i Noise Cancelling Headphones" 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/Ur2HHqVMhgU6U2pxhp8aRo.jpg" alt="Products on white background"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Soundcore</div>                                        <div class="featured__title">Q20i Noise Cancelling Headphones</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="787e8ac5-42e3-4327-afa9-329b2750de06">            <a href="https://www.amazon.com.au/Govee-Corner-Standing-Lamps136cm-Bedroom/dp/B09TQG813W" data-model-name="RGBIC Smart Corner Floor Lamp" 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/3eTCFiCZYcc44CPxJiDHNo.jpg" alt="Products on white background"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Govee</div>                                        <div class="featured__title">RGBIC Smart Corner Floor Lamp</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="cd6a72da-5daf-49ac-ad8e-43a9d5471f0e">            <a href="https://www.amazon.com.au/Belkin-Compatible-Wireless-Charging-Convertible/dp/B0FMWMTZTX" data-model-name="3-in-1 Qi2 Wireless Charging Station" 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/YraWrebkTDoUQYAYYd2fVo.jpg" alt="Products on white background"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Belkin</div>                                        <div class="featured__title">3-in-1 Qi2 Wireless Charging Station</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="a2ff5d07-c5d5-406e-b5fa-b8de200adf7b">            <a href="https://www.amazon.com.au/Laser-Wireless-Bluetooth-Adjustable-Playtime/dp/B0DFQFLSFY/ref=sr_1_5" data-model-name="Bluetooth Sleep Mask Headphones" 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/bQh2NbZUfrZL5kmQE73NNo.jpg" alt="Products on white background"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Laser</div>                                        <div class="featured__title">Bluetooth Sleep Mask Headphones</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="4c4e06e5-af32-4692-876a-1402a514122a">            <a href="https://www.amazon.com.au/Electronic-Auto-Rotate-Slideshow-Mountable-Remotely/dp/B0DZWS38S2" data-model-name="Digital Picture Frame (10.1 inch)" 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/nJAxgzMnfYokcT5U8VS6Xo.jpg" alt="Products on white background"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Frameo</div>                                        <div class="featured__title">Digital Picture Frame (10.1 inch)</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OzL3le"></div>                            </div>                            <script src="https://kwizly.com/embed/OzL3le.js" async></script>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I've spent two years testing 300 cameras, earbuds, drones, keyboards and more — here are my favorites from each category ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/ive-spent-two-years-testing-300-cameras-earbuds-drones-keyboards-and-more-here-are-my-favorites-from-each-category</link>
                                                                            <description>
                            <![CDATA[ As a reviews writer, I've tested many tech products, including but not limited to cameras, keyboards, boots, and more. Here are the ones I've loved the most. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">B5RvXqvGT7MZc3MhJooC5U</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jNV52VRvj6EDu8JSZ5KdFU-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 15 Apr 2026 13:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/jNV52VRvj6EDu8JSZ5KdFU-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Keen Zionic NXT Mid Waterproof boots and a Fujifilm X-T50 mirrorless camera]]></media:description>                                                            <media:text><![CDATA[Keen Zionic NXT Mid Waterproof boots and a Fujifilm X-T50 mirrorless camera]]></media:text>
                                <media:title type="plain"><![CDATA[Keen Zionic NXT Mid Waterproof boots and a Fujifilm X-T50 mirrorless camera]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jNV52VRvj6EDu8JSZ5KdFU-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Last week marked my second anniversary as a reviews writer at Tom's Guide. For the last two years, I've had my fingers in many pies and I've juggled many plates, and I've reviewed nearly every type of product. From <a href="https://www.tomsguide.com/best-picks/best-mechanical-keyboards">mechanical keyboards</a> and <a href="">mirrorless cameras</a> to <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">drones</a> and <a href="https://www.tomsguide.com/best-picks/best-hiking-boots">hiking boots</a>, I've covered everything. It's made me more knowledgable and, along the way, I hope I've succeeded in sharing that knowledge with you, and have helped you make better buying decisions.</p><p>I've wanted to be a journalist and a writer for as long as I can remember, and I'm very privileged that I get to share my writing with you, dear reader, almost every single day. You'd be as surprised as I was when I counted the total number of products I've reviewed so far: it's just under 300. That's crazy to me, so I thought I'd share my favorite products from each category with you today.</p><p>I'll cover my favorite from each category, not my top-rated. Even though some products on this list may not have necessarily received 4.5 or 5 stars from me, I keep coming back to them. The last two years have been nothing short of awesome, and I can't wait to see what other products I get my hands on this year and the next and the next!</p><h2 class="article-body__section" id="section-my-favorite-camera"><span>My favorite camera</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="Cybky3Qgs9L49dvpLdgaGH" name="Fujifilm_XT50_14.JPG" alt="A Fujifilm X-T50 camera in the charcoal grey colorway" src="https://cdn.mos.cms.futurecdn.net/Cybky3Qgs9L49dvpLdgaGH.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>I've reviewed many of the <a href="https://www.tomsguide.com/us/best-cameras,review-2196.html">best cameras</a> and <a href="https://www.tomsguide.com/us/best-mirrorless-cameras,review-2221.html#section-the-best-mirrorless-camera-for-wildlife-photography">mirrorless cameras</a> as photography is my passion and one of my favorite hobbies. Even though I've tested expensive Leicas and 100MP medium format beasts, my favorite camera is the <a href="https://www.tomsguide.com/cameras-photography/fujifilm-x-t50-review">Fujifilm X-T50</a>. It's the first camera I ever tested at Tom's Guide and I loved it so much that I bought it with my own money — and <a href="https://www.tomsguide.com/cameras-photography/mirrorless-cameras/i-didnt-realize-how-much-i-loved-the-fujifilm-x-t50-until-i-photographed-my-trip-to-iceland-and-it-blew-me-away">even took it to Iceland with me</a>.</p><div class="product"><a data-dimension112="e073ef7e-d8f2-4799-a13e-456c3467e7b1" data-action="Deal Block" data-label="The Fujifilm X-T50 succeeds and improves on the X-T30 II, and it packs a punch with a huge 40.2MP sensor, excellent in-body image stabilization and reliable autofocus. It's also the first Fuji camera to sport a dedicated film simulation dial on its body for maximum (and easy-to-reach) creativity." data-dimension48="The Fujifilm X-T50 succeeds and improves on the X-T30 II, and it packs a punch with a huge 40.2MP sensor, excellent in-body image stabilization and reliable autofocus. It's also the first Fuji camera to sport a dedicated film simulation dial on its body for maximum (and easy-to-reach) creativity." data-dimension25="$1399" href="https://www.amazon.com/Fujifilm-Mirrorless-Digital-Camera-XF16-50mmF2-8-4-8/dp/B0D3X8LLNT/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1264px;"><p class="vanilla-image-block" style="padding-top:78.01%;"><img id="HbwuHEixisNVZfUN754aZi" name="X-T50 deal body" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HbwuHEixisNVZfUN754aZi.png" mos="" align="middle" fullscreen="" width="1264" height="986" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Fujifilm X-T50 succeeds and improves on the X-T30 II, and it packs a punch with a huge 40.2MP sensor, excellent in-body image stabilization and reliable autofocus. It's also the first Fuji camera to sport a dedicated film simulation dial on its body for maximum (and easy-to-reach) creativity.<a class="view-deal button" href="https://www.amazon.com/Fujifilm-Mirrorless-Digital-Camera-XF16-50mmF2-8-4-8/dp/B0D3X8LLNT/" target="_blank" rel="nofollow" data-dimension112="e073ef7e-d8f2-4799-a13e-456c3467e7b1" data-action="Deal Block" data-label="The Fujifilm X-T50 succeeds and improves on the X-T30 II, and it packs a punch with a huge 40.2MP sensor, excellent in-body image stabilization and reliable autofocus. It's also the first Fuji camera to sport a dedicated film simulation dial on its body for maximum (and easy-to-reach) creativity." data-dimension48="The Fujifilm X-T50 succeeds and improves on the X-T30 II, and it packs a punch with a huge 40.2MP sensor, excellent in-body image stabilization and reliable autofocus. It's also the first Fuji camera to sport a dedicated film simulation dial on its body for maximum (and easy-to-reach) creativity." data-dimension25="$1399">View Deal</a></p></div><p>The X-T50 packs everything I need in a compact, travel-friendly camera. Its 40.2MP sensor captures stunning photos with vivid colors and plenty of detail. I love the film simulation dial which lets me quickly swap between my favorite recipes, and the camera's straightforward control scheme makes it extremely easy to use. Featuring outstanding 7-stops of IBIS and boasting the ability to record 6.2K/30fps video, it's the best camera I've used — and it looks stunning too.</p><h2 class="article-body__section" id="section-my-favorite-drone"><span>My favorite drone</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="R6yAZa8SKMfTqh5i4sqAhN" name="DJI_mavic_4_Pro_ 2.JPG" alt="A dark grey DJI Mavic 4 Pro drone" src="https://cdn.mos.cms.futurecdn.net/R6yAZa8SKMfTqh5i4sqAhN.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've reviewed every quadcopter that appears on our <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones </a>buying guide, and these nifty aerial photography devices are some of my favorite products to test. After having spent many, many hours flying drones, my top pick has got to be the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review">DJI Mavic 4 Pro</a> which is basically a Hasselblad with wings. In its triple camera system, you'll find a 100MP Hasselblad lens that takes the most beautiful photos and 6K/60fps videos a consumer drone possibly can.</p><div class="product"><a data-dimension112="3ac096e6-4e1e-4971-9e7e-30464b6992e6" data-action="Deal Block" data-label="The DJI Mavic 4 Pro is the best consumer drone money can buy right now, period. It improves on its predecessor by introducing 6K/60fps video, 100MP stills powered by a Hasselblad camera, and a brand new RC Pro 2 controller that makes flying a breeze. With a long flight time and 5-star performance across the board, it’s the ideal drone for commercial and personal use." data-dimension48="The DJI Mavic 4 Pro is the best consumer drone money can buy right now, period. It improves on its predecessor by introducing 6K/60fps video, 100MP stills powered by a Hasselblad camera, and a brand new RC Pro 2 controller that makes flying a breeze. With a long flight time and 5-star performance across the board, it’s the ideal drone for commercial and personal use." data-dimension25="$2199" href="https://www.adorama.com/dji-mavic-4-pro-drone-rc-2/p/djimavic4pro" 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:78.87%;"><img id="FLhhHkzuKaHKo4MFwNfgDC" name="DJI Mavic 4 Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FLhhHkzuKaHKo4MFwNfgDC.jpg" mos="" align="middle" fullscreen="" width="1500" height="1183" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Mavic 4 Pro is the best consumer drone money can buy right now, period. It improves on its predecessor by introducing 6K/60fps video, 100MP stills powered by a Hasselblad camera, and a brand new RC Pro 2 controller that makes flying a breeze. With a long flight time and 5-star performance across the board, it’s the ideal drone for commercial and personal use.<a class="view-deal button" href="https://www.adorama.com/dji-mavic-4-pro-drone-rc-2/p/djimavic4pro" target="_blank" rel="nofollow" data-dimension112="3ac096e6-4e1e-4971-9e7e-30464b6992e6" data-action="Deal Block" data-label="The DJI Mavic 4 Pro is the best consumer drone money can buy right now, period. It improves on its predecessor by introducing 6K/60fps video, 100MP stills powered by a Hasselblad camera, and a brand new RC Pro 2 controller that makes flying a breeze. With a long flight time and 5-star performance across the board, it’s the ideal drone for commercial and personal use." data-dimension48="The DJI Mavic 4 Pro is the best consumer drone money can buy right now, period. It improves on its predecessor by introducing 6K/60fps video, 100MP stills powered by a Hasselblad camera, and a brand new RC Pro 2 controller that makes flying a breeze. With a long flight time and 5-star performance across the board, it’s the ideal drone for commercial and personal use." data-dimension25="$2199">View Deal</a></p></div><p>What I love most about the Mavic 4 Pro is the <a href="https://www.tomsguide.com/cameras-photography/drones/i-just-tested-the-new-dji-rc-pro-2-drone-controller-and-its-a-beast-for-content-creation-on-the-fly">RC Pro 2 controller</a>, which feels revolutionary. It's extremely bright with a peak brightness of 2,000 nits, and highly responsive. And because the Mavic 4 Pro has a 'Infinity Gimbal' capable of full 360° rotation, the RC Pro 2's screen rotates and puts the drone into vertical shooting mode, negating the need to manually toggle the orientation. All in all, it's a solid package that's well worth the premium.</p><h2 class="article-body__section" id="section-my-favorite-earbuds"><span>My favorite earbuds</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="tvZF87w5dAniyx6zSwXbZb" name="Sony_WF_C710N_ 8.JPG" alt="A pair of Glass Blue Sony WF-C710N wireless earbuds." src="https://cdn.mos.cms.futurecdn.net/tvZF87w5dAniyx6zSwXbZb.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>Alongside cameras and drones, I thoroughly enjoy testing audio gear as I love music and analyzing every aspect of a soundstage. The <a href="https://www.tomsguide.com/audio/earbuds/sony-wf-c710n-wireless-earbuds-review">Sony WF-C710N</a> are my favorite earbuds I've tested so far, and it has a lot to do with their sleek, see-through design and powerful sound quality. They give the pricier <a href="https://www.tomsguide.com/audio/earbuds/bose-quietcomfort-earbuds-2024-review">Bose QuietComforts</a> a run for their money, to be honest.</p><div class="product"><a data-dimension112="c25a82e2-9693-4fd8-b81d-1aa21534692f" data-action="Deal Block" data-label="The Sony WF-C710Ns build on the success of the WF-C700Ns, introducing touch controls, wear detection and new, stylish colorways. The earbuds make basslines sound powerful and vocals sound clear, and a user-friendly app lets you customize the EQ to your heart’s content." data-dimension48="The Sony WF-C710Ns build on the success of the WF-C700Ns, introducing touch controls, wear detection and new, stylish colorways. The earbuds make basslines sound powerful and vocals sound clear, and a user-friendly app lets you customize the EQ to your heart’s content." data-dimension25="$119" href="https://www.amazon.com/dp/B0DWHB886R/" 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="r3fsKfXfrYb8dNBNK7cdoP" name="Sony C710N" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/r3fsKfXfrYb8dNBNK7cdoP.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Sony WF-C710Ns build on the success of the WF-C700Ns, introducing touch controls, wear detection and new, stylish colorways. The earbuds make basslines sound powerful and vocals sound clear, and a user-friendly app lets you customize the EQ to your heart’s content.<a class="view-deal button" href="https://www.amazon.com/dp/B0DWHB886R/" target="_blank" rel="nofollow" data-dimension112="c25a82e2-9693-4fd8-b81d-1aa21534692f" data-action="Deal Block" data-label="The Sony WF-C710Ns build on the success of the WF-C700Ns, introducing touch controls, wear detection and new, stylish colorways. The earbuds make basslines sound powerful and vocals sound clear, and a user-friendly app lets you customize the EQ to your heart’s content." data-dimension48="The Sony WF-C710Ns build on the success of the WF-C700Ns, introducing touch controls, wear detection and new, stylish colorways. The earbuds make basslines sound powerful and vocals sound clear, and a user-friendly app lets you customize the EQ to your heart’s content." data-dimension25="$119">View Deal</a></p></div><p>With up to 33.5 hours of battery life and highly effective ANC that rivals Bose, the WF-C710Ns are some of the finest buds you can get for under $120. I haven't stopped thinking about them since I tested them. Alongside their good looks, the earbuds also boast incredible bass response even though they're tiny, and deliver consistent sound across genres.</p><h2 class="article-body__section" id="section-my-favorite-headphones"><span>My favorite headphones</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="kC6siR6S2Cwp2ScDKWL2Ti" name="JLab_Epic_Lux_Lab_Edition_.JPG" alt="Black JLab Epic Lux Lab Edition over-ear headphones" src="https://cdn.mos.cms.futurecdn.net/kC6siR6S2Cwp2ScDKWL2Ti.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>Over-ear headphones are my go-to as I find them more comfortable than in-ear buds. Though I use the Marshall Monitor IIIs every day, I didn't have the pleasure of reviewing them, so my favorite headphones that I've personally reviewed are the <a href="https://www.tomsguide.com/audio/over-ear-headphones/jlab-epic-lux-lab-edition-review">JLab Epic Lux Lab Editions</a>. I adore these cans as they're extremely comfortable, thanks to their plush faux leather ear cushions and light weight.</p><div class="product"><a data-dimension112="1baa1f35-718e-4382-957f-d5428b8bdd82" data-action="Deal Block" data-label="The JLab Epic Lux Lab Edition headphones pack a punch with their 32mm dynamic drivers that produce a wide soundstage, and you get active noise cancelation and up to 90 hours of battery life. Most genres sound fantastic and their plush earcups and mesh headband ensure you can keep listening for long periods of time." data-dimension48="The JLab Epic Lux Lab Edition headphones pack a punch with their 32mm dynamic drivers that produce a wide soundstage, and you get active noise cancelation and up to 90 hours of battery life. Most genres sound fantastic and their plush earcups and mesh headband ensure you can keep listening for long periods of time." data-dimension25="$199" href="https://www.amazon.com/JLab-Epic-Wireless-Headphones-Graphite/dp/B0DRDNJNTD/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:943px;"><p class="vanilla-image-block" style="padding-top:159.07%;"><img id="naab9kQoe9jnyUz73sJU8J" name="Jlab-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/naab9kQoe9jnyUz73sJU8J.jpg" mos="" align="middle" fullscreen="" width="943" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The JLab Epic Lux Lab Edition headphones pack a punch with their 32mm dynamic drivers that produce a wide soundstage, and you get active noise cancelation and up to 90 hours of battery life. Most genres sound fantastic and their plush earcups and mesh headband ensure you can keep listening for long periods of time.<a class="view-deal button" href="https://www.amazon.com/JLab-Epic-Wireless-Headphones-Graphite/dp/B0DRDNJNTD/" target="_blank" rel="nofollow" data-dimension112="1baa1f35-718e-4382-957f-d5428b8bdd82" data-action="Deal Block" data-label="The JLab Epic Lux Lab Edition headphones pack a punch with their 32mm dynamic drivers that produce a wide soundstage, and you get active noise cancelation and up to 90 hours of battery life. Most genres sound fantastic and their plush earcups and mesh headband ensure you can keep listening for long periods of time." data-dimension48="The JLab Epic Lux Lab Edition headphones pack a punch with their 32mm dynamic drivers that produce a wide soundstage, and you get active noise cancelation and up to 90 hours of battery life. Most genres sound fantastic and their plush earcups and mesh headband ensure you can keep listening for long periods of time." data-dimension25="$199">View Deal</a></p></div><p>The Epic Lux Lab Editions sound fantastic too, boasting a refined and well-balanced sound profile. The wide soundstage features great sub- and mid-bass, clean and crisp treble, and outstanding lows and mids. Also packing effective ANC and long battery life of up to 90 hours (ANC off), it's hard to beat these mid-range headphones.</p><h2 class="article-body__section" id="section-my-favorite-speaker"><span>My favorite speaker</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="3CYoYoEcxdUdh2cJwmrusH" name="Marshall_Bromley750_ 7.JPG" alt="A black and brass Marshall Bromley 750 party speaker" src="https://cdn.mos.cms.futurecdn.net/3CYoYoEcxdUdh2cJwmrusH.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>For this category, I was spoiled for choice. I could have picked any of the <a href="https://www.tomsguide.com/us/best-bluetooth-speakers,review-1982.html">best portable Bluetooth speakers</a> I've tested but instead, I chose to go for a different kind of speaker — a party speaker. The <a href="https://www.tomsguide.com/audio/bluetooth-speakers/marshall-bromley-750-review">Marshall Bromley 750</a> is my favorite speaker I've tested yet, and though it has a very specific use case, <a href="https://www.tomsguide.com/audio/bluetooth-speakers/as-a-guitarist-and-an-audiophile-this-is-the-all-in-one-speaker-ive-been-waiting-for">it's the all-in-one speaker I've been waiting for as a guitarist and an audiophile</a>.</p><div class="product"><a data-dimension112="444fdc15-fafe-4320-8ea8-c72b93a0ab60" data-action="Deal Block" data-label="Thanks to a plethora of wired and wireless connectivity options, this party speaker doubles (or triples) as a guitar amp and a karaoke machine, while delivering powerful sound quality when you’re listening to music. A massive 500W power output makes the bass sound loud and refined, while vocals are crystal clear. Sporting Marshall’s trademark premium design and build quality, the Bromley 750 is a force to be reckoned with." data-dimension48="Thanks to a plethora of wired and wireless connectivity options, this party speaker doubles (or triples) as a guitar amp and a karaoke machine, while delivering powerful sound quality when you’re listening to music. A massive 500W power output makes the bass sound loud and refined, while vocals are crystal clear. Sporting Marshall’s trademark premium design and build quality, the Bromley 750 is a force to be reckoned with." data-dimension25="$1299" href="https://www.amazon.com/Marshall-Bromley-Portable-Wireless-Speaker/dp/B0FTZXFVJ1/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1294px;"><p class="vanilla-image-block" style="padding-top:115.92%;"><img id="5VnWQZR5GSzbp9Xz2zLhd9" name="bromley-750-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/5VnWQZR5GSzbp9Xz2zLhd9.jpg" mos="" align="middle" fullscreen="" width="1294" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Thanks to a plethora of wired and wireless connectivity options, this party speaker doubles (or triples) as a guitar amp and a karaoke machine, while delivering powerful sound quality when you’re listening to music. A massive 500W power output makes the bass sound loud and refined, while vocals are crystal clear. Sporting Marshall’s trademark premium design and build quality, the Bromley 750 is a force to be reckoned with.<a class="view-deal button" href="https://www.amazon.com/Marshall-Bromley-Portable-Wireless-Speaker/dp/B0FTZXFVJ1/" target="_blank" rel="nofollow" data-dimension112="444fdc15-fafe-4320-8ea8-c72b93a0ab60" data-action="Deal Block" data-label="Thanks to a plethora of wired and wireless connectivity options, this party speaker doubles (or triples) as a guitar amp and a karaoke machine, while delivering powerful sound quality when you’re listening to music. A massive 500W power output makes the bass sound loud and refined, while vocals are crystal clear. Sporting Marshall’s trademark premium design and build quality, the Bromley 750 is a force to be reckoned with." data-dimension48="Thanks to a plethora of wired and wireless connectivity options, this party speaker doubles (or triples) as a guitar amp and a karaoke machine, while delivering powerful sound quality when you’re listening to music. A massive 500W power output makes the bass sound loud and refined, while vocals are crystal clear. Sporting Marshall’s trademark premium design and build quality, the Bromley 750 is a force to be reckoned with." data-dimension25="$1299">View Deal</a></p></div><p>The Bromley 750 doubles (or triples) as a guitar amp and a karaoke machine, and it boasts peerless sound quality. The incredible bass response makes you want to headbang while the vibrant treble and crystal clear vocals make you appreciate your favorite artists more than you did before. It also features beautiful integrated LED lighting which dances and reacts to the track you're playing. It's a sound and light show for the price of one.</p><h2 class="article-body__section" id="section-my-favorite-computer-speakers"><span>My favorite computer speakers</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="2tYjsK8nk4p26P3SZpEBMb" name="Edifier_QR65_ 5.JPG" alt="Edifier QR65 gaming and computer speakers in black" src="https://cdn.mos.cms.futurecdn.net/2tYjsK8nk4p26P3SZpEBMb.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 <a href="https://www.tomsguide.com/gaming/gaming-peripherals/edifier-qr65-review">Edifier QR65</a> are the <a href="https://www.tomsguide.com/us/best-computer-speakers,review-6355.html">best desktop speakers</a> I've tested, and I loved them so much that <a href="https://www.tomsguide.com/audio/speakers/edifier-qr65-premium-speakers-from-a-traditionally-budget-brand">they're still sitting on my office desk</a>. Their gorgeous design is a sight to behold as each speaker is lit up with panels of LED lights which look like infinity mirror tunnels. But that's not even their biggest selling point — the sound quality and connectivity options are where it's at.</p><div class="product"><a data-dimension112="30e0781b-ff2d-47c6-b1e9-dbd1a363f103" data-action="Deal Block" data-label="If you want a pair of desktop speakers that not only sound good but look downright fantastic too, the Edifier QR65 should be your port of call. Each speaker features LED panels with customizable lighting, and there are plenty of wireless and wired connectivity options, making them extremely versatile. These well-endowed speakers deliver punchy, meaty bass and clear vocals in video games and while listening to music." data-dimension48="If you want a pair of desktop speakers that not only sound good but look downright fantastic too, the Edifier QR65 should be your port of call. Each speaker features LED panels with customizable lighting, and there are plenty of wireless and wired connectivity options, making them extremely versatile. These well-endowed speakers deliver punchy, meaty bass and clear vocals in video games and while listening to music." data-dimension25="$499" href="https://www.amazon.com/Edifier-QR65-Bookshelf-Bluetooth-Subwoofer/dp/B0CPSNSSB5/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1342px;"><p class="vanilla-image-block" style="padding-top:65.57%;"><img id="dCJL3fBBESpxt3YJK58DkF" name="QR65-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dCJL3fBBESpxt3YJK58DkF.jpg" mos="" align="middle" fullscreen="" width="1342" height="880" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you want a pair of desktop speakers that not only sound good but look downright fantastic too, the Edifier QR65 should be your port of call. Each speaker features LED panels with customizable lighting, and there are plenty of wireless and wired connectivity options, making them extremely versatile. These well-endowed speakers deliver punchy, meaty bass and clear vocals in video games and while listening to music.<a class="view-deal button" href="https://www.amazon.com/Edifier-QR65-Bookshelf-Bluetooth-Subwoofer/dp/B0CPSNSSB5/" target="_blank" rel="nofollow" data-dimension112="30e0781b-ff2d-47c6-b1e9-dbd1a363f103" data-action="Deal Block" data-label="If you want a pair of desktop speakers that not only sound good but look downright fantastic too, the Edifier QR65 should be your port of call. Each speaker features LED panels with customizable lighting, and there are plenty of wireless and wired connectivity options, making them extremely versatile. These well-endowed speakers deliver punchy, meaty bass and clear vocals in video games and while listening to music." data-dimension48="If you want a pair of desktop speakers that not only sound good but look downright fantastic too, the Edifier QR65 should be your port of call. Each speaker features LED panels with customizable lighting, and there are plenty of wireless and wired connectivity options, making them extremely versatile. These well-endowed speakers deliver punchy, meaty bass and clear vocals in video games and while listening to music." data-dimension25="$499">View Deal</a></p></div><p>You've got the option for wired and wireless playback, as well as a built-in GaN charger that can pump out 65W total power to charge your external devices, essentially making the QR65 a power source. The sound is phenomenal in battle sequences as well as dialogue-heavy cutscenes. Oh, and you get hi-res playback for music, so what's not to love?</p><h2 class="article-body__section" id="section-my-favorite-gaming-controller"><span>My favorite gaming controller</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="DfYJSYEjryG3KqPWvQ5fag" name="Turtle_Beach_Victrix_controller_.JPG" alt="A white Turtle Beach Victrix Pro BFG Reloaded controller for the PS5" src="https://cdn.mos.cms.futurecdn.net/DfYJSYEjryG3KqPWvQ5fag.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 LOVE gaming. Yes, the all-caps was necessary. If I have free time on my hands and I'm not spending it with my partner, you'll find me playing RPGs on my <a href="https://www.tomsguide.com/gaming/playstation/ps5-slim">PS5 Slim</a>. While I love the DualSense, the second controller I have is the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/turtle-beach-victrix-pro-bfg-reloaded-review">Turtle Beach Victrix Pro BFG Reloaded</a>. It's extremely customizable thanks to its 11 interchangeable components, and boy is it comfortable for hours and hours on end.</p><div class="product"><a data-dimension112="2d4ae8f8-ec18-46b2-a165-7823eea0db5b" data-action="Deal Block" data-label="The Turtle Beach Victrix Pro BFG Reloaded improves on its predecessor by introducing Hall Effect thumbsticks and triggers with five stop switches. These are extremely responsive and so are the four on-the-fly customizable back buttons. The gamepad’s biggest selling point is its modular design and 11 interchangeable components which make it suitable for nearly every genre." data-dimension48="The Turtle Beach Victrix Pro BFG Reloaded improves on its predecessor by introducing Hall Effect thumbsticks and triggers with five stop switches. These are extremely responsive and so are the four on-the-fly customizable back buttons. The gamepad’s biggest selling point is its modular design and 11 interchangeable components which make it suitable for nearly every genre." data-dimension25="$209" href="https://www.amazon.com/Gaming-Controller-PlayStation-Hall-Effect-Customizable-Console/dp/B0FD6697KT/" 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="xjrw7Rmbwt8MsiCC9cSC6d" name="TB-Victrix-BFGR-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xjrw7Rmbwt8MsiCC9cSC6d.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Turtle Beach Victrix Pro BFG Reloaded improves on its predecessor by introducing Hall Effect thumbsticks and triggers with five stop switches. These are extremely responsive and so are the four on-the-fly customizable back buttons. The gamepad’s biggest selling point is its modular design and 11 interchangeable components which make it suitable for nearly every genre.<a class="view-deal button" href="https://www.amazon.com/Gaming-Controller-PlayStation-Hall-Effect-Customizable-Console/dp/B0FD6697KT/" target="_blank" rel="nofollow" data-dimension112="2d4ae8f8-ec18-46b2-a165-7823eea0db5b" data-action="Deal Block" data-label="The Turtle Beach Victrix Pro BFG Reloaded improves on its predecessor by introducing Hall Effect thumbsticks and triggers with five stop switches. These are extremely responsive and so are the four on-the-fly customizable back buttons. The gamepad’s biggest selling point is its modular design and 11 interchangeable components which make it suitable for nearly every genre." data-dimension48="The Turtle Beach Victrix Pro BFG Reloaded improves on its predecessor by introducing Hall Effect thumbsticks and triggers with five stop switches. These are extremely responsive and so are the four on-the-fly customizable back buttons. The gamepad’s biggest selling point is its modular design and 11 interchangeable components which make it suitable for nearly every genre." data-dimension25="$209">View Deal</a></p></div><p>Featuring four customizable back buttons and highly responsive Hall Effect triggers and thumbsticks, the Victrix Pro BFG is one of the most powerful controllers I've tested. The magnetic components give me a competitive edge in FPS and racing titles, and I love how easy it is to adjust their sensitivity via the user-friendly companion software.</p><h2 class="article-body__section" id="section-my-favorite-gaming-headset"><span>My favorite gaming headset</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="GpfBkyLC7sHowFayYMcEdV" name="Razer_Blackshark_pro 9.JPG" alt="A black Razer BlackShark V3 Pro wireless gaming headset" src="https://cdn.mos.cms.futurecdn.net/GpfBkyLC7sHowFayYMcEdV.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>Alongside the aforementioned Turtle Beach Victrix Pro BFG Reloaded, the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> is also a permanent part of my gaming setup. I haven't used a better <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">gaming headset</a>, as the BlackShark V3 Pro makes my favorite games sound the best they ever have, thanks to its wide soundstage and spatial audio support.</p><div class="product"><a data-dimension112="df547f87-5517-477b-af69-0f4f6c272966" data-action="Deal Block" data-label="Designed for professional gamers, the Razer BlackShark V3 Pro boasts fantastic sound with spatial audio support that gives you a competitive edge. It’s extremely comfortable, features highly effective ANC, and comes with a detachable mic that makes you sound loud and clear. No compromises have been made, and you’re getting your money’s worth." data-dimension48="Designed for professional gamers, the Razer BlackShark V3 Pro boasts fantastic sound with spatial audio support that gives you a competitive edge. It’s extremely comfortable, features highly effective ANC, and comes with a detachable mic that makes you sound loud and clear. No compromises have been made, and you’re getting your money’s worth." data-dimension25="$249" href="https://www.amazon.com/Razer-BlackShark-Wireless-Gaming-Headset-PC/dp/B0F3QDLZKG/" 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="iFdB8fgzyU6X4P2WfMj9QN" name="Razer-BlackShark-V3-Pro-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/iFdB8fgzyU6X4P2WfMj9QN.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Designed for professional gamers, the Razer BlackShark V3 Pro boasts fantastic sound with spatial audio support that gives you a competitive edge. It’s extremely comfortable, features highly effective ANC, and comes with a detachable mic that makes you sound loud and clear. No compromises have been made, and you’re getting your money’s worth.<a class="view-deal button" href="https://www.amazon.com/Razer-BlackShark-Wireless-Gaming-Headset-PC/dp/B0F3QDLZKG/" target="_blank" rel="nofollow" data-dimension112="df547f87-5517-477b-af69-0f4f6c272966" data-action="Deal Block" data-label="Designed for professional gamers, the Razer BlackShark V3 Pro boasts fantastic sound with spatial audio support that gives you a competitive edge. It’s extremely comfortable, features highly effective ANC, and comes with a detachable mic that makes you sound loud and clear. No compromises have been made, and you’re getting your money’s worth." data-dimension48="Designed for professional gamers, the Razer BlackShark V3 Pro boasts fantastic sound with spatial audio support that gives you a competitive edge. It’s extremely comfortable, features highly effective ANC, and comes with a detachable mic that makes you sound loud and clear. No compromises have been made, and you’re getting your money’s worth." data-dimension25="$249">View Deal</a></p></div><p><a href="https://www.tomsguide.com/gaming/clair-obscur-expedition-33-review">Clair Obscur: Expedition 33</a> is one of my favorite games of all time, and trust me when I say the headset makes <em>you </em>feel like <em>you're </em>the one taking down the Paintress. The bass is powerful but never booming so you can feel every explosion, feel the emotion in every dialogue, and appreciate the epic in-game soundtracks. The BlackShark V3 Pro also features the best ANC I've tested on gaming cans, which further aids your immersion.</p><h2 class="article-body__section" id="section-my-favorite-keyboard"><span>My favorite keyboard</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="rFL7g25RFLeTcHVnW2nFub" name="HexGears_A3_16x9" alt="A black Hexgears Immersion A3 TKL hot-swappable mechanical low-profile keyboard" src="https://cdn.mos.cms.futurecdn.net/rFL7g25RFLeTcHVnW2nFub.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>You know the type of product I've reviewed the most? Yes, even more than cameras? It's keyboards. That's not surprising given that there are so many out there — mechanical, Hall Effect, membrane, you name it. The one I keep coming back to and the one I use when I work from home is the <a href="https://www.tomsguide.com/computing/peripherals/hexgears-immersion-a3-tkl-review">Hexgears Immersion A3 TKL</a>. It's quiet, it's sleek, and it's a joy to type on.</p><div class="product"><a data-dimension112="7989878e-8a95-4a52-8589-be19917d0445" data-action="Deal Block" data-label="The Hexgears Immersion A3 TKL is a fantastic, low-profile keyboard for productivity, thanks to its super-silent Kailh linear switches. Its 1,000Hz polling rate is also well-suited to casual gaming, and its sturdy build and customizable RGB and TFT screen make it a joy to use." data-dimension48="The Hexgears Immersion A3 TKL is a fantastic, low-profile keyboard for productivity, thanks to its super-silent Kailh linear switches. Its 1,000Hz polling rate is also well-suited to casual gaming, and its sturdy build and customizable RGB and TFT screen make it a joy to use." data-dimension25="$89" href="https://www.amazon.com/Hexgears-Immersion-A3-Low-Profile-Hot-Swappable/dp/B0D986JN9F/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1497px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="cJXmt94ox3BRqMu7Lk5oyk" name="Hexgears Immersion A3 TKL" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/cJXmt94ox3BRqMu7Lk5oyk.jpg" mos="" align="middle" fullscreen="" width="1497" height="1497" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Hexgears Immersion A3 TKL is a fantastic, low-profile keyboard for productivity, thanks to its super-silent Kailh linear switches. Its 1,000Hz polling rate is also well-suited to casual gaming, and its sturdy build and customizable RGB and TFT screen make it a joy to use.<a class="view-deal button" href="https://www.amazon.com/Hexgears-Immersion-A3-Low-Profile-Hot-Swappable/dp/B0D986JN9F/" target="_blank" rel="nofollow" data-dimension112="7989878e-8a95-4a52-8589-be19917d0445" data-action="Deal Block" data-label="The Hexgears Immersion A3 TKL is a fantastic, low-profile keyboard for productivity, thanks to its super-silent Kailh linear switches. Its 1,000Hz polling rate is also well-suited to casual gaming, and its sturdy build and customizable RGB and TFT screen make it a joy to use." data-dimension48="The Hexgears Immersion A3 TKL is a fantastic, low-profile keyboard for productivity, thanks to its super-silent Kailh linear switches. Its 1,000Hz polling rate is also well-suited to casual gaming, and its sturdy build and customizable RGB and TFT screen make it a joy to use." data-dimension25="$89">View Deal</a></p></div><p>The Immersion A3 TKL features lovely, soft, matte polycarbonate plastic (PC) keycaps that feel great to touch and type on. I can type quickly thanks to the highly responsive Kailh White Rain linear switches, and the very low-profile design means my hands don't feel fatigued. One of my favorite features, though, is the customizable TFT screen which I can display GIFs on to add some personality to my workspace.</p><h2 class="article-body__section" id="section-my-favorite-mouse"><span>My favorite mouse</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="V7W95XZzeiyaZ7x4QznsZB" name="Corsair_M75_.JPG" alt="A Glacier Blue Corsair M75 wireless gaming mouse for Mac" src="https://cdn.mos.cms.futurecdn.net/V7W95XZzeiyaZ7x4QznsZB.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>Having the <a href="https://www.tomsguide.com/best-picks/best-mouse">best mouse</a> at my disposal is integral to my work setup, regardless of whether I'm working from home or in the office. Though I've tested a bunch, my favorite is the <a href="https://www.tomsguide.com/computing/peripherals/corsair-m75-mac-mouse-review">Corsair M75 for Mac</a>, which is currently a permanent part of my WFH setup. It's the Mac-specific variant of the base M75 and comes in a stunning Glacier Blue color — a sight for sore eyes, really.</p><div class="product"><a data-dimension112="906b5510-32c3-4dcd-8400-ca08f36ba127" data-action="Deal Block" data-label="The Corsair M75 for Mac is designed exceptionally well, with responsive optical switches. This minimalist-looking mouse features 26,000 DPI sensitivity that you can change on the fly, making it suitable for all kinds of gaming titles. It’s very comfortable to use for long hours, and the detailed iCUE software offers in-depth customization." data-dimension48="The Corsair M75 for Mac is designed exceptionally well, with responsive optical switches. This minimalist-looking mouse features 26,000 DPI sensitivity that you can change on the fly, making it suitable for all kinds of gaming titles. It’s very comfortable to use for long hours, and the detailed iCUE software offers in-depth customization." data-dimension25="$129" href="https://www.apple.com/shop/product/hryt2zm/a/corsair-m75-wireless-lightweight-rgb-gaming-mouse" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="RkKoGb3Cd42vjwqQSo5PH3" name="Corsair M75 Mac deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/RkKoGb3Cd42vjwqQSo5PH3.jpg" mos="" align="middle" fullscreen="" width="2000" height="2000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Corsair M75 for Mac is designed exceptionally well, with responsive optical switches. This minimalist-looking mouse features 26,000 DPI sensitivity that you can change on the fly, making it suitable for all kinds of gaming titles. It’s very comfortable to use for long hours, and the detailed iCUE software offers in-depth customization.<a class="view-deal button" href="https://www.apple.com/shop/product/hryt2zm/a/corsair-m75-wireless-lightweight-rgb-gaming-mouse" target="_blank" rel="nofollow" data-dimension112="906b5510-32c3-4dcd-8400-ca08f36ba127" data-action="Deal Block" data-label="The Corsair M75 for Mac is designed exceptionally well, with responsive optical switches. This minimalist-looking mouse features 26,000 DPI sensitivity that you can change on the fly, making it suitable for all kinds of gaming titles. It’s very comfortable to use for long hours, and the detailed iCUE software offers in-depth customization." data-dimension48="The Corsair M75 for Mac is designed exceptionally well, with responsive optical switches. This minimalist-looking mouse features 26,000 DPI sensitivity that you can change on the fly, making it suitable for all kinds of gaming titles. It’s very comfortable to use for long hours, and the detailed iCUE software offers in-depth customization." data-dimension25="$129">View Deal</a></p></div><p>With a maximum DPI of 26,000 and a 1,000Hz polling rate, the M75 is excellent for casual gaming, and the one to beat when it comes to productivity. Its buttons are clicky and highly responsive, and they're wide enough for maximum comfort too. The shape of the mouse feels lovely under my palm. I have no qualms with the M75 — it's one of the best mice money can buy today.</p><h2 class="article-body__section" id="section-my-favorite-monitor"><span>My favorite monitor</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="QNRDFZeT3YNmyev77Wgxq4" name="MSI_QD_OLED_14.JPG" alt="An MSI MPG 272URX QD-OLED gaming monitor" src="https://cdn.mos.cms.futurecdn.net/QNRDFZeT3YNmyev77Wgxq4.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 spend up to eight hours five days a week looking at a screen — or three, if I'm in the office. As the person responsible for lab testing <a href="https://www.tomsguide.com/best-picks/best-monitors">monitors</a> for the reviews team in the U.K., I've reviewed my fair share, and none have come close to the <a href="https://www.tomsguide.com/computing/monitors/msi-mpg-272urx-qd-oled-monitor-review">MSI MPG 272URX QD-OLED</a>. It's one of the most powerful monitors I've tested, for both gaming and productivity. It's a hybrid beast.</p><div class="product"><a data-dimension112="95af39b3-e399-4653-9ff5-7e6967418f5c" data-action="Deal Block" data-label="The MSI MPG 272URX QD-OLED is a powerful monitor for work and play. It delivers vivid colors in gaming and boasts great color accuracy for photo/video editing. Its 240Hz refresh rate and 0.03ms response time ensure buttery smooth gameplay, making it great for competitive gaming." data-dimension48="The MSI MPG 272URX QD-OLED is a powerful monitor for work and play. It delivers vivid colors in gaming and boasts great color accuracy for photo/video editing. Its 240Hz refresh rate and 0.03ms response time ensure buttery smooth gameplay, making it great for competitive gaming." data-dimension25="$1099" href="https://www.amazon.com/MSI-MPG-272URX-QD-OLED-Adaptive-Synch/dp/B0DWYC5S8X/" 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="rFrCdYdcaTzPfcK67PTWt8" name="MSI MPG 272URX QD-OLED" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rFrCdYdcaTzPfcK67PTWt8.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The MSI MPG 272URX QD-OLED is a powerful monitor for work and play. It delivers vivid colors in gaming and boasts great color accuracy for photo/video editing. Its 240Hz refresh rate and 0.03ms response time ensure buttery smooth gameplay, making it great for competitive gaming.<a class="view-deal button" href="https://www.amazon.com/MSI-MPG-272URX-QD-OLED-Adaptive-Synch/dp/B0DWYC5S8X/" target="_blank" rel="nofollow" data-dimension112="95af39b3-e399-4653-9ff5-7e6967418f5c" data-action="Deal Block" data-label="The MSI MPG 272URX QD-OLED is a powerful monitor for work and play. It delivers vivid colors in gaming and boasts great color accuracy for photo/video editing. Its 240Hz refresh rate and 0.03ms response time ensure buttery smooth gameplay, making it great for competitive gaming." data-dimension48="The MSI MPG 272URX QD-OLED is a powerful monitor for work and play. It delivers vivid colors in gaming and boasts great color accuracy for photo/video editing. Its 240Hz refresh rate and 0.03ms response time ensure buttery smooth gameplay, making it great for competitive gaming." data-dimension25="$1099">View Deal</a></p></div><p>With its 240Hz refresh rate, 0.03ms response time, and 4K QD-OLED 27-inch panel, it's an utter delight to game and work on. Colors are bright, vivid and accurate, while there's plenty of detail revealed in the shadows and dark areas, especially when playing horror games. Games feel immersive and you can lose yourself while playing them. Equally, you can lock into work because the 27-inch panel lets you make quick work of navigating massive spreadsheets and long threads on Slack.</p><h2 class="article-body__section" id="section-my-favorite-shoes"><span>My favorite shoes</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="2FskxujEacK367StSBf3Ug" name="Keen_Zionic_NXT_ 5.JPG" alt="A pair of Keen Zionic NXT Mid Waterproof hiking boots" src="https://cdn.mos.cms.futurecdn.net/2FskxujEacK367StSBf3Ug.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>Keen knows how to make a good pair of <a href="https://www.tomsguide.com/best-picks/best-hiking-boots">hiking boots</a>, and my favorites that I've reviewed (and still use every day) are the <a href="https://www.tomsguide.com/wellness/fitness/keen-zionic-nxt-mid-waterproof-hiking-boots-review">Keen Zionic NXT Mid Waterproof</a>. When I reviewed them in fall 2025, I tested them by walking 50 miles through streams, on mountains and even a glacier in Iceland, and because of how well they performed, they became my daily drivers (well, when I'm not wearing my Doc Martens, at least).</p><div class="product"><a data-dimension112="b40d5e54-e497-4428-92a5-a23da7d0e2f1" data-action="Deal Block" data-label="The Keen Zionic NXT Mid Waterproofs have quickly become my go-to hiking boots. They’re extremely comfortable and can be worn straight out of the box. There’s plenty of space inside to wear two layers of socks, and they fit snugly. Their 4mm multi-directional lugs provide great grip in both wet and dry conditions. While they don’t utilize Gore-Tex, Keen’s proprietary waterproofing works very well and keeps your feet dry." data-dimension48="The Keen Zionic NXT Mid Waterproofs have quickly become my go-to hiking boots. They’re extremely comfortable and can be worn straight out of the box. There’s plenty of space inside to wear two layers of socks, and they fit snugly. Their 4mm multi-directional lugs provide great grip in both wet and dry conditions. While they don’t utilize Gore-Tex, Keen’s proprietary waterproofing works very well and keeps your feet dry." data-dimension25="$195" href="https://www.amazon.com/KEEN-Womens-Waterproof-Terrain-Comfortable/dp/B0DM3LGQ4P/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1356px;"><p class="vanilla-image-block" style="padding-top:70.50%;"><img id="6ZCgsvRwChzDJ9bBJYJVAN" name="Keen-Zionic-NXT-deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6ZCgsvRwChzDJ9bBJYJVAN.png" mos="" align="middle" fullscreen="" width="1356" height="956" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Keen Zionic NXT Mid Waterproofs have quickly become my go-to hiking boots. They’re extremely comfortable and can be worn straight out of the box. There’s plenty of space inside to wear two layers of socks, and they fit snugly. Their 4mm multi-directional lugs provide great grip in both wet and dry conditions. While they don’t utilize Gore-Tex, Keen’s proprietary waterproofing works very well and keeps your feet dry.<a class="view-deal button" href="https://www.amazon.com/KEEN-Womens-Waterproof-Terrain-Comfortable/dp/B0DM3LGQ4P/" target="_blank" rel="nofollow" data-dimension112="b40d5e54-e497-4428-92a5-a23da7d0e2f1" data-action="Deal Block" data-label="The Keen Zionic NXT Mid Waterproofs have quickly become my go-to hiking boots. They’re extremely comfortable and can be worn straight out of the box. There’s plenty of space inside to wear two layers of socks, and they fit snugly. Their 4mm multi-directional lugs provide great grip in both wet and dry conditions. While they don’t utilize Gore-Tex, Keen’s proprietary waterproofing works very well and keeps your feet dry." data-dimension48="The Keen Zionic NXT Mid Waterproofs have quickly become my go-to hiking boots. They’re extremely comfortable and can be worn straight out of the box. There’s plenty of space inside to wear two layers of socks, and they fit snugly. Their 4mm multi-directional lugs provide great grip in both wet and dry conditions. While they don’t utilize Gore-Tex, Keen’s proprietary waterproofing works very well and keeps your feet dry." data-dimension25="$195">View Deal</a></p></div><p>The Zionic NXT Mids are supremely comfortable and don't need to be broken in. Keen's 'Contoured Fit' means the boots are more streamlined than a straight or wide fit, making the Zionic NXT Mids fit snugly around my feet. There's plenty of bounce in the foam insoles so it feels like I'm walking on clouds, and they're extremely waterproof — my feet have gone straight into ankle-deep water and no water has made it through to my socks.</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/cameras-photography/best-photos-i-ve-taken-on-cameras-reviewed-2025">I’ve reviewed nearly 30 cameras in 2025: these are the best photos I’ve taken on instant, film and mirrorless</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/best-footage-i-ve-taken-on-drones-reviewed-2025">I reviewed every drone that came out in 2025: these are the best photos and videos I’ve taken</a></li><li><a href="https://www.tomsguide.com/gaming/gaming-peripherals/ive-always-wanted-a-playstation-portal-but-with-a-bigger-screen-so-i-tried-this-mobile-controller-and-it-turned-my-ipad-into-a-gaming-powerhouse">I've always wanted a PlayStation Portal but with a bigger screen so I tried this mobile controller — and it turned my iPad into a gaming powerhouse</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple 50th Anniversary: Latest news, retrospectives and celebrations of thinking different ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tag/apple-50th-anniversary</link>
                                                                            <description>
                            <![CDATA[ Apple just turned 50, and we're covering this important anniversary with retrospectives, quizzes and going hands-on with Apple's biggest innovations of its past. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">KE7KiXVUjrpEWzE2YddcJC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/s9nsKkZRADMoAaFjF7Y2uh-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Wed, 01 Apr 2026 09:23:11 +0000</pubDate>                                                                                                                                <updated>Wed, 01 Apr 2026 09:25:06 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/s9nsKkZRADMoAaFjF7Y2uh-1280-80.png">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple Event]]></media:description>                                                            <media:text><![CDATA[Apple Event]]></media:text>
                                <media:title type="plain"><![CDATA[Apple Event]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/s9nsKkZRADMoAaFjF7Y2uh-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It's a very important year for Apple. As of April 1, the company has officially turned 50 — half a century of tech innovation and thinking different. And whether you're one of "the crazy ones" or someone who just appreciates great gadgets, chances are you've owned something built by the Cupertino crew at some point in your life.</p><p>And we're covering this moment with retrospectives into this company's fascinating history from being on the brink of bankruptcy to a $4 trillion empire. This includes a full timeline, unique insights into how you can see Apple define the future of phones and computing by looking back, and quizzes to test your knowledge.</p><h2 class="article-body__section" id="section-look-back-at-50-years-of-apple"><span>Look back at 50 years of Apple</span></h2><ul><li><a href="https://www.tomsguide.com/computing/the-50-moments-that-defined-apple">From near bankruptcy to a $4 trillion empire: The 51 moments that defined Apple</a></li><li><a href="https://www.tomsguide.com/tech/apple-50th-anniversary-quiz-how-well-do-you-remember-these-controversial-moments-and-tech-innovations">Apple 50th anniversary quiz: how well do you remember these controversial moments and tech innovations?</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-turns-50-why-these-deconstructed-vintage-iphones-are-the-ultimate-way-to-celebrate">Apple turns 50: Why these deconstructed vintage iPhones are the ultimate way to celebrate</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple 50th anniversary quiz: how well do you remember these controversial moments and tech innovations? ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/apple-50th-anniversary-quiz-how-well-do-you-remember-these-controversial-moments-and-tech-innovations</link>
                                                                            <description>
                            <![CDATA[ How much do you remember of Apple's half century of "thinking different" (and what have you erased from memory)? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LyZtLo3tnaeWfNCZRmz4B9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/XDeUQyFu7Leiujz7gjdDH6-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 01 Apr 2026 04:00:00 +0000</pubDate>                                                                                                                                <updated>Wed, 01 Apr 2026 09:09:28 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ ella.taylor@futurenet.com (Ella Taylor) ]]></author>                    <dc:creator><![CDATA[ Ella Taylor ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/W2nC7HFA6avQHdFNFbFPNa.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Ella is Tom’s Guide’s Engagement Editor, on a mission to get to know all about our readers, to help you with your burning questions, and to create an exciting mix of content that entices you to keep coming back to the site – whether you’re a regular reader or a &lt;a href=&quot;https://www.tomsguide.com/membership&quot;&gt;member&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;She has more than 15 years of editorial experience, graduating from Kingston University with a First Class Honours degree in Journalism in 2008. She has written for and edited magazines and websites, including fellow Future titles &lt;em&gt;TechRadar.com, CreativeBloq.com, Digital Camera magazine, NPhoto, BikeRadar.com, Mollie Makes&lt;/em&gt; and more. &lt;/p&gt;&lt;p&gt;Most recently, she was Managing Editor of &lt;em&gt;womanandhome.com&lt;/em&gt;, where she co-launched its &lt;a href=&quot;https://www.womanandhome.com/tag/quiz/&quot; target=&quot;_blank&quot;&gt;Quiz of the Day&lt;/a&gt; and led the charge for articles that actively asked readers for their views. Before that, she was Editor of professional photography website &lt;em&gt;canon-europe.com/pro&lt;/em&gt;, having worked her way up from Production Editor. As such, she&#039;s a stickler for fact-checking, has too many opinions about grammar and is easily excited by a beautiful photo.&lt;/p&gt;&lt;p&gt;A mum of two young children, she keeps fit by typically carrying at least one of them on her shoulders around the hilly streets of Bristol. When not chasing her sons around the play parks and soft plays of South West England and worshipping her three rescue cats, she&#039;s likely to be in the garden, steadily turning it from a neglected concrete jungle to a usable green space. She’s also finally embarking on a kitchen extension in May, so 2026 looks set to be a year of big home improvements and lots of builders’ tea.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/XDeUQyFu7Leiujz7gjdDH6-1280-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A split image showing Tim Cook and Alicia Keys at Apple&#039;s New York City celebrations for its 50th anniversary; and a shot of the &#039;50 years of thinking different&#039; logo and tagline at its London celebrations]]></media:description>                                                            <media:text><![CDATA[A split image showing Tim Cook and Alicia Keys at Apple&#039;s New York City celebrations for its 50th anniversary; and a shot of the &#039;50 years of thinking different&#039; logo and tagline at its London celebrations]]></media:text>
                                <media:title type="plain"><![CDATA[A split image showing Tim Cook and Alicia Keys at Apple&#039;s New York City celebrations for its 50th anniversary; and a shot of the &#039;50 years of thinking different&#039; logo and tagline at its London celebrations]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/XDeUQyFu7Leiujz7gjdDH6-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Happy 50th birthday to Apple, a brand known for its iconic logo, its uncompromisingly beautiful products, and its commitment to innovation... as well as a fair number of flops and PR fails along the way! </p><p>In his post to mark the occasion, Tim Cook wrote, "At Apple, we’re more focused on building tomorrow than remembering yesterday." Well that may be, Tim. But as much as we're fans of the current crop of <a href="https://www.tomsguide.com/phones/iphones/i-spent-a-week-testing-the-iphone-17e-and-you-really-shouldnt-overlook-it">iPhone 17e</a>, and admire what the <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a> offers its target audience, we can't celebrate a birthday in true style without looking back at some past favorites... and offering a little light-hearted ribbing over Apple's less successful moments as well! So sit back and enjoy this bumper Apple 50th anniversary multiple choice quiz.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OKQLZe"></div>                            </div>                            <script src="https://kwizly.com/embed/OKQLZe.js" async></script><p>How did you do? Too hard? Too easy? Let us know what you think in the comments below. And don't forget to register to save your score, reveal hints for any clues you're not sure of and secure your spot on the competitive Tom's Guide leaderboard.</p><p>I hope you enjoyed reminiscing about Apple products from the archives, pop culture moments you may have forgotten, tech moments that helped push the envelope, and controversies from over the years.</p><p>As Tim Cook wrote, "From the first Apple computer to the Mac, from iPod to iPhone, iPad to Apple Watch and AirPods, as well as the services we use every day — the App Store, Apple Music, Apple Pay, iCloud, and Apple TV — we’ve spent five decades rethinking what’s possible and putting powerful tools into people’s hands."</p><p>But as this quiz has shown, it hasn't all been smooth sailing. And in fact, there are plenty of Apple products you may have forgotten. We've captured some of them in the below crossword that you may enjoy, too!</p><div style="min-height: 1005px;">                                <div class="kwizly-quiz kwizly-WnAqye"></div>                            </div>                            <script src="https://kwizly.com/embed/WnAqye.js" async></script><a class="card card--standard card--rows-2 card--align-inline" href="https://www.tomsguide.com/play"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/9dC8Z7BNysm3pR3EzeBqnX.jpg" alt="Screenshot of Tom's Guide puzzles and quizzes page"></p></div><div class="card__content"><h3 class="card__title">Tom's Guide games</h3><div class="card__description-wrapper"><div class="card__description"><p>Play multiple choice, lystery, word searches, crosswords and guess the number – can you reach the top of the leaderboard?</p></div></div></div></a><a class="card card--standard card--rows-2 card--align-inline" href="https://www.tomsguide.com/membership"><div class="card-image-widthsetter"><p class="vanilla-image-block"  style="padding-top:56.25%;"><img style="width: 100%" class="card__image" src="https://cdn.mos.cms.futurecdn.net/CtyBASsPQAuEKTsTEJu6YL.jpg" alt="A screenshot from the Tom's Guide website reading 'Everything you get as a member'"></p></div><div class="card__content"><h3 class="card__title">Tom's Guide Club</h3><div class="card__description-wrapper"><div class="card__description"><p>Join Tom’s Guide Club for free, to earn badges, talk to other members and Tom’s writers, get exclusive deals and more.</p></div></div></div></a><p>Keep your eye on the <a href="https://www.tomsguide.com/tag/apple">Apple section</a> of Tom's Guide this week, as we have a whole program of Apple-themed articles planned to mark the tech giant's milestone anniversary. From our <a href="https://www.tomsguide.com/news/live/apple-50th-anniversary">Apple live blog</a> to <a href="https://www.tomsguide.com/computing/the-50-moments-that-defined-apple">51 moments that defined Apple</a>, to asking <a href="https://www.tomsguide.com/computing/hardware/we-want-to-hear-from-you-what-was-your-first-ever-apple-device">what was the first Apple device you used</a>, there's plenty already live, and more to come.</p><p>And if you enjoyed this quiz, then please bookmark our <a href="https://www.tomsguide.com/tag/quiz">Quiz of the Day</a> section, where a new quiz or puzzle appears every weekday. </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/gaming/toms-guide-jigsaw-puzzles-hardest-difficulty-has-me-stumped">Can you beat us at our own game? New Tom’s Guide jigsaw puzzles are a great way to kill time between Wordles</a></li><li><a href="https://www.tomsguide.com/computing/apple-desktops/rip-cheese-grater-apple-has-officially-discontinued-the-mac-pro-but-i-wouldnt-buy-a-mac-studio-yet">RIP cheese grater: Apple has officially discontinued the Mac Pro but I wouldn't buy a Mac Studio yet</a></li><li><a href="https://www.tomsguide.com/gaming/forget-wordle-you-need-to-play-toms-guide-games-right-now">Forget Wordle, you need to play Tom's Guide games right now</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tried Amazon’s new ultrafast delivery option and my package actually beat the 3-hour window  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/i-tried-amazons-new-ultrafast-delivery-option-and-my-package-actually-beat-the-3-hour-window</link>
                                                                            <description>
                            <![CDATA[ Amazon’s new ultrafast shipping is here, and after testing it, the extra fee is a small price to pay to skip a trip to the store. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ALzXggdEPFQWt7ceYx66gN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/6oMuBMo5mu2BdK9bFFxB3h-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 18 Mar 2026 11:00:00 +0000</pubDate>                                                                                                                                <updated>Tue, 28 Apr 2026 17:07:07 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/6oMuBMo5mu2BdK9bFFxB3h-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[An Amazon package on the side of a front porch]]></media:description>                                                            <media:text><![CDATA[An Amazon package on the side of a front porch]]></media:text>
                                <media:title type="plain"><![CDATA[An Amazon package on the side of a front porch]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/6oMuBMo5mu2BdK9bFFxB3h-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Whether it’s cleaning supplies or a new smart speaker, ordering products from Amazon has never been easier. Now though, the e-commerce giant has given its deliveries an ultrafast boost — that is, if you’re willing to pay a bit extra and live in an eligible area.</p><p>We’ve come a long way from the 2-day shipping launch of Prime back in 2005 to the rollout of “Same-Day” deliveries in 2015. Amazon’s delivery infrastructure has continued to improve over the years, but it just got a major upgrade with new <a href="https://www.tomsguide.com/tech/amazon-rolls-out-ultrafast-1-3-hour-shipping-how-to-see-if-its-available-in-your-area">1-hour and 3-hour delivery options</a>. This rollout covers major hubs like LA, Chicago, Houston, and Washington D.C., but it’s also hitting smaller cities like Boise, Idaho and American Fork, Utah.</p><p>Given that I’ve had an <a href="https://www.tomsguide.com/us/what-is-amazon-prime,news-18041.html">Amazon Prime</a> membership since 2006 and I live less than 2 miles from a local delivery station, I’m exactly the kind of person this service is built for. I decided to try out one of these new ultrafast delivery options for myself to see if it actually lived up to the hype. Here’s how it went and why 1-hour or 3-hour delivery just might be worth it if you’re in a bind.</p><h2 id="forget-today-by-10-pm">Forget “Today by 10 PM”</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5037px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="oFTnfUcwCWziL4vGKqC6v" name="Amazon 3-hour delivery-1" alt="A person holding a near-empty bottle of Mrs. Meyer's Clean Day in front of a sink" src="https://cdn.mos.cms.futurecdn.net/oFTnfUcwCWziL4vGKqC6v.jpg" mos="" align="middle" fullscreen="" width="5037" height="2833" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Now I normally try to plan ahead when it comes to ordering things on Amazon. However, to test out the service’s new ultrafast delivery options, I thought of the perfect scenario where they’d really come in handy.</p><p>While I grew up mopping my kitchen floor with Pine-Sol for a very deep clean, my wife spent her childhood mopping with Fabuloso. Since moving into our house with laminate flooring though, I’ve switched to using Mrs. Meyer’s Clean Day concentrated cleaner mixed with rubbing alcohol and hot water in a refillable spray mop.</p><p>Now when Prime Day or even a <a href="https://www.tomsguide.com/sales-events/amazons-spring-preview-sale-just-slashed-up-to-50-percent-off-fire-tvs-echo-blink-and-more-my-favorite-devices-starting-at-usd17">Big Spring Sale</a> rolls around, I like to restock but as a bottle of Mrs. Meyer’s Clean Day lasts so long, sometimes I forget to do so. When I looked under my sink when thinking about what to buy with 1-hour or 3-hour delivery, I noticed my last bottle didn’t have enough cleaning solution left in it to mop my whole house.</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:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="urxK8eydJLcCBJsBk5Mxb6" name="Amazon-3-hour-delivery-order" alt="A screenshot of an Amazon order with the new 3-hour delivery option selected" src="https://cdn.mos.cms.futurecdn.net/urxK8eydJLcCBJsBk5Mxb6.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: Tom's Guide)</span></figcaption></figure><p>When scrolling through Amazon’s new Get It Fast landing page for items eligible for 1-hour or 3-hour delivery, I saw quite a few of my household staples like Mrs. Meyer’s Clean Day. Likewise, there were a few products I didn’t expect like TV mounts, USB-C to Ethernet adapters and more.</p><p>I picked up a two-pack of Mrs. Meyer’s Clean Day with a Lemon Verbena scent as it was on sale for almost half off. Although the 1-hour delivery option wasn’t available, the 3-hour one was for an extra $4.99. This was a jump above Amazon’s previous fastest delivery time, Today 2 PM - 6 PM. Now for the waiting.</p><h2 id="flexing-to-the-finish">Flexing to the finish</h2><p>I placed my order at approximately 12:53 PM and expected it to arrive just before 4 PM. While this reorder was solely for the purpose of testing out Amazon’s new ultrafast delivery options, if it hadn’t been, that 3-hour window would have been perfect for my schedule.</p><p>When I clean the house, I have a four-step process that I’ve fine-tuned over the years. It starts with tidying up and getting every piece of furniture that can be moved out of the way. This means taking the kitchen chairs out to the garage and rolling up every throw rug we have to store them safely in a closet. As we now have two dogs, I then sweep every room — even with one of the <a href="https://www.tomsguide.com/best-picks/best-vacuum-cleaners">best vacuum cleaners</a>, the less my machine has to work, the better for its longevity. From there, I vacuum the whole house, and once that’s done, it’s finally time to mop.</p><p>Since I live in a long, one-story home, this whole process takes me about five hours. If I had started a whole-home clean without a bottle of Mrs. Meyer’s to mop with, this 3-hour wait would actually work out perfectly.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KQSPPjs7qKMXQNTDMsPAnC" name="Amazon-3-hour-delivery-tracking" alt="A screenshot showing the tracking info for an Amazon 3-hour delivery" src="https://cdn.mos.cms.futurecdn.net/KQSPPjs7qKMXQNTDMsPAnC.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>Almost immediately after placing my order, I started getting delivery update notifications from Amazon. My package left the shipper facility, arrived at a carrier facility, was processed, and before I knew it, it was out for delivery. While I was hoping that my package would arrive in one of those sleek new electric Amazon delivery vans for a photo op, that wasn’t the case.</p><p>If you’ve ever had an Amazon package dropped off by a driver in a personal car, you’ve experienced Amazon Flex. Essentially "Uber for packages," the company uses independent contractors with their own vehicles to speed up the pace and output of deliveries. This gig-economy sprint is what makes Amazon’s new 1-hour to 3-hour windows possible.</p><p>Although I didn’t get the shot of my package with a blue Amazon delivery van in the background, everything arrived just fine. My tracking showed the package was delivered at 3:15 PM — a full 2 hours and 22 minutes after I hit buy. If I had been mid-clean, those two bottles of Mrs. Meyer’s would have been the final piece of the puzzle for a freshly mopped house.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XZ3YAe"></div>                            </div>                            <script src="https://kwizly.com/embed/XZ3YAe.js" async></script><h2 id="a-worthwhile-splurge">A worthwhile splurge</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LundooMHiu8QxUedAsGeaL" name="Amazon delivery box.jpg" alt="Amazon box delivery" src="https://cdn.mos.cms.futurecdn.net/LundooMHiu8QxUedAsGeaL.jpg" mos="" align="middle" fullscreen="" width="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>Now, are Amazon’s new ultrafast deliveries worth it? Well, that depends on whether or not you’re an Amazon Prime member. I am, which means I can get 3-hour deliveries on select products for an extra $4.99 or 1-hour deliveries for an extra $9.99. If you don’t have Prime, those fees jump up to $14.99 and $19.99, respectively.</p><p>To put this in perspective, if I were to pick up a bottle of Mrs. Meyer’s from a local grocery store via Uber Eats, I’d typically have to pay a $3.99-$5.99 delivery fee along with a service fee of 10-15% and, of course, a tip for the driver. That’s easily $12-$15 in extras without the markup from the store itself. With Instacart — even if I had a subscription — there are often “heavy order” fees or long-distance fees. Without one, the delivery fee and service fees would usually be about $10-$12 for a small order.</p><p>I doubt I’ll be using Amazon’s new ultrafast delivery options all that often, but for something like cleaning or if I’m in the middle of a Home Hacks DIY project, not having to stop what I’m doing to head to the store easily justifies the extra cost.</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/7-amazon-prime-perks-youre-probably-not-using">7 Amazon Prime perks you’re probably not using</a></li><li><a href="https://www.tomsguide.com/sales-events/forget-prime-day-amazons-big-spring-sale-is-back-and-ive-picked-the-best-preview-deals">Forget Prime Day! Amazon's Big Spring Sale is back and I've picked the best preview deals</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/5-oscar-winning-movies-to-stream-on-prime-video-right-now">5 Oscar-winning movies to stream on Prime Video right now</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Amazon rolls out ultrafast 1-3 hour shipping: how to see if it's available in your area ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/amazon-rolls-out-ultrafast-1-3-hour-shipping-how-to-see-if-its-available-in-your-area</link>
                                                                            <description>
                            <![CDATA[ Amazon is rolling out 1-hour and 3-hour deliveries in parts of the U.S. Here's how to tell if its available where you are. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CgjcoMM9x5JXqkkZZTnGjL</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/XTtJRckzhCog3h3x3Mec25-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 17 Mar 2026 20:06:45 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></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/XTtJRckzhCog3h3x3Mec25-1280-80.jpg">
                                                            <media:credit><![CDATA[Cineberg/Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[An Amazon delivery agent carrying an Amazon shipping box in Berlin, Germany, January 2020.]]></media:description>                                                            <media:text><![CDATA[An Amazon delivery agent carrying an Amazon shipping box in Berlin, Germany, January 2020.]]></media:text>
                                <media:title type="plain"><![CDATA[An Amazon delivery agent carrying an Amazon shipping box in Berlin, Germany, January 2020.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/XTtJRckzhCog3h3x3Mec25-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Starting today (March 17), Amazon is rolling out one- and three-hour deliveries in certain regions and cities across the U.S. </p><p>The three-hour delivery is more widely available in 2,000 cities, according to Amazon. One hour is only available in a few hundred areas within that list. </p><p>“Our customers are busier than ever and are looking for new ways to save time while keeping their households running," Senior VP of Worldwide Operations Udit Madan said in a<a href="https://www.aboutamazon.com/news/retail/amazon-fast-delivery-orders" target="_blank"> press release</a>.  "We saw an opportunity to use our unique operational expertise and delivery network to help make customers’ lives a little easier while unlocking even more value for Prime members."</p><p>More than 90,000 products are eligible for the new delivery windows including pantry items, over-the-counter medications, toys and electronics.</p><p>There are fees for using the 1-hour and 3-hour delivery options. Prime members will pay $9.99 for a one-hour delivery and $4.99 for three-hour deliveries. If you don't have Prime then the fees go up by $10; $19.99 for 1-hour and $14.99 for three-hour.</p><h2 id="how-to-tell-if-its-available-in-your-area">How to tell if its available in your area</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="E5Y3diZwGxdsUZM3t2FvVK" name="Amazon deals.jpg" alt="Amazon deals" src="https://cdn.mos.cms.futurecdn.net/E5Y3diZwGxdsUZM3t2FvVK.jpg" mos="" align="middle" fullscreen="" width="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 its statement, Amazon specified that 1-hour delivery is available in <strong>parts</strong> of several major metropolitan areas including  Los Angeles, Chicago, Oklahoma City, Nashville, Houston, and Washington, D.C., and smaller cities such as Des Moines, Iowa; Boise, Idaho; and American Fork, Utah. </p><p>Three-hour delivery is available in over 2,000 cities and towns. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Upkv9dKvVydGxdAJFi94Af" name="Gradient background" alt="Amazon 1-hour/3-hour delivery example" src="https://cdn.mos.cms.futurecdn.net/Upkv9dKvVydGxdAJFi94Af.png" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The company set up a new '<a href="https://www.amazon.com/fmc/ssd-storefront?speed=3hr" target="_blank">getitfast</a>' storefront where you can see if your area gets the deliveries.</p><p>As an example, I live in Los Angeles, but apparently, my area isn't eligible for 1-hour deliveries. You can see what's available in the upper taskbar underneath the Rufus AI button.</p><p>If you have the option you can filter eligible products by 1-hour or 3-hour availability. You can also use the search bar with new "in 1 hour" or "in 3 hours" search filters. </p><p>If you live in an eligible area, the new delivery windows are available now. However, it's not clear if and when Amazon will expand one-hour and three-hour deliveries to other areas.</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/amazon-prime-video-ad-free-tier-just-got-a-40-percent-price-hike-and-a-new-ultra-name">Amazon Prime Video ad-free tier just got a 40% price hike — and a new ‘Ultra’ name</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming-devices/youre-wasting-your-fire-tv-sticks-potential-7-features-to-enable-right-now">You're wasting your Fire TV Stick's potential — 7 features to enable right now</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/5-prime-video-action-movies-you-probably-havent-seen-march-2026">5 Prime Video action movies you (probably) haven't seen</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'I’m heartbroken by the events in Minneapolis': how Tim Cook and other tech CEOs are responding to ICE ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/im-heartbroken-by-the-events-in-minneapolis-how-tim-cook-and-other-tech-ceos-are-responding-to-ice</link>
                                                                            <description>
                            <![CDATA[ Here's how tech leaders have responded to the ICE-related incidents in Minnesota. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">w3Poj2KhqrjtYrFwo6f8QH</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MCkQwgCLKjbf4wcTKaYB9V-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 28 Jan 2026 19:18:59 +0000</pubDate>                                                                                                                                <updated>Wed, 28 Jan 2026 19:20:46 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ mike.prospero@futurenet.com (Mike Prospero) ]]></author>                    <dc:creator><![CDATA[ Mike Prospero ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/6ZM8mX4UwccqDJTh9gLPqV.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Michael A. Prospero is the U.S. Editor-in-Chief for Tom’s Guide. He oversees all evergreen content and oversees the Homes, Smart Home, and Fitness/Wearables categories for the site. In his spare time, he also tests out the latest drones, electric scooters, and smart home gadgets, such as video doorbells. Before his tenure at Tom&#039;s Guide, he was the Reviews Editor for Laptop Magazine, a reporter at Fast Company, the Times of Trenton, and, many eons back, an intern at George magazine. He received his undergraduate degree from Boston College, where he worked on the campus newspaper The Heights, and then attended the Columbia University school of Journalism. When he’s not testing out the latest running watch, electric scooter, or skiing or training for a marathon, he’s probably using the latest sous vide machine, smoker, or pizza oven, to the delight — or chagrin — of his family.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/MCkQwgCLKjbf4wcTKaYB9V-1280-80.jpg">
                                                            <media:credit><![CDATA[Credit: Tom’s Guide/David Paul Morris/Kyle Grillot/Bloomberg/Chance Yeh/Getty]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tim Cook, Cario Amodei, and Sam Altman]]></media:description>                                                            <media:text><![CDATA[Tim Cook, Cario Amodei, and Sam Altman]]></media:text>
                                <media:title type="plain"><![CDATA[Tim Cook, Cario Amodei, and Sam Altman]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MCkQwgCLKjbf4wcTKaYB9V-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>In the wake of the unrest in Minneapolis following the shooting deaths of Alex Pretti and Renee Good by ICE agents, a few tech CEOs have begun to speak out about the Trump administration's policies, be it on social media or through internal communications with their employees. </p><p>While all of the statements have expressed dismay at the situation, most — such as the one from Apple CEO Tim Cook — have called for de-escalation, rather than condemning the actions of ICE outright. </p><h2 id="apple-s-tim-cook-this-is-a-time-for-deescalation">Apple's Tim Cook: 'This is a time for deescalation'</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:66.55%;"><img id="4bTsKs6N8xC48NfmwntNCa" name="Tim Cook" alt="Tim Cook" src="https://cdn.mos.cms.futurecdn.net/4bTsKs6N8xC48NfmwntNCa.jpg" mos="" align="middle" fullscreen="" width="4000" height="2662" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>On Tuesday (Jan. 27), Tim Cook, the CEO of Apple, issued a statement to employees saying he was "heartbroken" at the events unfolding in Minnesota, and called for a "deescalation." </p><p>"I’m heartbroken by the events in Minneapolis, and my prayers and deepest sympathies are with the families, with the communities, and with everyone that’s been affected.</p><p>"This is a time for deescalation. I believe America is strongest when we live up to our highest ideals, when we treat everyone with dignity and respect no matter who they are or where they’re from, and when we embrace our shared humanity. This is something Apple has always advocated for. I had a good conversation with the president this week where I shared my views, and I appreciate his openness to engaging on issues that matter to us all.</p><p>"I know this is very emotional and challenging for so many. I am proud of how deeply our teams care about the world beyond our walls. That empathy is one of Apple’s greatest strengths and it is something I believe we all cherish.</p><p>Thank you for all that you do."</p><p><a href="https://www.bloomberg.com/news/articles/2026-01-28/apple-s-cook-calls-for-deescalation-after-latest-ice-shooting?accessToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb3VyY2UiOiJTdWJzY3JpYmVyR2lmdGVkQXJ0aWNsZSIsImlhdCI6MTc2OTU2OTIxNSwiZXhwIjoxNzcwMTc0MDE1LCJhcnRpY2xlSWQiOiJUOUpZV1BLSUpIOEowMCIsImJjb25uZWN0SWQiOiI1RkQyNjU1NTA2QTI0NjM2QjM1NzBEQkQ5MTY1RkI1NCJ9.AqYevYR3E81ym5MYxexBcWWTTk4mdSixpCtAcOfWLOc&leadSource=uverify%20wall" target="_blank">Cook has faced criticism from employees after attending a private screening of "Melania"</a> at the White House, along with Andy Jassy from Amazon and Lisa Su from AMD, the evening that Pretti was killed. </p><h2 id="openai-s-sam-altman-what-s-happening-with-ice-is-going-too-far">OpenAI's Sam Altman: 'What’s happening with ICE is going too far'</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:66.68%;"><img id="oT3Nq3B5iFTZdgGNDNarog" name="Sam Altman" alt="Sam Altman" src="https://cdn.mos.cms.futurecdn.net/oT3Nq3B5iFTZdgGNDNarog.jpg" mos="" align="middle" fullscreen="" width="4000" height="2667" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>Earlier on Monday, OpenAI Sam Altman wrote to his employees on an internal Slack message that ICE has "gone too far," and vowed that his company would strive to "try to figure out how to actually do the right thing." </p><p>Here's the full text of his message, <a href="https://www.nytimes.com/2026/01/27/business/dealbook/altman-openai-minnesota.html" target="_blank">as reported by The New York Times</a>: </p><p>"I love the US and its values of democracy and freedom and will be supportive of the country however I can; OpenAI will too. But part of loving the country is the American duty to push back against overreach. What’s happening with ICE is going too far. There is a big difference between deporting violent criminals and what’s happening now, and we need to get the distinction right.</p><p>"President Trump is a very strong leader, and I hope he will rise to this moment and unite the country. I am encouraged by the last few hours of response and hope to see trust rebuilt with transparent investigations.</p><p>"As a company, we aim to stick to our convictions and not get blown around by changing fashions too much. We didn’t become super woke when that was popular, we didn’t start talking about masculine corporate energy when that was popular, and we are not going to make a lot of performative statements now about safety or politics or anything else. But we are going to continue to try to figure out how to actually do the right thing as best as we can, engage with leaders and push for our values, and speak up clearly about it as needed."</p><h2 id="anthropic-s-dario-amodi-the-horror-we-re-seeing">Anthropic's Dario Amodi: 'The horror we're seeing'</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4564px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="GDtjRyUTkbbAUBs3kNRGY3" name="Dario Amodei" alt="Dario Amodei" src="https://cdn.mos.cms.futurecdn.net/GDtjRyUTkbbAUBs3kNRGY3.jpg" mos="" align="middle" fullscreen="" width="4564" height="3043" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>Another executive to speak out was Anthropic's cofounder <a href="https://x.com/ch402/status/2015624212132905208?s=20" target="_blank">Chris Olah, who wrote on X</a> that "a federal agent killing an ICU nurse for seemingly no reason and with no provocation – shock the conscience." </p><p>Anthropic's CEO Dario Amodei also referenced <a href="https://x.com/DarioAmodei/status/2015833051205414955?s=20" target="_blank">"the horror we're seeing in Minnesota" on X</a>, before linking to an essay on the risks of AI to national security, economies, and democracy. </p><div class="see-more see-more--clipped"><blockquote class="twitter-tweet hawk-ignore" data-lang="en"><p lang="en" dir="ltr">I've been working on this essay for a while, and it is mainly about AI and about the future. But given the horror we're seeing in Minnesota, its emphasis on the importance of preserving democratic values and rights at home is particularly relevant.<a href="https://twitter.com/cantworkitout/status/2015833051205414955">January 26, 2026</a></p></blockquote><div class="see-more__filter"></div></div><h2 id="vinod-khosla-macho-ice-vigilantes-running-amuck">Vinod Khosla: "Macho ICE vigilantes running amuck"</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3030px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="ETwhCokawBJ3NXwFQ2kenK" name="Vinod Khosla" alt="Vinod Khosla" src="https://cdn.mos.cms.futurecdn.net/ETwhCokawBJ3NXwFQ2kenK.jpg" mos="" align="middle" fullscreen="" width="3030" height="2020" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Steven Ferdman/Getty)</span></figcaption></figure><p>Vinod Khosla, the founder of venture capital firm Khosla Ventures, which has funded such companies as OpenAI, DoorDash, and Instacart, was one of the more vociferous voices, <a href="https://x.com/vkhosla/status/2015647215642186008" target="_blank">writing on X</a> that the video was "sickening to watch."</p><div class="see-more see-more--clipped"><blockquote class="twitter-tweet hawk-ignore" data-lang="en"><p lang="en" dir="ltr">I agree with @EthanChoi7 . Macho ICE vigilantes running amuck empowered by a conscious-less administration. The video was sickening to watch and the storytelling without facts or with invented fictitious facts by authorities almost unimaginable in a civilized society. ICE… https://t.co/ASvjZQB0Gg<a href="https://twitter.com/cantworkitout/status/2015647215642186008">January 26, 2026</a></p></blockquote><div class="see-more__filter"></div></div><h2 id="target-and-best-buy-weigh-in">Target and Best Buy weigh in</h2><p>On Sunday, the CEOs of 60 Minnesota-based companies, which include Target and Best Buy, <a href="https://www.mnchamber.com/blog/open-letter-more-60-ceos-minnesota-based-companies" target="_blank">issued an open letter</a>, calling for "an immediate deescalation of tensions and for state, local and federal officials to work together to find real solutions."</p><h2 id="an-open-letter-to-tech-ceos">An open letter to tech CEOs</h2><p>Cook and Altman are the rare exceptions among tech leaders to comment on the Trump administration's controversial tactics when it comes to deporting illegal immigrants. An <a href="https://iceout.tech/" target="_blank">open letter, signed by more than 800 employees</a> from companies such as Amazon, Google, Meta, and Microsoft, have urged their executives to condemn the administration's policies. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/succession-in-real-life-front-runner-at-apple-emerges-to-be-tim-cooks-replacement">Tim Cook could step down as Apple CEO as early as next year — and this is the front-runner to replace him</a></li><li><a href="https://www.tomsguide.com/news/live/meta-q4-earnings-live-jan-2026">Meta earnings live updates — stock down ahead of Q4 results, AI spending biggest worry</a></li><li><a href="https://www.tomsguide.com/news/live/microsoft-q2-earnings-2026">Microsoft Q2 earnings live — all the latest news as it happens</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 10 products Tom's Guide writers actually spent their own money on in 2025 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/10-products-toms-guide-writers-actually-spent-their-own-money-on-in-2025</link>
                                                                            <description>
                            <![CDATA[ We spent a lot of money on gadgets this year and these stand out as the best of the best. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">NWAE5LAvmQsZciUkorDnQR</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/2BYRWHKYmYQfKC8iKoThZ3-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 04 Jan 2026 05:05:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></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 Senior 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/2BYRWHKYmYQfKC8iKoThZ3-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Products Tom&#039;s Guide writers bought in 2025]]></media:description>                                                            <media:text><![CDATA[Products Tom&#039;s Guide writers bought in 2025]]></media:text>
                                <media:title type="plain"><![CDATA[Products Tom&#039;s Guide writers bought in 2025]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/2BYRWHKYmYQfKC8iKoThZ3-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We test a lot of products at Tom's Guide. From full product reviews to hands-on opinion pieces, our staff is playing with new gadgets every day of the week. But with all the gadgets we review, sometimes something is so good that we need to run to the store (or an online store, more likely) and buy one for ourselves with our own hard-earned cash. </p><p>Lots of people think we get everything sent to us, but that's not always the case. A lot of the time, we have to buy devices to fill gaps in our lives, just like anyone else. And those are the products the Tom's Guide team is shouting out today.</p><h3 class="article-body__section" id="section-rove-r2-4k-dual-dash-cam-anthony-spadafora"><span>Rove R2-4K Dual dash cam — Anthony Spadafora</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5700px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="t4JT4XzG4TSvW2JUopUeTg" name="Rove 2K-4K Dash Cam" alt="The Rove 2K-4K Dual installed in a truck with the cables for it and the rear camera cleanly tucked away" src="https://cdn.mos.cms.futurecdn.net/t4JT4XzG4TSvW2JUopUeTg.jpg" mos="" align="middle" fullscreen="" width="5700" height="3206" 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>Our first product comes from our Managing Editor, Security and Home Office, Anthony Spadafora. He purchased a new car and wanted a way to protect it. A Rove R2-4K Dual dash camera turned out to be the perfect purchase. </p><p>Why did he buy it? He said, "Knowing that every time I turn on my engine I have both front and rear video recording in real time gives me tremendous peace of mind."</p><p><strong></strong><a href="https://www.tomsguide.com/vehicle-tech/i-just-got-a-new-car-and-a-dash-cam-was-the-first-and-hardest-accessory-i-installed"><strong>Read Anthony's full Rove R2-4K Dual thoughts</strong></a><strong>.</strong></p><div class="product"><a data-dimension112="3e4745ee-8e2c-4b00-8a3b-ba0b262d02fa" data-action="Deal Block" data-label="If you're looking for a cheap 4K dash cam with a rear view thrown in, then Rove's R2-4K dual is a solid option. it struggles with night vision but for the most part it's a easy-to-use dash cam that offers clear video throughout the day. Plus, you get a 128GB microSD card thrown in." data-dimension48="If you're looking for a cheap 4K dash cam with a rear view thrown in, then Rove's R2-4K dual is a solid option. it struggles with night vision but for the most part it's a easy-to-use dash cam that offers clear video throughout the day. Plus, you get a 128GB microSD card thrown in." data-dimension25="$129" href="https://www.amazon.com/ROVE-R2-4K-DUAL-STARVIS-Included/dp/B0D6J5B98H" 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="W4BnM3H5ffmH2YykyTUrhi" name="rove r2-4k dash cam" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/W4BnM3H5ffmH2YykyTUrhi.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you're looking for a cheap 4K dash cam with a rear view thrown in, then Rove's R2-4K dual is a solid option. it struggles with night vision but for the most part it's a easy-to-use dash cam that offers clear video throughout the day. Plus, you get a 128GB microSD card thrown in.<a class="view-deal button" href="https://www.amazon.com/ROVE-R2-4K-DUAL-STARVIS-Included/dp/B0D6J5B98H" target="_blank" rel="nofollow" data-dimension112="3e4745ee-8e2c-4b00-8a3b-ba0b262d02fa" data-action="Deal Block" data-label="If you're looking for a cheap 4K dash cam with a rear view thrown in, then Rove's R2-4K dual is a solid option. it struggles with night vision but for the most part it's a easy-to-use dash cam that offers clear video throughout the day. Plus, you get a 128GB microSD card thrown in." data-dimension48="If you're looking for a cheap 4K dash cam with a rear view thrown in, then Rove's R2-4K dual is a solid option. it struggles with night vision but for the most part it's a easy-to-use dash cam that offers clear video throughout the day. Plus, you get a 128GB microSD card thrown in." data-dimension25="$129">View Deal</a></p></div><h3 class="article-body__section" id="section-gamesir-g8-plus-jeff-parsons"><span>GameSir G8 Plus — Jeff Parsons</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4096px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="f3JpaL7J8x4Z6JW4G9NwcP" name="GameSir G8 Plus (1)" alt="Gamesir G8 Plus mobile controller" src="https://cdn.mos.cms.futurecdn.net/f3JpaL7J8x4Z6JW4G9NwcP.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: Tom's Guide)</span></figcaption></figure><p>Our U.K. Editor in Chief, Jeff Parsons, spent his cash on a GameSir G8 Plus, and he's very happy with it. </p><p>"In a world where costs are constantly increasing, it's refreshing to come across a product that actually seems reasonably priced," he said in his detailed breakdown on why he loves it.</p><p><a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-test-gadgets-for-a-living-and-this-mobile-gaming-controller-is-so-good-i-bought-one-with-my-own-money"><strong>Read Jeff's full GameSir G8 Plus thoughts. </strong></a></p><div class="product"><a data-dimension112="4a9370eb-b8f1-4e3d-9f54-32558e4613ba" data-action="Deal Block" data-label="The GameSir G8 Plus is a fantastic phone controller. Thanks to Bluetooth connectivity, it’s compatible with Android and iOS smartphones, tablets and the Nintendo Switch lineup, enabling you to play all your favorite games on the go. Its Hall Effect thumbsticks and triggers are responsive, and the controller’s ergonomic design ensures all-day comfort." data-dimension48="The GameSir G8 Plus is a fantastic phone controller. Thanks to Bluetooth connectivity, it’s compatible with Android and iOS smartphones, tablets and the Nintendo Switch lineup, enabling you to play all your favorite games on the go. Its Hall Effect thumbsticks and triggers are responsive, and the controller’s ergonomic design ensures all-day comfort." data-dimension25="$63" href="https://www.amazon.com/dp/B0FT34CLXF" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><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="GpcD9nrAhVFWvfLf49RgUX" name="gamesir-g8-plus.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GpcD9nrAhVFWvfLf49RgUX.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The GameSir G8 Plus is a fantastic phone controller. Thanks to Bluetooth connectivity, it’s compatible with Android and iOS smartphones, tablets and the Nintendo Switch lineup, enabling you to play all your favorite games on the go. Its Hall Effect thumbsticks and triggers are responsive, and the controller’s ergonomic design ensures all-day comfort.<a class="view-deal button" href="https://www.amazon.com/dp/B0FT34CLXF" target="_blank" rel="nofollow" data-dimension112="4a9370eb-b8f1-4e3d-9f54-32558e4613ba" data-action="Deal Block" data-label="The GameSir G8 Plus is a fantastic phone controller. Thanks to Bluetooth connectivity, it’s compatible with Android and iOS smartphones, tablets and the Nintendo Switch lineup, enabling you to play all your favorite games on the go. Its Hall Effect thumbsticks and triggers are responsive, and the controller’s ergonomic design ensures all-day comfort." data-dimension48="The GameSir G8 Plus is a fantastic phone controller. Thanks to Bluetooth connectivity, it’s compatible with Android and iOS smartphones, tablets and the Nintendo Switch lineup, enabling you to play all your favorite games on the go. Its Hall Effect thumbsticks and triggers are responsive, and the controller’s ergonomic design ensures all-day comfort." data-dimension25="$63">View Deal</a></p></div><h3 class="article-body__section" id="section-fujifilm-x-e5-ashley-thieme"><span>Fujifilm X-E5 — Ashley Thieme</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3374px;"><p class="vanilla-image-block" style="padding-top:66.69%;"><img id="e5wccHrPKuCLXF2DWRiwPN" name="Fujifilm X-E5" alt="Hand holding the new Fujifilm X-E5 film simulation camera." src="https://cdn.mos.cms.futurecdn.net/e5wccHrPKuCLXF2DWRiwPN.jpg" mos="" align="middle" fullscreen="" width="3374" height="2250" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Ashley Thieme)</span></figcaption></figure><p>"I usually like to take pictures of nature, whether I’m at a lake, beach or in the woods, it’s a great way to connect with my surroundings. I’ve been shooting mostly on the Sony a6100 for the last couple of years, but in June, I had the opportunity to head out to Valencia with Fujifilm to test out their then-new camera, the Fujifilm X-E5, which I think is one of the best mirrorless cameras around," said Ashley Thieme, Staff writer, Reviews. </p><p>She liked it so much that she went out and bought one after the event. "There is nothing difficult about this camera. Everything runs smoothly, and there is very little room for error," Thieme continued.</p><p><a href="https://www.tomsguide.com/cameras-photography/the-fujifilm-x-e5-puts-the-fun-back-into-photography-heres-why-its-my-favorite-purchase-this-year"><strong>Read Ashley's full Fujifilm X-E5 thoughts. </strong></a></p><div class="product"><a data-dimension112="17744e43-2742-4c48-9b3f-c0b98fbec678" data-action="Deal Block" data-label="The Fujifilm X-E5 is the resurrection of the X-E series and successor to the Fujifilm X-E4. It’s a 40.2 MP camera with an interchangeable lens. It is incredibly easy to use but produces incredibly satisfying results that’ll please seasoned photographers." data-dimension48="The Fujifilm X-E5 is the resurrection of the X-E series and successor to the Fujifilm X-E4. It’s a 40.2 MP camera with an interchangeable lens. It is incredibly easy to use but produces incredibly satisfying results that’ll please seasoned photographers." data-dimension25="$1899" href="https://www.amazon.com/FUJIFILM-Mirrorless-Digital-Camera-XF23mmF2-8/dp/B0FBYR3KV2" 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:55.07%;"><img id="KvY2Q2ScCe7XrCxWDXWD7R" name="fujifilm-xe5-mirrorless-digital-camera-x-2a65e738-0008-41a0-8fc4-a27da7f880b3.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KvY2Q2ScCe7XrCxWDXWD7R.jpg" mos="" align="middle" fullscreen="" width="1500" height="826" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Fujifilm X-E5 is the resurrection of the X-E series and successor to the Fujifilm X-E4. It’s a 40.2 MP camera with an interchangeable lens. It is incredibly easy to use but produces incredibly satisfying results that’ll please seasoned photographers.<a class="view-deal button" href="https://www.amazon.com/FUJIFILM-Mirrorless-Digital-Camera-XF23mmF2-8/dp/B0FBYR3KV2" target="_blank" rel="nofollow" data-dimension112="17744e43-2742-4c48-9b3f-c0b98fbec678" data-action="Deal Block" data-label="The Fujifilm X-E5 is the resurrection of the X-E series and successor to the Fujifilm X-E4. It’s a 40.2 MP camera with an interchangeable lens. It is incredibly easy to use but produces incredibly satisfying results that’ll please seasoned photographers." data-dimension48="The Fujifilm X-E5 is the resurrection of the X-E series and successor to the Fujifilm X-E4. It’s a 40.2 MP camera with an interchangeable lens. It is incredibly easy to use but produces incredibly satisfying results that’ll please seasoned photographers." data-dimension25="$1899">View Deal</a></p></div><h3 class="article-body__section" id="section-airpods-pro-2-dan-bracaglia"><span>AirPods Pro 2 — Dan Bracaglia</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4079px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="5huAzdJrxaGMhhB7J4c87C" name="AirPods Pro 2 (3).jpg" alt="Apple AirPods Pro 2" src="https://cdn.mos.cms.futurecdn.net/5huAzdJrxaGMhhB7J4c87C.jpg" mos="" align="middle" fullscreen="" width="4079" height="2295" 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>Senior Writer, Fitness & Wearables, didn't purchase a newly released product this year; instead, he opted for a pair of AirPods Pro 2. </p><p>"Was I a fool for not ponying up the cash for the latest model? No, I ultimately decided, after reading Erin’s equally sound rationale for sticking with the <a href="https://www.tomsguide.com/audio/airpods/i-love-my-airpods-pro-2-but-i-wont-be-buying-the-airpods-pro-3-heres-why">AirPods Pro 2 over the AirPods Pro 3</a>," Dan explained.</p><p><a href="https://www.tomsguide.com/wellness/smartwatches/the-best-thing-i-bought-in-2025-is-the-airpods-pro-2-from-2022-heres-why"><strong>Read Dan's full AirPods Pro 2 thoughts.</strong></a></p><div class="product"><a data-dimension112="86f23c56-d97c-43cd-975c-c158c0844fe7" data-action="Deal Block" data-label="The AirPods Pro 2 let you save money and enjoy solid ANC, all the best Apple audio updates, spatial audio, alongside good quality sound and seamless Apple device pairing without spending tons of money on the AirPods Pro 3." data-dimension48="The AirPods Pro 2 let you save money and enjoy solid ANC, all the best Apple audio updates, spatial audio, alongside good quality sound and seamless Apple device pairing without spending tons of money on the AirPods Pro 3." data-dimension25="$199" href="https://www.amazon.com/Apple-Cancellation-Transparency-Personalized-High-Fidelity/dp/B0D1XD1ZV3" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1509px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="qKLKJjzB34MJxU93cKcHRB" name="1699012667.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qKLKJjzB34MJxU93cKcHRB.jpg" mos="" align="middle" fullscreen="" width="1509" height="1509" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The AirPods Pro 2 let you save money and enjoy solid ANC, all the best Apple audio updates, spatial audio, alongside good quality sound and seamless Apple device pairing without spending tons of money on the AirPods Pro 3.<a class="view-deal button" href="https://www.amazon.com/Apple-Cancellation-Transparency-Personalized-High-Fidelity/dp/B0D1XD1ZV3" target="_blank" rel="nofollow" data-dimension112="86f23c56-d97c-43cd-975c-c158c0844fe7" data-action="Deal Block" data-label="The AirPods Pro 2 let you save money and enjoy solid ANC, all the best Apple audio updates, spatial audio, alongside good quality sound and seamless Apple device pairing without spending tons of money on the AirPods Pro 3." data-dimension48="The AirPods Pro 2 let you save money and enjoy solid ANC, all the best Apple audio updates, spatial audio, alongside good quality sound and seamless Apple device pairing without spending tons of money on the AirPods Pro 3." data-dimension25="$199">View Deal</a></p></div><h3 class="article-body__section" id="section-fujifilm-x-t50-nikita-achanta"><span>Fujifilm X-T50 — Nikita Achanta</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8VmcabWyYxeyMX9xGmcgkH" name="Fujifilm_XT50_01.JPG" alt="A Fujifilm X-T50 camera in the charcoal grey colorway" src="https://cdn.mos.cms.futurecdn.net/8VmcabWyYxeyMX9xGmcgkH.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>"When I first held it in my hands, all the way back in May 2024, I thought it was a lovely, compact, premium camera that took incredible photos. Fast forward a whole year to me adding it to my cart and paying for it myself," said Nikita Achanta, Senior Writer, Reviews. </p><p>"I wouldn't change a thing about the Fujifilm X-T50."</p><p><a href="https://www.tomsguide.com/cameras-photography/mirrorless-cameras/best-thing-i-bought-this-year-fujifilm-x-t-50"><strong>Read Nikita's full Fujifilm X-T50 thoughts.</strong></a></p><div class="product"><a data-dimension112="f6a23ab1-9ac2-49e6-9c31-b3642b18a2ca" data-action="Deal Block" data-label="Fujifilm X-T50" data-dimension48="Fujifilm X-T50" data-dimension25="$1599" href="https://www.amazon.com/Fujifilm-Mirrorless-Digital-Camera-XC15-45mmF3-5-5-6/dp/B0D3X6N68G/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1264px;"><p class="vanilla-image-block" style="padding-top:78.01%;"><img id="HbwuHEixisNVZfUN754aZi" name="X-T50 deal body" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HbwuHEixisNVZfUN754aZi.png" mos="" align="middle" fullscreen="" width="1264" height="986" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/fujifilm-x-t50-review" data-dimension112="f6a23ab1-9ac2-49e6-9c31-b3642b18a2ca" data-action="Deal Block" data-label="Fujifilm X-T50" data-dimension48="Fujifilm X-T50" data-dimension25="$1599">Fujifilm X-T50</a> succeeds and improves on the X-T30 II, and it packs a punch with a huge 40.2MP sensor, excellent in-body image stabilization and reliable autofocus. Its biggest selling point is the new film simulation dial for maximum creativity.<a class="view-deal button" href="https://www.amazon.com/Fujifilm-Mirrorless-Digital-Camera-XC15-45mmF3-5-5-6/dp/B0D3X6N68G/" target="_blank" rel="nofollow" data-dimension112="f6a23ab1-9ac2-49e6-9c31-b3642b18a2ca" data-action="Deal Block" data-label="Fujifilm X-T50" data-dimension48="Fujifilm X-T50" data-dimension25="$1599">View Deal</a></p></div><h3 class="article-body__section" id="section-wireless-carplay-adapter-dave-leclair"><span>Wireless CarPlay adapter — Dave LeClair</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2016px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ADG2WsfKbWr3mQX72hbsRb" name="IMG_0430" alt="CarPlay Adapter in hand" src="https://cdn.mos.cms.futurecdn.net/ADG2WsfKbWr3mQX72hbsRb.jpg" mos="" align="middle" fullscreen="" width="2016" height="1134" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This is the product I bought this year and I couldn't be happier with my decision. Could I just have used a USB-C cable instead? Sure, but where's the fun in that?</p><p>"Most importantly, it works flawlessly. It never disconnects. My phone always connects in seconds. Delay is the lowest I've ever experienced with a wireless CarPlay device. It's just a solid little device that does exactly what it promises," I wrote in my piece explaining why I like this device.</p><p><a href="https://www.tomsguide.com/vehicle-tech/i-finally-bought-a-wireless-carplay-adapter-that-works-and-its-worth-every-penny"><strong>Read Dave's Wireless CarPlay Adapter thoughts.</strong></a></p><div class="product"><a data-dimension112="df35b943-5503-4a50-96de-7971a0782906" data-action="Deal Block" data-label="If you're in the market for a stable wireless CarPlay adapter, look no further. You plug the tiny dongle into your car's USB port, connect and enjoy everything CarPlay offers without wires. It's my favorite thing I purchased in 2025 — I use it every day, it works as advertised, and it makes my life more convenient, which is all I can really ask for." data-dimension48="If you're in the market for a stable wireless CarPlay adapter, look no further. You plug the tiny dongle into your car's USB port, connect and enjoy everything CarPlay offers without wires. It's my favorite thing I purchased in 2025 — I use it every day, it works as advertised, and it makes my life more convenient, which is all I can really ask for." data-dimension25="$29" href="https://www.amazon.com/dp/B0FCSB255T" 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.33%;"><img id="uW2JjsGH6hTAwTfHmuEgYg" name="1766516511.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/uW2JjsGH6hTAwTfHmuEgYg.jpg" mos="" align="middle" fullscreen="" width="1500" height="1490" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you're in the market for a stable wireless CarPlay adapter, look no further. You plug the tiny dongle into your car's USB port, connect and enjoy everything CarPlay offers without wires. It's my favorite thing I purchased in 2025 — I use it every day, it works as advertised, and it makes my life more convenient, which is all I can really ask for.<a class="view-deal button" href="https://www.amazon.com/dp/B0FCSB255T" target="_blank" rel="nofollow" data-dimension112="df35b943-5503-4a50-96de-7971a0782906" data-action="Deal Block" data-label="If you're in the market for a stable wireless CarPlay adapter, look no further. You plug the tiny dongle into your car's USB port, connect and enjoy everything CarPlay offers without wires. It's my favorite thing I purchased in 2025 — I use it every day, it works as advertised, and it makes my life more convenient, which is all I can really ask for." data-dimension48="If you're in the market for a stable wireless CarPlay adapter, look no further. You plug the tiny dongle into your car's USB port, connect and enjoy everything CarPlay offers without wires. It's my favorite thing I purchased in 2025 — I use it every day, it works as advertised, and it makes my life more convenient, which is all I can really ask for." data-dimension25="$29">View Deal</a></p></div><h3 class="article-body__section" id="section-ugreen-dxp4800-plus-ryan-epps"><span>Ugreen DXP4800 Plus — Ryan Epps</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9JavYnYi5GWyCwitiNVJ9L" name="UGREEN NASync DXP4800 Plus" alt="UGREEN NASync DXP4800 Plus" src="https://cdn.mos.cms.futurecdn.net/9JavYnYi5GWyCwitiNVJ9L.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>"The DXP4800 Plus has proven to be a total lifesaver for uploading and saving all my iPhone photos and videos, as well as handling runoff content for my video editing workflows," Staff Writer Ryan Epps wrote. </p><p>"Plus, it’s become a substitute for Netflix and Hulu, allowing me access to my favorite anime, with subtitles to boot," he continued.</p><p><a href="https://www.tomsguide.com/computing/the-coolest-piece-of-tech-i-bought-all-year-was-the-dxp4800-plus-heres-why-its-a-game-changer"><strong>Read Ryan's Ugreen DXP4800 Plus thoughts.</strong></a></p><div class="product"><a data-dimension112="6e348a47-412f-4359-b136-3f5ba2405918" data-action="Deal Block" data-label="A NAS is basically a whole virtual computer you can access from anywhere, and this has enough internal horsepower to load content quickly and effectively for streaming — Intel Pentium Gold 8505 CPU, 8GB DDR5 RAM and support for up to 136TB of storage." data-dimension48="A NAS is basically a whole virtual computer you can access from anywhere, and this has enough internal horsepower to load content quickly and effectively for streaming — Intel Pentium Gold 8505 CPU, 8GB DDR5 RAM and support for up to 136TB of storage." data-dimension25="$594" href="https://www.amazon.com/UGREEN-DXP4800-Plus-Attached-Diskless/dp/B0D22JRHZB" 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:58.53%;"><img id="PTLbU5wTyoyqS6DXLkNzQX" name="UGREEN NASync DXP4800" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PTLbU5wTyoyqS6DXLkNzQX.jpg" mos="" align="middle" fullscreen="" width="1500" height="878" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>A NAS is basically a whole virtual computer you can access from anywhere, and this has enough internal horsepower to load content quickly and effectively for streaming — Intel Pentium Gold 8505 CPU, 8GB DDR5 RAM and support for up to 136TB of storage.<a class="view-deal button" href="https://www.amazon.com/UGREEN-DXP4800-Plus-Attached-Diskless/dp/B0D22JRHZB" target="_blank" rel="nofollow" data-dimension112="6e348a47-412f-4359-b136-3f5ba2405918" data-action="Deal Block" data-label="A NAS is basically a whole virtual computer you can access from anywhere, and this has enough internal horsepower to load content quickly and effectively for streaming — Intel Pentium Gold 8505 CPU, 8GB DDR5 RAM and support for up to 136TB of storage." data-dimension48="A NAS is basically a whole virtual computer you can access from anywhere, and this has enough internal horsepower to load content quickly and effectively for streaming — Intel Pentium Gold 8505 CPU, 8GB DDR5 RAM and support for up to 136TB of storage." data-dimension25="$594">View Deal</a></p></div><h3 class="article-body__section" id="section-mayflash-f700-elite-tony-polanco"><span>Mayflash F700 Elite — Tony Polanco </span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9niRG3FCpXSzRQF7Yq7fsm" name="Mayflash F700 Elite-01" alt="Mayflash F700 Elite" src="https://cdn.mos.cms.futurecdn.net/9niRG3FCpXSzRQF7Yq7fsm.jpg" mos="" align="middle" fullscreen="" width="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>Tony Polanco, Senior Computing Writer, went out and purchased a fight stick, which furthered his love of fighting games.</p><p>"Whether you’re an arcade stick master or novice, the Mayflash F700 Elite is worth checking out for all it provides. Here’s why it’s my favorite product I purchased myself in 2025," Polanco wrote.</p><p><a href="https://www.tomsguide.com/gaming/gaming-peripherals/im-a-fighting-game-fan-and-this-arcade-stick-was-my-favorite-purchase-of-the-year"><strong>Read Tony's full Mayflash F700 Elite thoughts</strong></a><strong>.</strong></p><div class="product"><a data-dimension112="0e3e2af4-82fc-4024-969f-8805bc13e4c8" data-action="Deal Block" data-label="The Mayflash F700 Elite is an excellent choice for those looking for an overall solid arcade stick. It packs genuine Sanwa parts, is compatible with multiple platforms, and supports Bluetooth, 2.4 GHz, and wired connectivity. You can also customize it with different parts and even add your own artwork. If you're new to arcade sticks, this is an excellent option." data-dimension48="The Mayflash F700 Elite is an excellent choice for those looking for an overall solid arcade stick. It packs genuine Sanwa parts, is compatible with multiple platforms, and supports Bluetooth, 2.4 GHz, and wired connectivity. You can also customize it with different parts and even add your own artwork. If you're new to arcade sticks, this is an excellent option." data-dimension25="$179" href="https://www.amazon.com/MAYFLASH-joystick-Fighting-Bluetooth-Connection-PlayStation/dp/B0D9B6NGPM" 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="uLjHYCypQvLqUqE42chATX" name="MAYFLASH Arcade Stick F700" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/uLjHYCypQvLqUqE42chATX.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Mayflash F700 Elite is an excellent choice for those looking for an overall solid arcade stick. It packs genuine Sanwa parts, is compatible with multiple platforms, and supports Bluetooth, 2.4 GHz, and wired connectivity. You can also customize it with different parts and even add your own artwork. If you're new to arcade sticks, this is an excellent option.<a class="view-deal button" href="https://www.amazon.com/MAYFLASH-joystick-Fighting-Bluetooth-Connection-PlayStation/dp/B0D9B6NGPM" target="_blank" rel="nofollow" data-dimension112="0e3e2af4-82fc-4024-969f-8805bc13e4c8" data-action="Deal Block" data-label="The Mayflash F700 Elite is an excellent choice for those looking for an overall solid arcade stick. It packs genuine Sanwa parts, is compatible with multiple platforms, and supports Bluetooth, 2.4 GHz, and wired connectivity. You can also customize it with different parts and even add your own artwork. If you're new to arcade sticks, this is an excellent option." data-dimension48="The Mayflash F700 Elite is an excellent choice for those looking for an overall solid arcade stick. It packs genuine Sanwa parts, is compatible with multiple platforms, and supports Bluetooth, 2.4 GHz, and wired connectivity. You can also customize it with different parts and even add your own artwork. If you're new to arcade sticks, this is an excellent option." data-dimension25="$179">View Deal</a></p></div><h3 class="article-body__section" id="section-miro-v99-powerbank-john-velasco"><span>Miro V99 powerbank — John Velasco </span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PA5KinMMPDYua7ziYVuckA" name="MIRO V99 Power Bank Gaming Console" alt="MIRO V99 Power Bank Gaming Console." src="https://cdn.mos.cms.futurecdn.net/PA5KinMMPDYua7ziYVuckA.jpg" mos="" align="middle" fullscreen="" width="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 / John Velasco)</span></figcaption></figure><p>John Velasco, Senior Channel Editor for Phones, found a perfect way to spend his hard-earned money on something that's both practical and fun. He got the Miro V99 Power Bank that lets you play classic games while charging your phone.</p><p>"I’ve tested many of the best portable chargers around, but the Miro V99 is truly in a class of its own, in part due to how it also doubles as a gaming console," John wrote.</p><p><a href="https://www.tomsguide.com/phones/i-bought-this-magsafe-power-bank-to-charge-my-iphone-anywhere-and-it-doubles-as-a-retro-gaming-handheld"><strong>Read John's full Miro V99 Power Bank thoughts.</strong></a></p><div class="product"><a data-dimension112="3e3e1d22-70c1-4ce8-9223-8b52b9071990" data-action="Deal Block" data-label="Price check: $40 @ Walmart" data-dimension48="Price check: $40 @ Walmart" data-dimension25="$39" href="https://www.newegg.com/black-miro-v99-5000-mah-power-bank/p/39G-01GM-00009" 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="LkBKSWzvvbhG3qdgCt9qaW" name="MIRO V99 Power Bank Gaming Console deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/LkBKSWzvvbhG3qdgCt9qaW.png" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Miro V99 packs a 5,000 mAh battery to charge your gadgets while on the go, but it also doubles as a retro gaming handheld complete with controls and a display. It features 15W wireless charging and faster 20W wired speeds.<br><strong>Price check: </strong><a href="https://www.walmart.com/ip/MIRO-V99-3-in-1-Magnetic-Wireless-Charger-5000mAh-Multifunctional-Power-Bank-Gaming-Console-15W-MegSafe-20W-PD-Fast-Charge/17272964574" target="_blank" rel="nofollow" data-dimension112="3e3e1d22-70c1-4ce8-9223-8b52b9071990" data-action="Deal Block" data-label="Price check: $40 @ Walmart" data-dimension48="Price check: $40 @ Walmart" data-dimension25="$39"><strong>$40 @ Walmart</strong></a><a class="view-deal button" href="https://www.newegg.com/black-miro-v99-5000-mah-power-bank/p/39G-01GM-00009" target="_blank" rel="nofollow" data-dimension112="3e3e1d22-70c1-4ce8-9223-8b52b9071990" data-action="Deal Block" data-label="Price check: $40 @ Walmart" data-dimension48="Price check: $40 @ Walmart" data-dimension25="$39">View Deal</a></p></div><h3 class="article-body__section" id="section-nintendo-switch-2-scott-younker"><span>Nintendo Switch 2 — Scott Younker</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Juxvb6aK7PUJQmtiEwnCeb" name="Nintendo-Switch-2-SFII" alt="The Nintendo Switch 2 propped up on a kitchen table" src="https://cdn.mos.cms.futurecdn.net/Juxvb6aK7PUJQmtiEwnCeb.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: Stephen Lambrechts / Tom's Guide)</span></figcaption></figure><p>"This year, one of the few big and best purchases I made was the new Nintendo Switch 2. I’ve had a ton of fun playing original Nintendo games and new third-party titles on it for the last six months," wrote Scott Younker, West Coast Reporter for Tom's Guide, on his decision to buy Nintendo's latest console.</p><p>"I can honestly say that the Switch 2 is tons of fun and one of my favorite things I bought this year," Scott continued.</p><p><a href="https://www.tomsguide.com/gaming/nintendo/best-thing-i-bought-this-year-was-the-nintendo-switch-2-and-its-not-even-close"><strong>Read Scott's full Nintendo Switch 2 thoughts.</strong></a></p><div class="product"><a data-dimension112="1ac3a7d9-3282-4e36-8f1b-27a6f83f79b0" data-action="Deal Block" data-label="Price check: Amazon @ $449.99" data-dimension48="Price check: Amazon @ $449.99" data-dimension25="$449" href="https://www.nintendo.com/us/store/products/nintendo-switch-2-system-123669/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1752px;"><p class="vanilla-image-block" style="padding-top:79.11%;"><img id="cigqecPPNSzjwC5k4JMrQ9" name="Nintendo Switch 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/cigqecPPNSzjwC5k4JMrQ9.png" mos="" align="middle" fullscreen="" width="1752" height="1386" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With bundles possibly going away and prices expected to rise next year, the standalone console could be your best deal right now. It comes with the Switch 2, a set of Joy-Con 2 controllers, a TV dock and a controller holder for the Joy-Cons. <br><strong>Price check: </strong><a href="https://www.amazon.com/Nintendo-Switch-2-System/dp/B0F3GWXLTS?th=1" target="_blank" rel="nofollow" data-dimension112="1ac3a7d9-3282-4e36-8f1b-27a6f83f79b0" data-action="Deal Block" data-label="Price check: Amazon @ $449.99" data-dimension48="Price check: Amazon @ $449.99" data-dimension25="$449"><strong>Amazon @ $449.99</strong></a><strong>, </strong><a href="https://www.bestbuy.com/product/switch-2-system-nintendo-switch-2/J7GSL57TGH" target="_blank" rel="nofollow"><strong>Best Buy @ $449.99</strong></a><strong>, </strong><a href="" target="_blank" rel="nofollow"><strong>Target @ $449.99</strong></a><strong>, </strong><a href="https://www.walmart.com/ip/Nintendo-Switch-2-System/15949610846" target="_blank" rel="nofollow"><strong>$449 @ Walmart</strong></a><a class="view-deal button" href="https://www.nintendo.com/us/store/products/nintendo-switch-2-system-123669/" target="_blank" rel="nofollow" data-dimension112="1ac3a7d9-3282-4e36-8f1b-27a6f83f79b0" data-action="Deal Block" data-label="Price check: Amazon @ $449.99" data-dimension48="Price check: Amazon @ $449.99" data-dimension25="$449">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 new Apple products for 2026 that will change everything — iPhone Fold, cheap MacBook, Apple glasses and more  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/apple-in-2026</link>
                                                                            <description>
                            <![CDATA[ From the first foldable iPhone and a cheap MacBook to (maybe) smart glasses, this is a pivotal moment for Apple. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ukmAvSwci2Ytu4HfBbUCX4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sxufdZWni2zbu9Br9XSsef-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 30 Dec 2025 05:15:00 +0000</pubDate>                                                                                                                                <updated>Tue, 30 Dec 2025 17:14:19 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                    <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[Smart Home]]></category>
                                                    <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Apple Intelligence]]></category>
                                                    <category><![CDATA[Smart Glasses]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[AI]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Mark has a passion for covering all things mobile, having reviewed dozens of smartphones and other gadgets. He enjoys testing the top mobile devices and putting them up against each other in our in-depth face-offs. He also works hand in hand with our editors and testing team to continually improve how we evaluate products.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Having led Tom&#039;s Guide since 2013, Mark has focused on growing the core tech coverage of the site while also expanding into new areas, such as entertainment, fitness and home, recruiting talented writers and editors to help our readers figure out what to buy and how to get the most out of the products and services they use every day.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Mark has spoken at key industry events and appears regularly on TV to discuss the latest trends, including &lt;a href=&quot;https://cheddar.com/media/pixel-watch-gets-a-release-date-at-google-i-o-2022&quot;&gt;Cheddar&lt;/a&gt;, Fox 5, &lt;a href=&quot;https://www.foxbusiness.com/technology/apple-march-event-5g-iphone&quot;&gt;Fox Business&lt;/a&gt; and other outlets. Mark was previously editor in chief of Laptop Mag, and his work has appeared in Wired, Popular Science and Inc. Follow him on Twitter at @mspoonauer.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/sxufdZWni2zbu9Br9XSsef-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide/Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Render of Apple Glasses, HomePod with touchscreen, Siri icon, Tim Cook, MacBook Air and render of a folding iPhone.]]></media:description>                                                            <media:text><![CDATA[Render of Apple Glasses, HomePod with touchscreen, Siri icon, Tim Cook, MacBook Air and render of a folding iPhone.]]></media:text>
                                <media:title type="plain"><![CDATA[Render of Apple Glasses, HomePod with touchscreen, Siri icon, Tim Cook, MacBook Air and render of a folding iPhone.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sxufdZWni2zbu9Br9XSsef-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple is riding pretty high as 2025 comes to a close. The new <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-review">iPhone 17</a> lineup has been a huge hit so far — with the exception of the <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review">iPhone Air</a> — as CEO Tim Cook has described iPhone demand as “off the chart.” Apple is so confident that it’s forecasting its best December quarter ever, too.</p><p>There’s plenty of other reasons to be optimistic, including the continued strength of Apple silicon with the <a href="https://www.tomsguide.com/computing/cpus/apple-m5-chip-everything-you-need-to-know">M5 chip</a>, the superb new <a href="https://www.tomsguide.com/audio/airpods/apple-airpods-pro-3-review">AirPods Pro 3</a> and a recent all-time record for services revenue.</p><p>But there’s also signs of trouble at Apple, including a raft of recent high-profile departures and retirements. <a href="https://www.tomsguide.com/ai/apple-intelligence/apple-intelligences-future-uncertain-following-big-leadership-changes-in-apples-ai-team-heres-why-this-could-be-the-best-outcome">John Giannandrea</a>, Apple’s former head of Apple Intelligence, stepped down in December following a much-publicized delay to the new Siri — not to mention Apple losing ground to OpenAI and Google Gemini. </p><p><a href="https://www.bloomberg.com/news/articles/2025-12-03/apple-design-executive-alan-dye-poached-by-meta-in-major-coup" target="_blank">Meta recently scooped up Alan Dye</a>, Apple’s former head of user interface design, as Mark Zuckerberg looks to extend his company’s lead in smart glasses at a time when Apple is still struggling to sell the pricey Vision Pro. Google is about to unleash its Android XR glasses as well.</p><p>"I don't think 2026 is a make-or-break year for Apple, but I do think it’s going to be a more challenging year than 2025,” said Carolina Milanesi, president and principal analyst at Creative Strategies. “There's going to be challenges if they don't deliver on the AI promise.”</p><p>So what’s in store for Apple in 2026? Based on the rumored product pipeline and my conversations with analysts and Apple watchers, this is a pivotal moment for one of the world’s biggest brands. Here’s what to expect.</p><h2 id="the-iphone-fold-best-selling-foldable-ever">The iPhone Fold: Best-selling foldable ever?</h2><p>Apple is famous for being late to enter new categories, including smartphones. But a 2026 arrival for an Apple foldable device is really, really late.</p><p>As Samsung preps the Galaxy Z Fold 8, Apple is reportedly gearing up to launch its <em>very first</em> foldable phone in the <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone"><u>i</u>Phone Fold</a>. Nevertheless, the analyst firm <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-forecasted-to-grab-22-percent-of-foldable-phone-market-in-very-first-year-and-more-than-a-third-of-the-revenue">IDC says Apple will grab more than 20% market share</a> in the coming year and more than a third of the revenue.</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:3000px;"><p class="vanilla-image-block" style="padding-top:50.03%;"><img id="y8ttnRFF7wEwtwXBQBhntU" name="Apple 2026 A iPhone Fold" alt="Render of a potential folding iPhone" src="https://cdn.mos.cms.futurecdn.net/y8ttnRFF7wEwtwXBQBhntU.jpg" mos="" align="middle" fullscreen="" width="3000" height="1501" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>“I would not be surprised at all if the iPhone Fold instantly became the best selling folding phone of all time,” said Jason Snell, editor of the Apple-centric website <a href="https://sixcolors.com/" target="_blank">Six Colors</a> and former editorial director of <em>Macworld. </em>His reasoning? Simple. “Because it’s an iPhone.”</p><p>While many shoppers have likely been intrigued by the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a> up until now, iPhone fans have mostly sat on the sidelines because they’re not willing to switch operating systems or move out of the Apple ecosystem.</p><p>At the same time, the iPhone Fold is said to have some advantages over the competition, including a truly <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-creaseless-display-could-make-it-a-day-1-purchase-theres-just-one-problem">crease-free display</a> and large library of apps that are optimized for a tablet-size screen. There are millions of iPad apps that will simply just work on day one, as the iPhone Fold will ostensibly be an iPad mini in your pocket. </p><p>The iPhone Fold is tipped to feature a 5.5-inch screen on the outside and a 7.8-inch panel on the inside along with a pretty big 5,400 mAh battery. And it should be quite thin, as analysts are likening the phone to two iPhone Airs attached by a hinge.</p><div><blockquote><p>“I would not be surprised at all if the iPhone Fold instantly became the best selling folding phone of all time."</p><p> — Jason Snell, Editor, Six Colors</p></blockquote></div><p>And the price? The rumor is a <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-just-tipped-to-cost-an-obscene-usd2-399-but-it-could-have-this-apple-exclusive">gulp-inducing $2,40<u>0</u></a>, which would be $400 more than Samsung’s Galaxy Z Fold 7. But don’t underestimate the appetite of high-end iPhone shoppers looking to stand out from the crowd.</p><p>“Ever since the iPhone X came out for $1,000, Apple has been engaged in this ongoing experiment to find what's the upper limit that people are willing to pay for an iPhone,” Snell said. “And looking at their product line and looking at their iPhone revenue, I would say they haven't found it.”</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7585675123789810999" data-video-id="7585675123789810999" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguide" href="https://www.tiktok.com/@tomsguide">@tomsguide</a>                            <p></p><a target="_blank" title="♬ News - yagobeats" href="https://www.tiktok.com/music/News-7195974399537874945">♬ News - yagobeats</a></section>                    </blockquote></div>                <h2 id="a-super-cheap-macbook">A super cheap MacBook</h2><p>From the time Apple retired the <a href="https://www.tomsguide.com/news/apple-just-killed-the-macbook-air-with-good-keyboard-and-12-inch-macbook">12-inch MacBook</a> in 2019, industry watchers have been waiting for Apple to sell a super affordable MacBook to take on lower-cost <a href="https://www.tomsguide.com/computing/laptops/best-windows-laptops">Windows 11 laptops</a> and premium <a href="https://www.tomsguide.com/best-picks/best-chromebooks">Chromebooks</a>. And we could finally get it in 2026.</p><p>Rumor has it that Apple is working on a <a href="https://www.tomsguide.com/computing/macbooks/cheap-macbook-a18-pro-everything-we-know-so-far">cheap MacBook</a> that could cost as little as $599 or $699, with the machine powered by an A series chip. Apple technically already has a laptop in this price range with the <a href="https://www.tomsguide.com/reviews/macbook-air-2020-m1">MacBook M1</a> still selling at Walmart for $599, but this would be a brand new design.</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:4082px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="h8gTgAoY8XiEDURBBfxKU6" name="MacBook Air M4 2025-13" alt="MacBook Air 13-inch M4 shown on tabletop" src="https://cdn.mos.cms.futurecdn.net/h8gTgAoY8XiEDURBBfxKU6.jpg" mos="" align="middle" fullscreen="" width="4082" height="2296" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The target audience would be buyers who mostly want to surf the web, check email and watch videos. </p><p>The system will reportedly feature a 13-inch display, an A18 Pro chip (the same one featured in the iPhone 16 Pro models), and very long battery life. And at a time PC makers are facing a RAM shortage, Apple could have a built-in advantage versus the competition. </p><p>“I think we're going to get some very inexpensive MacBooks this year, because Apple is able to press its silicon advantage and there's sort of a curve ball being thrown by the wild swings in prices for memory,” said Avi Greengart, founder and lead analyst for Techsponential. “Apple has such volume, and because they build the memory into their package, rather than added on separately, Apple may end up with a double pricing advantage.”</p><h2 id="meet-the-homepod-touch-or-homepad">Meet the HomePod Touch (or HomePad)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:50.03%;"><img id="6cHdWWcJ7vz4iYUqsWBji4" name="Apple 2026 C HomePad Touch" alt="A rendering of an Apple HomePod with iPad-style touchscreen" src="https://cdn.mos.cms.futurecdn.net/6cHdWWcJ7vz4iYUqsWBji4.jpg" mos="" align="middle" fullscreen="" width="3000" height="1501" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Apple)</span></figcaption></figure><p>No one is really clear on the name of this product yet, but Apple is expected to launch a new smart home device that could be dubbed the <a href="https://www.tomsguide.com/audio/apples-homepod-with-a-screen-is-still-coming-in-2025-analyst-claims">HomePod Touch</a> or HomePad. And it could arrive in the spring to coincide with the launch of the revamped Siri.</p><p>The device will reportedly feature a 7-inch touch screen and run Apple’s brand-new homeOS software. It would have pre-installed apps like Safari, Apple Music, Notes, Calendar, Photos and Reminder. And widgets will reportedly be a central feature. Think a beefed-up version of the iPhone’s <a href="https://www.tomsguide.com/news/ios-17-standby">StandBy Mode</a>.</p><div><blockquote><p>“There’s no other brand that is more trusted by consumers than Apple."</p><p>— Carolina Milanesi, president and principal analyst at Creative Strategies</p></blockquote></div><p><a href="https://www.bloomberg.com/news/articles/2025-10-14/apple-to-build-upcoming-homepod-with-screen-tabletop-robot-in-vietnam?embedded-checkout=true" target="_blank">Bloomberg’s Mark Gurman</a> has reported that the HomePod Touch could cost around $350 and come in two versions, one with a speaker base and another that could attach to walls.</p><p>Apple would directly compete against the likes of Amazon and its line of Echo Show products and the <a href="https://www.tomsguide.com/reviews/google-nest-hub-max">Google Nest Hub Max</a>. But how would Apple stand out? For one, the company’s reputation for security and privacy.</p><p>“There’s no other brand that is more trusted by consumers than Apple,” Milanesi said. </p><p>Then there’s the perception that today’s smart home displays in the home just aren’t that smart. You may have an Alexa or Gemini-powered device in your abode, but how often do you use it and is it enjoyable? I happen to have the latest <a href="https://www.tomsguide.com/home/smart-home/echo-show-21-review">Echo Show 21</a> with <a href="https://www.tomsguide.com/ai/alexa-release-date-cost-devices-and-all-the-new-ai-features">Alexa+</a> inside, and I tend not to use it for anything other than turning on Christmas lights and asking about the weather. </p><p>“I feel like nobody's really cracked it,” Snell said. “Alexa and the Google Assistant stuff in the home are not that great. So Apple has opportunities there.”</p><p>But much of this will boil down to how smart the new Siri is and whether people will want to talk to it.</p><h2 id="crashing-the-smart-glasses-party">Crashing the smart glasses party</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="D5oTBDFbp8fxEQN2hHEzXY" name="apple glasses.shutterstock_1738735427" alt="Apple Glasses" src="https://cdn.mos.cms.futurecdn.net/D5oTBDFbp8fxEQN2hHEzXY.jpg" mos="" align="middle" fullscreen="" width="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>While the <a href="https://www.tomsguide.com/computing/augmented-reality/apple-vision-pro-m5-2025-review">Apple Vision Pro</a> is technically impressive, there’s no question that Apple’s $3,500 spatial computer has been a commercial flop. The headset is just too heavy and expensive for the masses, and there’s not enough killer apps to make regular use worthwhile. The new Vision Pro M5 merely added a faster chip and comfier strap. </p><p>Meanwhile, Meta has a sizable lead with its smart glasses push. The company has already sold more than 2 million units, as <a href="https://www.cnbc.com/2025/07/28/ray-ban-meta-revenue-tripled-essilorluxottica.html#:~:text=Ray%2DBan%20Meta%20smart%20glasses%20revenue%20tripled%20over,of%20its%20smart%20glasses%20in%20the%20future." target="_blank">sales tripled</a> (300% growth) in the first half of 2025. Meta shows no signs of slowing down, launching a new <a href="https://www.tomsguide.com/computing/smart-glasses/ray-ban-meta-gen-2-review">Ray-Ban Meta gen 2</a> with a sharper camera, longer battery life and improved multimodal Meta AI.</p><p>“Clearly they missed the boat, right?” Snell asked. “Apple decided they were going to build Vision Products top-down instead of bottom-up. I think they probably poo-pooed the idea of doing AirPods as glasses. It's a shame, right? Because they have all the pieces to build that product, and they just didn't build it. So I imagine that in 2026 we'll see that product.”</p><p><a href="https://www.tomsguide.com/computing/smart-glasses/apple-glasses-everything-we-know-so-far">Apple is rumored to be launching AI glasses</a> toward the end of 2026, though that release could slip to 2027. The glasses will reportedly be AI-centric (so heavily dependent on the new Siri) and offer built-in speakers and cameras, but not a display — at least at first.</p><p>“What these products do is heavily voice, camera and AI centric, and it would not be impossible for Apple to launch a pair of glasses that just do those things,” Greengart said. “They would basically be AirPods plus a camera that you wear on your face. There's no reason they couldn't do that.”</p><p>The problem for Apple is that Meta and Google are already racing ahead with smart glasses that have built-in displays. While pricey, the $799 <a href="https://www.tomsguide.com/computing/smart-glasses/meta-ray-ban-display-hands-on-this-is-the-future">Meta Ray-Ban Display</a> shows enormous potential for the category with the way they can display helpful info in your field of view, whether it’s turn-by-turn directions, a viewfinder for photos or a recipe you want to follow along with. The wrist-worn neural band also makes it fairly easy to navigate the interface, though that’s yet another device you need to charge.</p><p>And <a href="https://www.tomsguide.com/computing/smart-glasses/i-just-saw-the-future-of-android-xr-smart-glasses-and-meta-and-apple-are-in-trouble">Google is going to launch Android XR glasses</a> with partners like Samsung and Warby Parker in 2026. I’ve already demoed them and came away very impressed with the Gemini integration. You can do everything from ask what you can make from ingredients in front of you to altering photos with generative AI <em>before </em>you even take them.</p><p>“The use cases are there, even without the world’s best AI,” Greengart said. “But if you layer on serious AI capabilities that then tie into your Android phone, that’s pretty powerful. So Apple is going to need to match that in order to have a competitive product.”</p><h2 id="the-new-siri-or-bust">The new Siri — or bust</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:50.03%;"><img id="kXY7uTKX6EYEPwD7nBp2G4" name="Apple 2026 E Siri AI" alt="Siri" src="https://cdn.mos.cms.futurecdn.net/kXY7uTKX6EYEPwD7nBp2G4.jpg" mos="" align="middle" fullscreen="" width="3000" height="1501" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Apple)</span></figcaption></figure><p>If you’re sensing a theme, you’re right. In order for some of these critical new products to succeed — especially the HomePod with display and smart glasses — Apple has to nail the launch of the new Siri. </p><p>Apple actually promised a much smarter Siri way back in 2024 with the launch of the <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-16-review">iPhone 1<u>6</u></a> lineup. And while Apple delivered on some improvements, like a more conversational assistant, the biggest upgrades never materialized. These include on-screen awareness for content, better personal context understanding (“when is my Mom’s flight landing?”) and performing in-app actions via voice.</p><p>The fully new and improved <a href="https://www.tomsguide.com/ai/apple-intelligence/apples-big-siri-overhaul-looks-set-for-spring-2026-heres-what-itll-be-able-to-do">Siri is now expected to launch in spring of 2026</a>, and there’s a lot riding on it, even if AI isn’t a primary driver for selling devices yet.</p><p>“Apple has to deliver,” Milanesi said. She’s more worried about Gemini than ChatGPT as a direct competitor to Apple because the former has gotten “really good” and ties in with core applications that iPhone owners use regularly, like Google Maps and Gmail.</p><div><blockquote><p>“The lock-in of the Apple ecosystem is real. But if AI becomes a part of your life in a way that you start wanting to use things from Google or OpenAI or Anthropic or someone else, and Apple doesn't have that same level of copilot, that may be a problem.”</p><p>— Avi Greengart, lead analyst, Techsponential</p></blockquote></div><p>There are also reports that <a href="https://www.tomsguide.com/ai/apple-may-incorporate-googles-gemini-ai-assistant-in-siri-2-0">Apple may partner with Gemini</a> to accelerate its own AI, but nothing has been announced. </p><p>Techsponential’s Greengart doesn’t see Google as an immediate threat, but it could become a bigger one if Apple somehow misses with the new Siri. </p><p>“The Android ecosystem has an opportunity to whittle away at the iOS base slowly at first, if Apple is not able to respond,” Greegnart said. “The lock-in of the Apple ecosystem is real. But if AI becomes a part of your life in a way that you start wanting to use things from Google or OpenAI or Anthropic or someone else, and Apple doesn't have that same level of copilot, that may be a problem for Apple.”</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-17e-expected-upgrades-heres-why-this-new-iphone-will-be-a-bigger-deal-than-you-think">iPhone 17e expected upgrades — here's why this new iPhone will be a bigger deal than you think</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-26-guide">iOS 26 Guide: All the new features and enhancements </a></li><li><a href="https://www.tomsguide.com/computing/macbooks/5-macos-apps-i-install-first-on-every-macbook-i-review">5 macOS apps I install first on every MacBook I review</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 of the biggest tech fails of 2025: From the internet breaking down to the RAM price crisis ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/5-of-the-biggest-tech-fails-of-2025-from-the-internet-breaking-down-to-the-ram-price-crisis</link>
                                                                            <description>
                            <![CDATA[ From full-blown internet outages to RAM prices skyrocketing thanks to AI, here are Tom's Guide's top picks of the worst tech had to offer in 2025. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">YmSLtpat5eNTRVHqGMLvLK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/nHudiew2QZkJU3u5nPEH28-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 23 Dec 2025 07:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Darragh Murphy ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5QiaTSWf9FcVB7STxcdo4M.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Darragh is Tom’s Guide’s Computing Editor and is fascinated by all things bizarre in tech. This usually leads to assorted coverage varying from washing machines designed for earbuds to the wild world of laptops. Whether it&#039;s connecting Scar from The Lion King to two-factor authentication or turning his love for laptops into a fabricated rap battle from 8 Mile, he believes there’s always a quirky spin to be made.&lt;br&gt;&lt;br&gt;Darragh has previously been an Editor for Laptop Mag and a News Editor for Time Out Dubai, where he also headed the gaming and tech section. His work can be seen in Mashable, Android Police, Shortlist Dubai, Proton, theBit.nz, ReviewsFire and more. &lt;br&gt;&lt;br&gt;While laptops are his bread and butter, he’s also reviewed smartphones, monitors, speakers, docking stations and VPNs. He’s covered IFA, MWC Barcelona, the Consumer Electronics Show (&lt;a href=&quot;https://www.tomsguide.com/uk/tag/ces&quot; target=&quot;_blank&quot;&gt;CES&lt;/a&gt;) and more.&lt;br&gt;&lt;br&gt;When he&#039;s not checking out the latest devices and all things computing, he can be found going for dreaded long runs, watching terrible shark movies, and trying to find time to game.&lt;/p&gt; ]]></dc:description>
                                                                                                        <dc:contributor><![CDATA[ Tom&#039;s Guide Staff ]]></dc:contributor>
                                                                    <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/nHudiew2QZkJU3u5nPEH28-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock / Meta ]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Mark Zuckerberg, iPhone with AWS logo and Ram stick]]></media:description>                                                            <media:text><![CDATA[Mark Zuckerberg, iPhone with AWS logo and Ram stick]]></media:text>
                                <media:title type="plain"><![CDATA[Mark Zuckerberg, iPhone with AWS logo and Ram stick]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/nHudiew2QZkJU3u5nPEH28-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>What a year 2025 has been. We've seen AI take off with <a href="https://www.tomsguide.com/ai/this-is-a-dead-giveaway-that-youre-watching-an-ai-generated-video">hyper-realistic photos and videos</a> that took the internet by storm, Nintendo finally launch its long-awaited <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review">Switch 2</a>, Valve actually drop word on its upcoming <a href="https://www.tomsguide.com/gaming/pc-gaming/i-might-ditch-my-gaming-pc-for-the-steam-machine-heres-why">Steam Machine</a> and <em>so </em>much more. Oh, and I suppose <a href="https://www.tomsguide.com/entertainment/streaming/watch-blue-origin-launch-for-free-live-stream-katy-perry">Katie Perry blasting off into space</a>. </p><p>The past year has seen some massive moments for tech, and many of these were unquestionably the biggest fails we here at Tom's Guide have seen. Will it be remembered as the year the internet broke? When RAM prices were one the cheapest PC component you could get? </p><p>One thing is clear: 2025 was a time like no other, for better and for worse. And we're here for the latter to be set in stone. </p><p>Maybe we can take these blunders and reflect upon them in 2026 to make sure they never happen again... who am I kidding? Mistakes will always be around the corner, but let's make sure these moments in tech aren't forgotten by marking them off in Tom's Guide's list of the biggest tech fails of 2025. Now, ready for the worst? </p><h2 id="ramaggeddon">RAMaggeddon</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NSYr6nsP63PRbdJFMNL5pT" name="RAM sticks.jpg" alt="Two RAM sticks" src="https://cdn.mos.cms.futurecdn.net/NSYr6nsP63PRbdJFMNL5pT.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>I don’t know about you, but for me, 2025 was a year-long reminder that the material conditions many of us take for granted only exist thanks to a global supply chain that’s a lot more precarious than we like to think about.</p><p>In addition to watching failures in cloud storage providers like Amazon Web Services and Microsoft Azure cause huge problems for businesses and users worldwide, we saw prices for RAM and SSDs skyrocket over the last few weeks due (at least in part) to a steep increase in demand from AI companies.</p><p>I had been hoping the issue would blow over, but when <a href="https://www.tomsguide.com/computing/hardware/ram-crisis-continues-to-worsen-micron-kills-crucial-consumer-memory-in-favor-of-ai-data-centers">Micron killed its Crucial line of RAM</a> in early December “in order to improve supply and support for larger, strategic customers in faster-growing segments” (i.e. AI data centers), I knew we were in for a big headache. Now we’ve quickly reached the point where it’s <a href="https://www.tomsguide.com/computing/gaming-desktops/it-is-now-cheaper-to-buy-a-pre-built-gaming-pc-than-building-one-yourself-this-ram-price-crisis-is-only-going-to-get-worse-from-here">cheaper to buy a pre-built gaming PC than build one yourself</a>, much like it was during the height of the COVID-19 global shutdown, when prices on high-end graphics cards (and many other PC components) skyrocketed due to high demand and not enough supply.</p><p>Unfortunately, since this happened late in the year, the RAM crisis is one big 2025 downer that’s likely to carry well into 2026 and beyond. It doesn’t just impact folks buying (or building) desktops and laptops, either; RAM shortfalls affect manufacturers of tablets, gaming consoles and more. So <a href="https://www.tomsguide.com/computing/brace-yourself-pcs-laptops-and-phones-may-jump-in-price-as-early-as-december-thanks-to-a-500-percent-ram-ssd-surge">brace yourself: PCs, laptops and phones may jump in price</a> by 100-500% in the year ahead as manufacturers burn through their stockpiles and either jack up prices or stop selling certain products entirely. Thanks, AI! <em>— </em><a href="https://www.tomsguide.com/author/alex-wawro"><em>Alex Wawro</em></a></p><h2 id="the-internet-has-had-a-real-shaky-year">The internet has had a real shaky year</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VG4HrCsKYviDVpdwFPwK6H" name="Cloudflare" alt="Orange Cloudflare logo displayed on smartphone. There is an orange cloud with black text and a larger orange cloud in the background" src="https://cdn.mos.cms.futurecdn.net/VG4HrCsKYviDVpdwFPwK6H.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: Cheng Xin / Getty Images)</span></figcaption></figure><p>The planet is dependent on an internet connection — from vital government services to the household items around us. It’s much more than our connection to the world’s information; it’s integral to our lives.</p><p>And much of what we use the internet for is dependent on three: Amazon Web Services, Microsoft Azure and Google Cloud. These three account for approximately 65% of the entire internet, and they all suffered significant outages, which revealed some fragilities in the system.</p><p>Whether it’s the internet’s phonebook (DNS register) being run out of one server region for the planet, or content delivery networks bugging out, whenever one of these companies sneezes, the internet catches the flu, and it costs billions of dollars to the businesses that rely on it.</p><p>Then there’s the impact on you. Smart doorbells become glorified paperweights, essential banking services disappear and you can’t book a doctor’s appointment. There’s too much on the line not to address some of the issues in the lack of multi-regionality in these system architectures, and business/governments having a proper backup plan baked into their IT.</p><p>Oh, and shoutout to <a href="https://www.tomsguide.com/news/live/cloudflare-down-december-2025">Cloudflare</a>, too! While it’s not a cloud storage company, this service accounts for around 20% of all websites and went down. <em>— </em><a href="https://www.tomsguide.com/author/jason-england"><em>Jason England</em></a></p><h2 id="live-demos-are-risky-business">Live demos are risky business</h2><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="bgVCHUcYY33NK5Kjg4zSfh" name="Meta Connect 2025_ Opening Keynote 53-52 screenshot" alt="Meta RayBan Display with Zuckerberg's PoV" src="https://cdn.mos.cms.futurecdn.net/bgVCHUcYY33NK5Kjg4zSfh.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Meta)</span></figcaption></figure><p>Look, I applaud tech companies using live demos to show off their latest products. If they work as intended, they’ll be lauded as a technical marvel, especially if the stakes are high. If not, though, it goes down in history as a brutal “cringe” moment. Elon Musk felt the burn when the “bulletproof” Armored Glass of his <a href="https://www.tomsguide.com/vehicle-tech/tesla-cybertrucks-may-not-have-been-ready-and-now-theyre-malfunctioning">Cybertruck</a> shattered right before everyone’s eyes, and in 2025, Meta was awarded the fail of the year. </p><p>After revealing the much-anticipated <a href="https://www.tomsguide.com/computing/smart-glasses/meta-ray-ban-display-hands-on-this-is-the-future">Meta Ray-Ban Display</a> smart glasses at <a href="https://www.tomsguide.com/news/live/meta-connect-2025-live-updates">Meta Connect 2025</a>, pushing the tech to new heights with a seamless built-in display and a boatload of AI-enhanced apps, CEO Mark Zuckerberg decided to get a call on stage from fellow CTO Andrew "Boz" Bosworth via WhatsApp. Or, <em>tried </em>to, at least, as all we got instead was an incessant ring tone on loop, a broken AI voice stating “Boz WhatsApp video call” and an awkward Zuckerberg umming and ahing to try and rectify the situation. </p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7551224087423585549" data-video-id="7551224087423585549" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguide" href="https://www.tiktok.com/@tomsguide">@tomsguide</a>                            <p></p><a target="_blank" title="♬ original sound - Tom’s Guide" href="https://www.tiktok.com/music/original-sound-7551224184056171277">♬ original sound - Tom’s Guide</a></section>                    </blockquote></div>                <p>I mean, what else can you do when your flagship product that billions of dollars have been invested in fails live on stage? Alas, the call failed multiple times until Boz finally joined Mark on stage. It was blamed on the terrible Wi-Fi, as it was during <em>another</em> live demo when a chef asked Meta’s Live AI to create a Korean-inspired steak sauce, only for both parties to be stuck in a loop of “what do I do first?” and “you’ve already combined the base ingredients.” No, Chef Jack Mancuso had never done the latter.</p><p>Was that actually the problem, though? Nope. <a href="https://www.tomsguide.com/computing/smart-glasses/meta-fail-heres-why-mark-zuckerbergs-ray-ban-display-demo-didnt-work">Zuckerberg's Meta Ray-Ban Meta demo didn't work</a> because, first, there were too many people in the building during the rehearsal of the Live AI demo, with Boz stating, "we DDoS’d ourselves, basically." As for the WhatsApp call, that was due to a "never-before-seen bug." As Boz notes: "The display had gone to sleep at the very instant the notification had come in that a call was coming in." At the very least, that bug is now fixed. </p><p>Is that a resounding “oof” I hear? It’s still ringing in my ears. But when all is said and done, I’ll always prefer a tech company to try and impress by straight up showing me what its product can do. Let’s just make sure there’s enough prep time so it all works swimmingly right off the bat before becoming another infamous meme. Hey, it worked with Apple when Tom’s Guide’s Global Editor-in-Chief<a href="https://www.tomsguide.com/phones/iphones/iphone-17-interview-greg-joswiak-john-ternus"> Mark Spoonaur attempted to bend the iPhone Air during a live interview</a> without any damage, so take note. <em>— </em><a href="https://www.tomsguide.com/author/darragh-murphy"><em>Darragh Murphy</em></a></p><h2 id="thinner-phones-just-cannot-catch-a-break">Thinner phones just cannot catch a break</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iQJmn4VqzAJgFEn92xxox" name="iPhone Air-2" alt="iPhone Air shown in hand" src="https://cdn.mos.cms.futurecdn.net/iQJmn4VqzAJgFEn92xxox.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of the big pushes in phone hardware has to be making them thinner. While this was fine when it came to the best foldable devices, it certainly didn’t go well for the <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review">iPhone Air </a>and the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s25-edge-review">Galaxy S25 Edge</a>.</p><p>Thinner phones, as a concept, are not inherently a terrible idea. They’re easy to carry and more comfortable to keep in your pocket for one thing. The problem that both Apple and Samsung had was the sacrifices that had to be made. That includes having a lower battery life (to the degree the iPhone Air needs an actual case to reach the same level as the <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-review">iPhone 17</a>) and offering fewer camera options. </p><p>Having lower specs could, in theory at least, be an acceptable trade for the much vaunted thinness. However, the issue was that both companies decided that you should pay more cash for less. The iPhone Air cost $999 when it was released, while the Galaxy S25 Edge cost a staggering $1,099. That means both phones are more expensive than the $799 you’d pay for both the iPhone 17 and <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-s25-review">Galaxy S25</a>. That’s a big ask for a phone that has some noticeable drawbacks compared to the alternatives.</p><p>So what was the result? People simply weren’t interested in the phone to the degree that it was hoped. Now, we’re hearing that Samsung has paused work on the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-edge">Galaxy S26 Edge</a>, potentially <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-reportedly-canceling-galaxy-s26-edge-poor-sales-of-s25-edge-lead-to-last-minute-change">pushing back the release of the entire Galaxy S26 range</a>. Meanwhile, the <a href="https://www.tomsguide.com/phones/iphones/iphone-air-2-may-not-be-dead-after-all-heres-what-apple-may-have-planned-for-its-next-gen-slim-iphone">iPhone Air 2 has seemingly been delayed until 2027</a>. So while we may see the next generation of thinner phones, it looks like phone makers are being much more wary this time around. <em>— </em><a href="https://www.tomsguide.com/author/josh-render"><em>Josh Render</em></a></p><h2 id="chatgpt-5">ChatGPT-5</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1070px;"><p class="vanilla-image-block" style="padding-top:50.00%;"><img id="9mmYDgZ3CtyVPqmKqin3hN" name="ChatGPT-5" alt="ChatGPT-5 Image on a keyboard" src="https://cdn.mos.cms.futurecdn.net/9mmYDgZ3CtyVPqmKqin3hN.png" mos="" align="middle" fullscreen="" width="1070" height="535" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: ChatGPT AI generated image)</span></figcaption></figure><p>This has been a big year for OpenAI. The company behind ChatGPT has had its ups and downs, but by far its messiest of experiences was the GPT-5 launch.</p><p>After the incredible success of GPT-4o, and ChatGPT’s dominance in the world of AI chatbots, everyone was waiting patiently for the next launch, one that was supposed to change the world.</p><p>For months, the launch was teased and then delayed. Sam Altman and his team spoke of its brilliance and how they were almost scared of just how good it actually was… and then GPT-5 dropped.</p><p>Despite all of the build-up, there just wasn’t much substance. It was smarter, had a few more features and, when put against benchmark tests, was the best version of ChatGPT yet. But it still felt pretty underwhelming.</p><p>Not only that, but when users started actually using it, many felt the experience was actually worse than the previous version that had been rolled out.</p><p>To make matters worse, this older version had also been removed, forcing everyone to use ChatGPT-5 instead. OpenAI ended up getting so many complaints that the company had to pull a reverse, offering users the choice between models and promising to make rapid improvements to GPT-5.</p><p>Since then, OpenAI has released two critical updates, now bringing us up to GPT-5.2. Despite efforts to fix the damage, GPT-5 has likely been the company's least popular launch to date, and gave competitors much-needed time to catch up with it. <em>— </em><a href="https://www.tomsguide.com/author/alex-hughes"><em>Alex Huges</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/computing/cpus/cpu-war-2026-intel-panther-lake-vs-snapdragon-x2-elite-vs-amd-gorgon-point">Intel Panther Lake vs Snapdragon X2 Elite vs AMD Gorgon Point — one chip is already pulling ahead in 2026's CPU war</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/microsoft-promises-to-improve-pc-gaming-in-2026-but-will-it-be-enough-to-topple-steam">Microsoft promises to improve PC gaming in 2026, but will it be enough to topple Steam?</a></li><li><a href="https://www.tomsguide.com/computing/macos/i-just-discovered-a-secret-productivity-hack-for-my-mac-and-its-transformed-how-i-focus">I just discovered a secret productivity hack for my Mac, and it’s transformed how I focus</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Tom’s Guide Value Awards: The 43 Best Tech Bargains of the Year  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/value-awards</link>
                                                                            <description>
                            <![CDATA[ The price of everything is too much these days. This is the gear we've tested that delivers the greatest value. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">KkQbhszCbhadC2yop8jjhG</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Lx7SUvZChnMQ56dSNeT3aN-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 17 Dec 2025 12:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Audio]]></category>
                                                    <category><![CDATA[Mattresses]]></category>
                                                    <category><![CDATA[Fitness]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[Smart Home]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tom&#039;s Guide Staff ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/6hCNi5TkwpnQYs6nUTtoPc.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/Lx7SUvZChnMQ56dSNeT3aN-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[TG Value Awards 2025]]></media:description>                                                            <media:text><![CDATA[TG Value Awards 2025]]></media:text>
                                <media:title type="plain"><![CDATA[TG Value Awards 2025]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Lx7SUvZChnMQ56dSNeT3aN-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Right now everything is too expensive. Groceries, electricity, you name it. But if you’re in the market for a tech upgrade and you don’t want to spend a fortune for a quality gadget, you’ve come to the right place.</p><p>At Tom’s Guide we test and review hundreds of products each year, and our first annual Value Awards recognizes the very best bang-for-your-buck devices across multiple categories. So whether you’re looking for a big-screen Mini-LED TV, noise cancelling headphones or a new coffeemaker, we’ve got you covered with the very best bargains money can buy.</p><h3 class="article-body__section" id="section-tvs"><span>TVs</span></h3><h2 id="best-value-tv-hisense-u65qf-mini-led-tv">Best Value TV: <a href="https://www.tomsguide.com/tvs/4k-tvs/hisense-u65qf-mini-led-tv-review">Hisense U65QF Mini-LED TV</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1260px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="tCws4PKcLJgbXiswHMKMTi" name="Hisense-U65QF-01-LIST" alt="Hisense U65QF in an apartment" src="https://cdn.mos.cms.futurecdn.net/tCws4PKcLJgbXiswHMKMTi.jpg" mos="" align="middle" fullscreen="" width="1260" height="709" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Hisense)</span></figcaption></figure><p>From the moment I laid eyes on it, I knew the Hisense U65QF was one of the <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TVs</a> for the money. For a sub-$500 TV, it 's super bright, incredibly colorful and, despite using Amazon’s Fire TV platform, a joy to use. When we brought it into our labs, we confirmed all of the above. </p><p>Starting at $449 for the 55-inch Hisense 55U65QF, this budget TV put its main rivals — the TCL QM6K and LG QNED80T — in their place with its 946 nits of peak brightness and Delta-E color accuracy score (lower is better) of 1.83. I’d never seen scores like these from an affordable TV before, and I knew we found something special. </p><p>It has some issues with motion processing and upscaling, but in this price range there’s no better option than Hisense’s budget king. <em>— Nick Pino</em></p><h2 id="best-value-oled-samsung-s90f-oled-tv">Best Value OLED: <a href="https://www.tomsguide.com/tvs/oled-tvs/samsung-s90f-oled-tv-review">Samsung S90F OLED TV</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="oSubD3BL8bJCP93XLZxQ8C" name="Samsung S90F--5" alt="Samsung S90F" src="https://cdn.mos.cms.futurecdn.net/oSubD3BL8bJCP93XLZxQ8C.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" 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 Samsung S90F is one of the <a href="https://www.tomsguide.com/tvs/oled-tvs/best-oled-tvs">best OLED TVs</a> of the year. It’s expertly priced and built with a slew of features for gamers and HDR movie lovers alike. What stands out most is its QD-OLED panel, a special design that combines quantum dots with OLEDs for enhanced color performance and contrast, which is exemplified by the metrics from our testing labs. </p><p>Highlighting this incredible color performance is its 100% coverage of the UHDA-P3 gamut, matched only by the Sony Bravia 8 II this year. In filmmaker mode, the Samsung S90F also has one of the best Delta-E (color accuracy) scores. In this case, Samsung’s middle-of-the-road OLED not only offers one of the broadest ranges in color coverage for HDR movies and shows but also realistic and lifelike color performance. </p><p>Samsung added Art Store compatibility to the full range of 2025 TVs, so the S90F can act like its popular The Frame, displaying famous photographs and art from around the world when it’s not in use. Given its exceptionally thin design, the S90F feels even more like a work of art, especially when it's wall-mounted.  <em>— Nick Pino</em></p><h2 id="best-value-streaming-stick-roku-streaming-stick-plus">Best Value Streaming Stick: <a href="https://www.tomsguide.com/entertainment/streaming-devices/roku-streaming-stick-plus-review-a-slimmed-down-4k-hdr-powerhouse">Roku Streaming Stick Plus</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bsgwU2gbTf52fWgJyzab5i" name="Roku Streaming Stick Plus-1-LIST" alt="Roku Streaming Stick Plus" src="https://cdn.mos.cms.futurecdn.net/bsgwU2gbTf52fWgJyzab5i.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>You can’t go wrong with a Roku streaming stick, and the Streaming Stick Plus is the most well-rounded value of the lot. It’s designed to meet most needs, offering performance where it counts in both HDR playback and speedy navigation. With 4K/60Hz playback, it’s a stellar streaming stick to rival Amazon and Google, packing several additional features that make it among the <a href="https://www.tomsguide.com/entertainment/streaming-devices/best-streaming-devices">best streaming devices</a>. </p><p>Although it’s normally priced at $39, the Roku Streaming Stick Plus maintains a consistent discount of $29. It’s incredibly lightweight and thin, weighing just 0.90 ounces (26.0 grams), which makes it the perfect travel companion. It also comes with access to Roku’s smart home ecosystem, allowing you to check on cameras, turn on lights, and keep a watchful eye on other Roku home accessories. <em>— Ryan Epps</em></p><h3 class="article-body__section" id="section-phones"><span>Phones</span></h3><h2 id="best-value-android-phone-google-pixel-9a">Best value Android phone: <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-9a-review">Google Pixel 9a</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="o4mm7sRiU2yAEdKaMbqstb" name="Google Pixel 9a review" alt="Google Pixel 9a held in the hand." src="https://cdn.mos.cms.futurecdn.net/o4mm7sRiU2yAEdKaMbqstb.jpg" mos="" align="middle" fullscreen="" width="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 / John Velasco)</span></figcaption></figure><p>You don’t have to pay $799 or more to get a top-performing camera phone. Google’s Pixel 9a is capable of taking photos that rival anything you get from the leading flagships, even though it costs a fraction as much with its $499 starting price. The Pixel 9a benefits from the same photo-processing algorithms found on Google’s flagship phones, so images look sharp and detailed, with a nice dynamic range balancing light and shadow.</p><p>That’s not the only way the Pixel 9a offers you more value for your dollar. Its Tensor G4 chip means it can support most of the leading Google AI capabilities. (The Pixel 10 series and its newer G5 silicon introduces some newer tools.) So your phone can still offer smarts usually limited to more expensive devices among the <a href="https://www.tomsguide.com/best-picks/best-phones">best phones</a>. <em>— Philip Michaels</em></p><h2 id="best-value-iphone-iphone-17">Best value iPhone: <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-review">iPhone 17</a></h2><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="3Qc5kCG8m6FcnioZv2PK9e" name="Apple iPhone 17 review" alt="Apple iPhone 17 review." src="https://cdn.mos.cms.futurecdn.net/3Qc5kCG8m6FcnioZv2PK9e.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>While not the cheapest iPhone you can currently buy (that would be the <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-16e-review">iPhone 16e</a>), the iPhone 17 remains the same price as previous standard iPhones while adding a whole bunch of upgrades. </p><p>A larger screen with a smoother 120Hz refresh rate gives the iPhone 17 a premium touch that has been missing for many years. The dual 48MP cameras on the back, combined with the new 18MP Center Stage camera on the front, make the 17's photography capabilities more versatile than ever, while the updated A19 chipset offers users both zippier performance and better battery life. Unless you want to brave the used market, you can't get more iPhone for the money than this. <em>— Richard Priday</em></p><h3 class="article-body__section" id="section-laptops-and-tablets"><span>Laptops and tablets</span></h3><h2 id="best-value-mac-macbook-air-m4">Best value Mac: <a href="https://www.tomsguide.com/computing/laptops/macbook-air-m4-review">MacBook Air M4</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3193px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UbMJMVGeKd2UvjMvkZZPX6" name="MacBook Air M4 2025-LIST1" alt="MacBook Air 13-inch M4 shown on tabletop" src="https://cdn.mos.cms.futurecdn.net/UbMJMVGeKd2UvjMvkZZPX6.jpg" mos="" align="middle" fullscreen="" width="3193" height="1796" 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>Apple makes some of the <a href="https://www.tomsguide.com/computing/laptops/best-laptops">best laptops</a>, but they usually come with a premium. Well, that norm has been completely shattered by the M4 MacBook Air — delivering all the face-melting performance and impressive power efficiency you’d expect from any Apple Silicon-armed system at a mightily good price. At $799 (yes, the MSRP is $999, but it’s been <a href="https://www.amazon.com/Apple-2025-MacBook-13-inch-Laptop/dp/B0DZD9S5GC"><u>$200 off for months now</u></a>, so consider this the “real” retail price), this premium ultra thin-and-light is the game changer the laptop industry’s been looking for. <em>— Jason England</em></p><h2 id="best-value-windows-laptop-acer-aspire-go-15">Best value Windows laptop: <a href="https://www.tomsguide.com/computing/laptops/acer-aspire-go-15">Acer Aspire Go 15</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LSzntB5iwUhEzT7L9h6kmW" name="TG_Acer-Aspire-Go-15-2024-3.jpg" alt="Acer Aspire Go 15 (2024) review unit on desk" src="https://cdn.mos.cms.futurecdn.net/LSzntB5iwUhEzT7L9h6kmW.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>When you just need the <a href="https://www.tomsguide.com/computing/laptops/best-windows-laptops">best Windows 11 laptop</a> you can get for the cheapest possible price, look to the Acer Aspire Go 15. This $299 budget laptop has just enough hardware packed into its four-pound frame for writing, browsing the web and playing basic games. Streaming videos won't look amazing on the 15.6" 1080p display and you'll look washed-out and grainy on the 720p webcam, but they keyboard is comfy. Plus. you get plenty of ports to plug in your favorite accessories — including a better webcam if it's really important to you. And since it lasted over 10 hours in our battery tests, you know the Acer Aspire Go 15 will last you through a day of work or school.  <em>— Jason England</em></p><h2 id="best-value-tablet-ipad-11">Best value tablet: <a href="https://www.tomsguide.com/computing/ipads/ipad-11-2025-review">iPad 11</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="EENuHfMvyDEDbNKeTXA4X" name="iPad 11" alt="iPad 11" src="https://cdn.mos.cms.futurecdn.net/EENuHfMvyDEDbNKeTXA4X.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>Let the iPad Air and iPad Pro deliver the power of a laptop in a tablet. I’m here for Apple’s most affordable tablet, bringing more than enough performance to handle demanding apps, games and all the streaming services to binge my way through shows. For most, it does everything a tablet should offer and beyond, thanks to its speedy A16 chip — and <em>finally </em>delivering 128GB for storage is a boon. Apple’s base iPad offers a premium tablet experience for $349, which isn’t a bad deal, but considering it’s often found for $299 or less, the iPad 11 is value at its finest for a tablet. <em>— Darragh Murphy</em></p><h2 id="best-value-mechanical-keyboard-keychron-c1-pro-8k">Best value mechanical keyboard: <a href="https://www.tomsguide.com/computing/peripherals/keychron-c1-pro-8k-review">Keychron C1 Pro 8K</a></h2><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="aQzcXLnsT4DnB2jHnZCsEF" name="Keychron C1 Pro 8K" alt="Keychron C1 Pro 8K photographed in front of a blue background." src="https://cdn.mos.cms.futurecdn.net/aQzcXLnsT4DnB2jHnZCsEF.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 Keychron C1 Pro 8K is a retro-style wired mechanical keyboard that’s ideal for touch typists. The board’s typing angle and rake make it incredibly smooth to type on, so you can work all day long without fear of strained wrists. The board is also hot-swappable, so you can make changes to the switches and keycaps to make it the ideal keyboard for you. And since it has 8K polling, you could kit it out to be one of the <a href="https://www.tomsguide.com/computing/keyboards/ive-tested-countless-mechanical-keyboards-these-are-the-only-ones-id-buy">best gaming keyboards</a> too. <em>— Ashley Thieme</em></p><h3 class="article-body__section" id="section-audio"><span>Audio</span></h3><h2 id="best-value-headphones-1more-sonoflow">Best value headphones: <a href="https://www.tomsguide.com/audio/1more-sonoflow-pro-review">1More Sonoflow</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4080px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Hapjvd7LEFrqHsRixMeqHb" name="1More SonoFlow .jpg" alt="The 1More SonoFlow noise-cancelling headphones rested up against a concrete wall" src="https://cdn.mos.cms.futurecdn.net/Hapjvd7LEFrqHsRixMeqHb.jpg" mos="" align="middle" fullscreen="" width="4080" height="2295" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Alex Bracetti/Future)</span></figcaption></figure><p>The 1More Sonoflow show you what’s possible with a small amount of money. They make the sacrifices in all the right places — looks, extra features — so that they can focus on the important stuff. You know, like sound quality and noise-canceling performance. They sound much better than just about anything at the same, sub $100 price point, and block out plenty of noise. The icing on the budget cake? 65 hours of battery life. They even come with a helpful protective case to keep them safe from harm. What more could you want from the <a href="https://www.tomsguide.com/us/best-wireless-headphones,review-5565.html">best headphones</a> under $100?<em>— Tammy Rogers</em></p><h2 id="best-value-earbuds-sony-wf-c710n">Best value earbuds: <a href="https://www.tomsguide.com/audio/earbuds/sony-wf-c710n-wireless-earbuds-review">Sony WF-C710N</a></h2><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="tvZF87w5dAniyx6zSwXbZb" name="Sony_WF_C710N_ 8.JPG" alt="A pair of Glass Blue Sony WF-C710N wireless earbuds." src="https://cdn.mos.cms.futurecdn.net/tvZF87w5dAniyx6zSwXbZb.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>Sony’s $129 noise-canceling earbuds are one of the best things we’ve tested all year at Tom’s Guide. Despite their low price, Sony has loaded them with excellent ANC and some of the best sound under $200. They beat out options that cost twice as much — and even come in a very slick, jolly-ranchers-esque clear blue colorway. 8.5 hours of battery life helps cement them in 2025’s list of biggest pleasant surprises — and as some of the <a href="https://www.tomsguide.com/us/best-wireless-earbuds,review-6160.html">best earbuds</a> you can buy. <em>— Tammy Rogers</em></p><h2 id="best-value-speakers-edifier-r1280t">Best value speakers: <a href="https://www.tomsguide.com/audio/speakers/edifier-r1280t-review">Edifier R1280T</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:42.81%;"><img id="b3k25BzVfvnHqg8uUVMugX" name="Edifier_R1280T_ 1.JPG" alt="the edifier r1280t bookshelf speakers in wood brown photographed against the blue background, showing the volume adjustment dials, internal drivers and tweeters, RCA and aux inputs, and remote" src="https://cdn.mos.cms.futurecdn.net/b3k25BzVfvnHqg8uUVMugX.jpg" mos="" align="middle" fullscreen="" width="2560" height="1096" 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’ll always shout about low-cost gear in Tom’s Guide’s Audio section, and the R1280T deserves a ton of praise. They’re a spectacular-sounding pair of retro-looking speakers, with plenty of inputs on the back so you can build a music system around them. Great for desktops and small to mid-size rooms, these $150 wonders are an excellent option if you’re looking to up your speaker game. <em>— Tammy Rogers</em></p><h2 id="best-value-soundbar-creative-stage-pro">Best value soundbar: <a href="https://www.tomsguide.com/audio/soundbars/creative-stage-pro-review">Creative Stage Pro</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5653px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="MLu89jjwnKMgThVC7zzL4j" name="Creative Stage V2 (5).JPG" alt="The Creative Stage V2 placed in front of a TV" src="https://cdn.mos.cms.futurecdn.net/MLu89jjwnKMgThVC7zzL4j.jpg" mos="" align="middle" fullscreen="" width="5653" height="3179" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>There are two things we’re looking for when it comes to the <a href="https://www.tomsguide.com/best-picks/best-cheap-soundbars">best cheap soundbars</a>. Great sound is a given, but we also want to make sure that you’re going to get a decent package without spending more on a subwoofer — and the Stage Pro brings the goods. It comes with a subwoofer included in the box, so you get those lovely, floor-rumbling bass tones for your movies and TV. Dialogue is clear, and movie soundtracks sound stirring. There’s not really much more we could ask for at this impressive sub-$200 price point. <em>— Tammy Rogers</em></p><h3 class="article-body__section" id="section-fitness"><span>Fitness</span></h3><h2 id="best-value-walking-treadmill-deerrun-q1-mini">Best value walking treadmill: <a href="https://www.tomsguide.com/wellness/fitness/deerrun-q1-mini-review">Deerrun Q1 Mini</a></h2><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="rEtQSQXGqaMtrvH6coV6uQ" name="DeerRun_Treadmill_ 7.JPG" alt="the deerrun q1 mini under desk treadmill walking treadmill in a home office with a blue wall and wooden floor" src="https://cdn.mos.cms.futurecdn.net/rEtQSQXGqaMtrvH6coV6uQ.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 DeerRun Q1 Mini is the ideal solution for remote at-home workers who want to get their steps in while still at their desk. It’s not for runners, since it has a max speed of 3.8mph, but the 35-inch belt is perfect for taking strides at your desk. It’s a super affordable option for an <a href="https://www.tomsguide.com/best-picks/best-under-desk-treadmills">under-desk treadmill</a> and is the perfect size to fit under standing desks, and is easy to move around for storage, since it’s on wheels. For less than $150, it’s everything you could want from a walking treadmill to boost your activity scores. <em>— Sam Hopes</em></p><h2 id="best-value-massager-hyperice-venom-go">Best value massager: <a href="https://www.tomsguide.com/wellness/fitness/hyperice-venom-go-review">Hyperice Venom Go</a></h2><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="mdeqeVFmx7EZHmKNKLSM3W" name="Hyperice Venom Go" alt="Hyperice Venom Go photographed ona grey background." src="https://cdn.mos.cms.futurecdn.net/mdeqeVFmx7EZHmKNKLSM3W.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 Hyperice Venom Go is the perfect way to get targeted sports recovery and relief from everyday aches and pains. It uses reusable sticky pads that gel to the skin and conduct heat and vibrations from the massage pod. The combination of heat and vibrations soothes muscle tension but drawing blood flow to the area, and the compact size of the Venom Go means you can take it with you anywhere. The Hyperice app is also a great way to visualize your recovery routine with the device, so you can see exactly what works for you. <em>— Sam Hopes</em></p><h2 id="best-value-fitness-earbuds-soundcore-aeroclip">Best value fitness earbuds: <a href="https://www.tomsguide.com/audio/earbuds/soundcore-aeroclip-review">Soundcore AeroClip</a></h2><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="53TvxxEQYnVgVLXa2kM9oY" name="Soundcore AeroClip earbuds" alt="Soundcore AeroClip open-ear earbuds in champagne mist against a blue backdrop" src="https://cdn.mos.cms.futurecdn.net/53TvxxEQYnVgVLXa2kM9oY.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 Soundcore Aeroclips are the <a href="https://www.tomsguide.com/wellness/fitness/best-workout-headphones">perfect open-earbuds for getting active</a> and staying aware of your surroundings. They’re incredibly comfortable with awesome sound quality, and you can even customize the sound with the Soundcore app. You get 32 hours of listening time with the charging case and eight hours of playback in the buds. The design is super sleek, and they don’t budge even during the most high-intensity workouts. They also have a waterproof rating of IPX4, meaning they are protected from water splashes in all directions, making them perfect for working out in the rain too. <em>— Sam Hopes</em></p><h2 id="best-value-running-shoe-puma-velocity-nitro-4">Best value running shoe: <a href="https://us.puma.com/us/en/pd/velocity-nitro-4-mens-road-running-shoes/311140">Puma Velocity Nitro 4</a> </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mzm3RFv7XS8MhH6W7HiLkM" name="Puma Velocity Nitro 4" alt="Puma Velocity Nitro 4" src="https://cdn.mos.cms.futurecdn.net/mzm3RFv7XS8MhH6W7HiLkM.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Finding value in the running shoe market often means buying older models in sales, but the Puma Velocity Nitro 4 is an excellent new shoe that undercuts most of its competitors on price while also outperforming them. It has enough cushioning to deliver a comfortable ride during your easy daily training runs, but the lively foam in its midsole provides enough bounce for faster workouts as well. Add in a comfortable upper and a durable outsole that grips better than most shoes in slick conditions and the Velocity Nitro 4 is a terrific all-round option at a good price. <em>— Nick Harris-Fry</em></p><h2 id="best-value-cross-trainer-nike-metcon-10s">Best value cross trainer: <a href="https://www.nike.com/t/metcon-10-mens-workout-shoes-WWGl2m1D/HJ1875-003">Nike Metcon 10s</a> </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6R8pHHfqUkpB47qKYS6R4k" name="nike metcon 10 outdoors" alt="Nike Metcon 10 in black and white on grass" src="https://cdn.mos.cms.futurecdn.net/6R8pHHfqUkpB47qKYS6R4k.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Nike Metcon lineup has sat pretty stagnant in the cross training shoe world, with the 8s and 9s considered overly stiff and lacking versatility compared with competitors. However, the Metcon 10 has changed everything. The 10s tick boxes for stability, grip, lockdown and mobility, and are the comfiest pair from Nike we’ve tested yet, finally answering calls for true versatility. </p><p>The over-pronounced rubber wrap rope guard has been pared back, and the shoe has been made more pliable and flexible around the forefoot with a wider toe box and a stable but minimized Hyperlift plate for lifting. Dual-density ReactX midsole cushioning makes the shoe feel bouncier and suited to short runs. We think that, given the brand (and range), it offers true value for the money. <em>— Sam Hopes</em></p><h3 class="article-body__section" id="section-wearables"><span>Wearables</span></h3><h2 id="best-value-smartwatch-apple-watch-se-3">Best value smartwatch: <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-se-3-review">Apple Watch SE 3</a> </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2695px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cqqXHXhca6NSb5cHYHfMjm" name="AW-SE3-01" alt="Apple Watch SE 3" src="https://cdn.mos.cms.futurecdn.net/cqqXHXhca6NSb5cHYHfMjm.jpg" mos="" align="middle" fullscreen="" width="2695" height="1516" 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>You’d be hard-pressed to find a <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">better smartwatch</a> bargain than the latest entry-level Apple Watch SE 3 for $249. Not only is it Apple’s easiest-wearing smartwatch, but it also has nearly all the same features as its much pricier siblings. These include an always-on display, on-device Siri, FDA-cleared sleep apnea detection, a daily sleep score with detailed sleep reports, tons of workout tracking modes, and support for all the same gesture controls, including the latest wrist flick gesture for dismissing notifications. <em>— Dan Bracaglia</em></p><h2 id="best-value-fitness-tracker-amazfit-active-2">Best value fitness tracker: <a href="https://www.tomsguide.com/wellness/smartwatches/i-just-tested-the-amazfit-active-2-7-things-you-should-know-about-my-favorite-smartwatch-under-usd100">Amazfit Active 2</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2717px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="WTG5StQiZhMe2PUMZmUrCQ" name="Active2-snow-03" alt="Close-up of the Amazfit Active 2 on a user's wrist while tracking a day of snowboarding" src="https://cdn.mos.cms.futurecdn.net/WTG5StQiZhMe2PUMZmUrCQ.jpg" mos="" align="middle" fullscreen="" width="2717" height="1528" 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 Amazfit Active 2 is hands down my<a href="https://www.tomsguide.com/us/best-fitness-trackers,review-2066.html"> favorite fitness tracker</a> under $100. First and foremost, it plays nicely with both Androids and iPhones. It also features wellness and fitness tracking tools/tech normally reserved for much pricier smartwatches. These include an onboard SpO2 sensor, body temperature sensor, and GPS. Comfortable and attractively designed with a faux tachymeter bezel, the Active also features a bright and easy-to-read AMOLED screen. And even though it is somewhat limited when it comes to smart features, you do get NFC for mobile payments, decent offline navigational tools, and an onboard AI voice assistant. The Active 2 additionally supports over 160 sports tracking modes. That’s a lot of smartwatch for under a Benjamin! <em>— Dan Bracaglia</em></p><h2 id="best-value-smart-ring-ringconn-gen-2-air">Best value smart ring: <a href="https://www.tomsguide.com/wellness/smart-rings/ringconn-gen-2-air-review-this-budget-smart-ring-beats-the-oura-ring-4-in-three-big-ways">Ringconn Gen 2 Air</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ftKf6tmSGBTYRuNyWvjFr5" name="RingConn2Air-12" alt="Close-up of the Ringconn Gen 2 Air smart ring" src="https://cdn.mos.cms.futurecdn.net/ftKf6tmSGBTYRuNyWvjFr5.jpg" mos="" align="middle" fullscreen="" width="3600" height="2025" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Ringconn Gen 2 Air is my favorite wallet-friendly <a href="https://www.tomsguide.com/wellness/fitness-trackers/best-smart-rings">smart ring</a>, priced at $199 and completely subscription-free. Reasonably comfortable, with a battery that’s good for over a week — that’s better than the Oura Ring 4 — the Gen 2 Air offers comprehensive sleep-tracking insights and 24/7 vitals monitoring. While the latest Oura Ring and Samsung Galaxy Ring provide an even greater level of overall holistic insights —  including more fitness and recovery tools, as well as women’s health features — those from the Ringconn Gen 2 Air are accurate and easy to digest, making the device a perfect option for first-time smart ring buyers. <em>— Dan Bracaglia</em></p><h2 id="best-value-fitness-band-amazfit-helio-strap">Best value fitness band: <a href="https://www.tomsguide.com/wellness/fitness-trackers/amazfit-helio-strap-review">Amazfit Helio Strap</a></h2><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="ibJX8xhu4kLzChkudRvSKh" name="Amazfit_Helio_Strap_ 6.JPG" alt="the amazfit helio strap fitness tracker with a screenless design, showing the gray strap worn around the wrist and the charger" src="https://cdn.mos.cms.futurecdn.net/ibJX8xhu4kLzChkudRvSKh.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>This subscription-free alternative to the screen-less Whoop fitness tracker costs just $99. Just as comfortable with similar battery life to the pricier competition (up to 12 days for the Helio Strap), it churns out loads of sleep insights and fitness tracking metrics. And even though the automatic workout detection is a little less reliable than we’d like, this is still a seriously powerful yet discreet way to keep tabs on your well-being and/or fitness journey without breaking the bank. <em>— Dan Bracaglia</em></p><h2 id="drones">Drones</h2><h2 id="best-value-drone-potensic-atom-2">Best value drone: <a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-2-review">Potensic Atom 2</a></h2><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="t9j7quHUUF8obFawLDcuGh" name="Potensic_Atom2_Drone_ 14.JPG" alt="A Potensic Atom 2 drone" src="https://cdn.mos.cms.futurecdn.net/t9j7quHUUF8obFawLDcuGh.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>DJI isn’t the be-all end-all among the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a>, of course, and the Potensic Atom 2 makes a compelling case for not just a great value dront, but also as a competent, powerful quadcopter. It’s cheaper than the aforementioned Flip but it still captures detailed 48MP stills and 4K/30fps video. This bang-for-your buck drone features an AI night mode which works well in dimly lit environments, and AI subject tracking that powers fun intelligent flight modes, such as Parallel and Spotlight. <em>— Nikita Achanta</em></p><h3 class="article-body__section" id="section-wi-fi-routers"><span>Wi-Fi routers</span></h3><h2 id="best-value-router-tp-link-archer-ge650">Best value router: <a href="https://www.tomsguide.com/computing/routers/tp-link-archer-ge650-review">TP-Link Archer GE650</a> </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Q7NeezvwQoqVjFpo6eqAhM" name="TP-Link-Archer-GE650-LIST" alt="A TP-Link Archer GE650 router on a desk next to a monitor" src="https://cdn.mos.cms.futurecdn.net/Q7NeezvwQoqVjFpo6eqAhM.jpg" mos="" align="middle" fullscreen="" width="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><a href="https://www.tomsguide.com/best-picks/best-gaming-routers">Gaming-centric Wi-Fi routers</a> usually come with a serious price premium, but TP-Link clearly didn’t get the memo with this monster of a Wi-Fi 7 option. While the list price is $350, it’s almost always available for $250, and for that you’re getting a fully-featured router. I’m talking multi-gig speeds, impressive signal range, top notch customization and easy-to-use security via the app, while also giving you game port forwarding to prioritize data to maximizing your online multiplayer bandwidth. <em>— Anthony Spadafora</em></p><h2 id="best-value-mesh-router-netgear-orbi-370">Best value mesh router: <a href="https://www.tomsguide.com/computing/routers/netgear-orbi-370-review-the-most-affordable-orbi-mesh-kit-yet?_gl=1*y23q56*_up*MQ..&gclid=CjwKCAiAzrbIBhA3EiwAUBaUdSt40NrI2And82tJaN5Cwe49JXz008uH8_iueDxyR_-yb6zN41cLJxoCQI4QAvD_BwE&gbraid=0AAAAAqzfqMYM897YZorurfQVv9nw8xId1">Netgear Orbi 370</a> </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="W6wQBSJSVKNPse3TSnvfDm" name="Netgear-Orbi-370--5" alt="Netgear Orbi 370 mesh router on a shelf" src="https://cdn.mos.cms.futurecdn.net/W6wQBSJSVKNPse3TSnvfDm.jpg" mos="" align="middle" fullscreen="" width="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>Turns out one of the cheaper mesh Wi-Fi systems you can get is also one of the better options to buy in terms of pure performance and power efficiency. If you need to spread your signal out around the house, this $350 three-pack is capable of covering 6,000 square feet with Wi-Fi 7 signal. That ensures gigabit speeds at close range, and a huge range of coverage wherever you are. For something with similar specs, you could be expecting to pay at least twice the price, so this is real value for your money among the <a href="https://www.tomsguide.com/computing/routers/best-mesh-wi-fi-systems">best mesh Wi-Fi systems</a>. -<em> Jason England</em></p><h3 class="article-body__section" id="section-smart-home"><span>Smart Home</span></h3><h2 id="best-value-smart-speaker-amazon-echo-dot">Best value smart speaker: <a href="https://www.tomsguide.com/reviews/amazon-echo-dot-5th-gen">Amazon Echo Dot</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kxyJFPGWFXuCB9sU4Xkwab" name="TG_Amazon Echo Dot 5th Gen_LIST.jpg" alt="Amazon Echo Dot (5th Gen)" src="https://cdn.mos.cms.futurecdn.net/kxyJFPGWFXuCB9sU4Xkwab.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Amazon's 5th-generation Echo Dot is a bit long in the tooth — it was released in 2022 — but, thanks to the upgrades Amazon made with Alexa+, this <a href="https://www.tomsguide.com/us/best-smart-speakers,review-4480.html">smart speaker</a> continues to deliver exceptional value three years later. In addition to its low price, it also acts as an Eero Wi-Fi satellite, and a built-in temperature sensor allows you to integrate it into your smart home routines. Yes, you'll get better sound out of more expensive speakers, but the Echo Dot is great for those times when you just want something playing in the background. <em>— Mike Prospero</em></p><h2 id="best-value-smart-plug-tp-link-tapo-smart-plug-mini">Best value smart plug: <a href="https://www.tomsguide.com/us/best-smart-plugs,review-4087.html">TP-Link Tapo Smart Plug Mini</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xnBy3jj5y8eq7qw6627z2g" name="tapo p125" alt="TP-Link Tapo P125" src="https://cdn.mos.cms.futurecdn.net/xnBy3jj5y8eq7qw6627z2g.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: TP-Link)</span></figcaption></figure><p>Our <a href="https://www.tomsguide.com/us/best-smart-plugs,review-4087.html">best value smart plug</a> is also our favorite model overall. Why? Because it delivers exceptional value for the price. It's small and well-designed and works with every major smart home platform, thanks to its integration with Matter. We connected it just as easily to Alexa as we did Apple Home. Plus, the Tapo app makes it simple to schedule; it has a vacation mode; and can even turn on and off automatically at sunrise and sunset, so it can adjust with the seasons. <em>— Mike Prospero</em></p><h2 id="best-value-security-camera-wyze-cam-v4">Best value security camera: <a href="https://www.tomsguide.com/home/smart-home/wyze-cam-v4-review-the-new-king-of-budget-security-cameras">Wyze Cam v4</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UHHacHvUQJKgA4jBcn7rx8" name="Wyze Cam v4 Her.jpg" alt="Wyze Cam v4 mounted to outdoor beam" src="https://cdn.mos.cms.futurecdn.net/UHHacHvUQJKgA4jBcn7rx8.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Wyze)</span></figcaption></figure><p>Wyze has long made some of the <a href="https://www.tomsguide.com/best-picks/best-home-security-cameras">best home security cameras</a> for less, and the Wyze Cam V4 is a prime example. In our testing, this camera delivered great looking video both indoors and out with its 2.5 QHD resolution, and costs less than $40. But what also makes this camera a great value is that you can save video locally, so you don't necessarily need to sign up for a subscription to use it — unlike many other security cameras. <em>— Mike Prospero</em></p><h2 id="best-value-smart-lock-yale-approach">Best value smart lock: <a href="https://www.tomsguide.com/home/smart-home/yale-approach-smart-lock-review-a-great-retrofit-smart-lock">Yale Approach</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="y7kpzvSBjS7uZztUeysxVW" name="Yale Install 3.jpg" alt="Yale Approach smart lock powered on" src="https://cdn.mos.cms.futurecdn.net/y7kpzvSBjS7uZztUeysxVW.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Yale Approach has most of the features you'll need in one of the <a href="https://www.tomsguide.com/us/best-smart-locks,review-3352.html">best smart locks</a>, all for less than $100. This smart lock takes its cues from the August Smart Lock, which means we found it easy to install. We also like the fact that it works with Alexa and Google Home (our one nitpick: no Apple Home support). As this is a retrofit lock, you'll only be replacing the inside portion of your deadbolt, so it's not apparent to visitors from the outside that you have a smart lock. You can also get this lock with or without a fingerprint reader, and if you want to unlock it using a keypad, you'll have to purchase that separately. <em>— Mike Prospero</em></p><h3 class="article-body__section" id="section-home-appliances"><span>Home appliances</span></h3><h2 id="best-value-keurig-keurig-k-mini-mate">Best value Keurig: <a href="https://www.tomsguide.com/home/coffee-makers/keurig-k-mini-mate-coffee-maker-review">Keurig K-Mini Mate</a> </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="z9P3ZaKUqWGBSzjMKHoeeg" name="Keurig K-Mini Mate-04" alt="Keurig K-Mini Mate" src="https://cdn.mos.cms.futurecdn.net/z9P3ZaKUqWGBSzjMKHoeeg.jpg" mos="" align="middle" fullscreen="" width="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>Cute, compact and reasonably priced, if you’re looking for a Keurig coffee maker, the K-Mini Mate is a savvy choice. Even at full price, it’s very affordable, but it can also be found on sale frequently. This machine delivers everything you need from a pod coffee maker: one-touch speedy brewing, a hot cup of Joe, and it also comes in a range of fun colors. It’s the ideal first coffee maker for students or those living in smaller apartments. <em>— Millie Fender</em></p><h2 id="best-value-blender-ninja-blast-max-blender">Best value blender: <a href="https://www.tomsguide.com/home/home-appliances/ninja-blast-max-review">Ninja Blast Max Blender </a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hgBRxUka73g3xLcEdTUEmM" name="Ninja Blast Max before smoothie listing" alt="Ninja Blast Max review" src="https://cdn.mos.cms.futurecdn.net/hgBRxUka73g3xLcEdTUEmM.jpg" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide )</span></figcaption></figure><p>Looking for a high-quality sub-$100 blender? The Ninja Blast Max ticks a lot of boxes. In our review, we used it to blend everything from pancake batter to frozen berries, and it outperformed every other cordless blender we’ve used. It also did an excellent job of crushing ice, while its portable rechargeable base and removable drinking cup makes it ideal for taking to the gym, on trips, or even to the office. <em>— Millie Fender</em></p><h2 id="best-value-air-fryer-philips-2000-series-air-fryer">Best value air fryer: <a href="https://www.tomsguide.com/home/home-appliances/philips-2000-series-air-fryer-review">Philips 2000 Series Air Fryer</a></h2><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="SMRBSP2S7PZafbvNpwkeJ6" name="Philips_2000series_Airfryer_.JPG" alt="philips 2000 series air fryer with a 6.6 basket and a window, a vortex grill for air circulation, 13 preset modes, and an led screen for timing and heat settings" src="https://cdn.mos.cms.futurecdn.net/SMRBSP2S7PZafbvNpwkeJ6.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>You’ll struggle to find many good air fryers for under $80, but if you’re on a budget, the brand you should try is Philips. It impresses us time and time again with its high-quality designs and premium performance, while often costing much less than alternatives from Ninja and Instant. The 2000 Series was new this year, costs under $100, and even features a fancy window which allows you to watch your food as it cooks. For the price, it doesn’t get much better. <em>— Millie Fender</em></p><h2 id="best-value-espresso-machine-casabrews-3700-essential">Best value espresso machine: <a href="https://www.tomsguide.com/home/coffee-makers/casabrews-3700-essential-review">Casabrews 3700 Essential</a></h2><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="V6Z6q4MHTNFaLfZGcaM7kB" name="casabrews_3700_.JPG" alt="the casabrews 3700 essential espresso machine photographed against a blue background in stainless steel" src="https://cdn.mos.cms.futurecdn.net/V6Z6q4MHTNFaLfZGcaM7kB.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>In the world of espresso machines, it doesn’t get much cheaper than the Casabrews 3700 Essential. But with its steel-colored exterior, single and double shot buttons, and surprisingly capable steam wand, it can more than hold its own against machines two or three times the price. Reviewer Erin said it best: “if you want an espresso machine for as little money as possible, the Casabrews 3700 Essential really is the best option.” <em>— Millie Fender</em></p><h2 id="best-value-ice-cream-maker-cuisinart-fastfreeze">Best value ice cream maker: <a href="https://www.tomsguide.com/home/kitchen-dining/cuisinart-fastfreeze-ice-cream-maker-review">Cuisinart FastFreeze</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="inqCpYKEX89iMeZAzyT5FM" name="Cuisinart Freeze Wand listing" alt="Cuisinart FastFreeze" src="https://cdn.mos.cms.futurecdn.net/inqCpYKEX89iMeZAzyT5FM.jpg" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The FastFreeze is a Ninja Creami contender that more than holds its own. It’s compact, (comparatively) quiet, and capable of churning some seriously tasty ice cream from scratch. We were seriously wowed by just how affordable this machine is, awarding it a rare five stars in our <a href="https://www.tomsguide.com/home/kitchen-dining/cuisinart-fastfreeze-ice-cream-maker-review">FastFreeze review</a>. If you want to get in on the homemade ice cream trend on a budget, it’s a no-fuss option that delivers every time. <em>— Millie Fender</em></p><h3 class="article-body__section" id="section-robot-vacuums"><span>Robot vacuums</span></h3><h2 id="best-value-robot-vacuum-tp-link-tapo-rv30-max-plus">Best value robot vacuum: <a href="https://www.tomsguide.com/home/tp-link-tapo-rv30-max-plus-review">TP-Link Tapo RV30 Max Plus</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fS3FPkvBzAjDzLGckEkToH" name="tp-link-tapo-rv30-max-plus-5-LIST" alt="TP-Link Tapo RV30 Max Plus on carpet floor" src="https://cdn.mos.cms.futurecdn.net/fS3FPkvBzAjDzLGckEkToH.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>For those not looking to splurge on a robot mop hybrid, the Tapo RV30 is a great budget-friendly pick. We were impressed by its overall performance, particularly on hard floors, where it quickly handled larger debris such as cereal and kitty litter. It also mops away light stains and dirt in no time, despite not having water tanks. It may not have all the fancy mod-cons or features, but the Tapo RV30 is one of the best, cheapest robot vacuums that will get the job done well. <em>— Cynthia Lawrence</em></p><h2 id="best-value-robot-vacuum-mop-switchbot-k11-robot-vacuum-and-mop">Best value robot vacuum/mop: <a href="https://www.tomsguide.com/home/smart-home/switchbot-k11-robot-vacuum-review">SwitchBot K11 Robot Vacuum and Mop</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3675px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="W4MFU8GV2ENtrB9suoXLXD" name="SwitchBot K11+ Robot Vacuum_LIST" alt="SwitchBot K11+ Robot Vacuum review" src="https://cdn.mos.cms.futurecdn.net/W4MFU8GV2ENtrB9suoXLXD.jpg" mos="" align="middle" fullscreen="" width="3675" height="2067" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Despite its small stature and value price, this robot vacuum and mop hybrid did a great job at cleaning. In our tests, it impressed us with its pet hair suction and managed to pick up every last bit of debris, both on hardwood and carpet. Its only downfall was its mop deep cleaning and inconsistent mapping. However, it excels in light cleaning, and its miniature size makes it perfect for smaller homes. <em>— Cynthia Lawrence</em></p><h2 id="best-value-stick-vacuum-dreame-r10-pro-cordless-vacuum">Best value stick vacuum: <a href="https://www.tomsguide.com/home/home-appliances/dreame-r10-pro-review">Dreame R10 Pro Cordless Vacuum</a></h2><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="MoVCRFmk8LgZHhYWAioDFL" name="Dreame_R10_Pro_vacuum_.JPG" alt="A black and gold Dreame R10 Pro cordless vacuum cleaner" src="https://cdn.mos.cms.futurecdn.net/MoVCRFmk8LgZHhYWAioDFL.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>If you don’t have the budget for a Dyson but are still after exceptional power, the Dreame R10 Pro cordless is a somewhat surprising contender. Its design may look basic, but it's incredibly lightweight, easy to use, and can suck up just about anything off hardwood and carpets. Despite not having a display to see your settings, we liked its bright, LED floor lights to easily see under the sofa, and the bendable crevice gets into hard-to-reach places. Plus, it has a long-lasting battery at just over an hour. Priced under $250, this makes it a worthwhile investment. <em>— Cynthia Lawrence</em></p><h3 class="article-body__section" id="section-home-office"><span>Home office</span></h3><h2 id="best-value-standing-desk-uplift-v3">Best value standing desk: <a href="https://www.tomsguide.com/home/home-office/uplift-v3-standing-desk-review">Uplift V3</a> </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xgWA6fqMhvLpCiPqCTP2TM" name="Uplift V3--06" alt="An overhead view of a desk setup built around the Uplift V3 standing desk" src="https://cdn.mos.cms.futurecdn.net/xgWA6fqMhvLpCiPqCTP2TM.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Uplift V3 is a highly refined standing desk that builds on the solid foundation of its predecessor. To make things easier, Uplift Desk has simplified the assembly process while also adding a new, wider cable management tray. Not only is one included with every desk but it’s now flexible and highly adjustable, which allows it to easily accommodate a large powerstrip and several bulky power adapters too. If you’re after a solid and extremely stable standing desk you’ll be able to use for years to come and adapt to the task at hand, the Uplift V3 is an excellent investment for your workspace and your productivity. <em>— Anthony Spadafora</em></p><h2 id="best-value-office-chair-branch-aire-chair">Best value office chair: <a href="https://www.tomsguide.com/home/home-office/branch-aire-chair-review">Branch Aire Chair</a> </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="muHpaZpg3HhwbjocFUAJRh" name="Branch Aire Chair-03" alt="The Branch Aire Chair in front of a desk" src="https://cdn.mos.cms.futurecdn.net/muHpaZpg3HhwbjocFUAJRh.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Branch Aire Chair has a premium look and feel to it despite its mid-range price. This all-mesh office chair is easy to assemble, comes with an optional headrest included and you get great support from its adaptive tilt and zoned mesh. The Branch Aire Chair also features a weight-activated mechanism you rarely find at this price that allows the chair to adapt to your body’s movements throughout the day. While you aren’t getting dedicated lumbar support and its recline is somewhat limited, this is a fantastic and sleek-looking chair that will keep you cool while working without breaking the bank. <em>— Anthony Spadafora</em></p><h3 class="article-body__section" id="section-sleep-mattress"><span>Sleep/Mattress</span></h3><h2 id="best-value-mattress-dreamcloud-classic-hybrid-mattress">Best value mattress: <a href="https://www.tomsguide.com/reviews/dreamcloud-mattress">DreamCloud Classic Hybrid Mattress</a></h2><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="mWMdx7B8ogHcD2SbjmGDQ8" name="DreamCloud Classic hybrid mattress" alt="The image shows the DreamCloud Classic hybrid mattress on a wooden bed frame in a blue bedroom" src="https://cdn.mos.cms.futurecdn.net/mWMdx7B8ogHcD2SbjmGDQ8.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 DreamCloud is the second highest-scoring mattress we’ve tested, beating many luxury rivals. That’s impressive considering you can buy a queen DreamCloud Classic Hybrid for under $700 – that’s $1,100 cheaper than our <a href="https://www.tomsguide.com/best-picks/best-mattresses">best mattress</a> of the year, the Saatva Classic. The DreamCloud delivers excellent comfort and support for a range of body types and sleeping positions, except for heavier weight stomach sleepers (see the Siena Signature below). It’s also breathable and safe for hot sleepers. If you want a luxury <a href="https://www.tomsguide.com/best-picks/best-hotel-mattresses">hotel mattress</a> but have a smaller budget, the DreamCloud is an excellent mid-range alternative. No mattress delivers more bang for your buck for most sleepers than this one. <em>— Claire Davies</em></p><h2 id="best-value-sleep-tracker-withings-sleep-analyzer">Best value sleep tracker: <a href="https://www.tomsguide.com/wellness/sleep-tech/withings-sleep-analyzer-review">Withings Sleep Analyzer</a></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5120px;"><p class="vanilla-image-block" style="padding-top:42.19%;"><img id="V5sWtiai6T8x8EcSxUjreT" name="Withings Sleep Analyzer hero" alt="Grey Withings sleep tracking mat on white mattress" src="https://cdn.mos.cms.futurecdn.net/V5sWtiai6T8x8EcSxUjreT.jpg" mos="" align="middle" fullscreen="" width="5120" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Instead of constantly wearing a smart ring or watch, this pad from Withings simply slips underneath your mattress to track your sleep, before sending the data directly to your phone. And after <a href="https://www.tomsguide.com/wellness/sleep-tech/withings-sleep-analyzer-review">reviewing the Withings Sleep Analyzer</a>, we think it’s certainly one of the <a href="https://www.tomsguide.com/wellness/sleep-tech/best-sleep-tracker">best sleep trackers</a> of the year. Priced at $199 at Withings, we compared its data with the more expensive Oura Ring 4 (a smart ring that retails at $349) and found it was consistently accurate (aside from a few times it thought lounging in bed was a daytime nap). For a sleep tracker that can <a href="https://pubmed.ncbi.nlm.nih.gov/33590821/">accurately identify sleep apnea</a>, we think this device is an excellent value.<em> — Lauren Jeffries</em></p><h2 id="best-value-sunrise-alarm-clock-dreamegg-sunrise-alarm-clock">Best value sunrise alarm clock: <a href="https://www.tomsguide.com/wellness/sleep-tech/hatch-restore-3-vs-dreamegg-sunrise-alarm-clock">DreamEgg Sunrise Alarm Clock</a></h2><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="TyBXfMrURuYJ2a49uU7cUh" name="Dreamegg Sunrise Alarm Clock" alt="Dreamegg Sunrise Alarm Clock" src="https://cdn.mos.cms.futurecdn.net/TyBXfMrURuYJ2a49uU7cUh.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dreamegg)</span></figcaption></figure><p>The DreamEgg is a high-quality smart alarm, complete with great sunrise simulation and sleep sounds, that’s over $100 cheaper than the premium alarm clocks offered by tech brands such as Hatch and Lumie. In our <a href="https://www.tomsguide.com/wellness/sleep-tech/dreamegg-sunrise-alarm-clock-review">DreamEgg review</a>, we loved how the smart alarm is fully functional without a phone or app, with the essential buttons located on top of the clock. Plus it’s free of any pesky subscriptions, and the neutral color scheme looks chic and modern on your nightstand. <em>— Eve Davies</em></p><h2 id="best-value-pillow-coop-sleep-goods-original-adjustable-pillow">Best value pillow: <a href="https://www.tomsguide.com/mattresses/pillows-bedding/coop-sleep-goods-original-adjustable-pillow-review">Coop Sleep Goods Original Adjustable Pillow</a> </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:56.30%;"><img id="B7kwFqBWz27dnDbMv3qngL" name="Coop Sleep Goods Adjustable Latex Pillow" alt="Coop Sleep Goods Adjustable Latex Pillow" src="https://cdn.mos.cms.futurecdn.net/B7kwFqBWz27dnDbMv3qngL.jpg" mos="" align="middle" fullscreen="" width="4000" height="2252" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Alison Barretta)</span></figcaption></figure><p>It’s unlikely that you can ever go wrong with the Coop Original Adjustable pillow. With a memory foam and microfiber fill mimicking natural down-like comfort and support and a fully adjustable build, it’s suitable for all sleeping positions and body types. It also comes with a super breathable cover made of Lulltra fabric (a blend of bamboo viscose rayon and polyester) which can work well for most hot sleepers too (or you can go for their Cool+ variant). At $85 for a standard size including a 100-night trial, 5-year warranty and free shipping, this is simply the <a href="https://www.tomsguide.com/best-picks/best-pillow">best pillow</a> you can get your hands on right now.<em> — Becky George</em></p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Amazon just announced a huge delivery upgrade affecting 2,300 US cities ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/amazon-just-announced-a-huge-delivery-upgrade-affecting-2-300-us-cities</link>
                                                                            <description>
                            <![CDATA[ Amazon has expanded its same-day grocery delivery to more than 2,300 cities since rolling out the feature in August. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CzE76tHVvw9jGcBq6iZGUf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/kkLo3iNH2aC29hqAUqLLsk-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 14 Dec 2025 18:59:48 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></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/kkLo3iNH2aC29hqAUqLLsk-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Amazon gift card]]></media:description>                                                            <media:text><![CDATA[Amazon gift card]]></media:text>
                                <media:title type="plain"><![CDATA[Amazon gift card]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/kkLo3iNH2aC29hqAUqLLsk-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Christmas came early for Amazon Prime members. Amazon <a href="https://www.aboutamazon.com/news/retail/amazon-same-day-fresh-grocery-delivery-united-states" target="_blank">announced this week</a> it's expanding its same-day grocery delivery service to more than 2,300 cities. Initially, same-day grocery delivery was limited to about 1,000 cities, including all the usual hubs like Seattle, Los Angeles, Dallas, Chicago, Miami, and New York City. Now more Prime members than ever can get fresh produce and other kitchen staples delivered to their doorstep. </p><p>“This expanded offering is supported by continued innovation within Amazon’s Same-Day Delivery network designed to deliver more selection, faster—innovation that puts us on track to deliver at our fastest speeds ever for Prime members globally for the third year in a row,” per Amazon's news release. </p><p>Since launching the service in August, the retail giant says its perishable selection has grown by more than 30 percent, including thousands of fresh favorites from Whole Foods Market. Fresh groceries now make up nine of the 10 most-ordered items for same-day delivery in eligible areas, according to the news release. For those wondering, toilet paper was the 10th item, which is not surprising for anyone who remembers the rampant hoarding of early pandemic days. The company's best-selling item for same-day delivery overall has been bananas, with avocados, strawberries, Honeycrisp apples, and limes not far behind. </p><p>Amazon also broke down the most popular perishable groceries ordered with same-day delivery by region, and y'all, we are not beating the stereotypes. Cold brew coffee, chicken thighs, and probiotic drinks are among the most-ordered items in the West, while shoppers in the East most often choose raw shrimp, broccoli florets, and chocolate chip muffins. In the South, Prime members are most often adding Atlantic salmon, chicken pot pie, and lemonade to their carts, while us Midwesterners are apparently ordering tons of wheat bread, smoked bacon, and pepperoni pizza  — not even deep-dish!</p><h2 id="does-my-city-have-amazon-s-same-day-grocery-delivery">Does my city have Amazon's same-day grocery delivery?</h2><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="CXNG3T44EaeDENsr6aVUJY" name="package-at-doorstep-2.jpg" alt="Person placing an Amazon box on a doorstep" src="https://cdn.mos.cms.futurecdn.net/CXNG3T44EaeDENsr6aVUJY.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: Amazon)</span></figcaption></figure><p>If you're wondering if same-day grocery delivery is offered in your city, head on over to the Amazon website at <a href="https://www.amazon.com/fmc/learn-more" target="_blank">amazon.com/fmc/learn-more</a> to find out! Alternatively, you can log into the Amazon website or mobile app, add some grocery items to your cart, and see what delivery options are available at checkout. </p><p>Amazon didn't outline the full list of cities where same-day grocery delivery is now available, but some of the newly added markets it did confirm include:</p><ul><li>Boise, Idaho</li><li>Salt Lake City, Utah</li><li>Fort Collins, Colorado</li><li>Omaha, Nebraska</li><li>Sugar Land, Texas</li><li>Des Moines, Iowa</li><li>Kennesaw, Georgia</li><li>Gaithersburg, Maryland</li></ul><h2 id="how-much-does-amazon-s-same-day-grocery-delivery-cost">How much does Amazon's same-day grocery delivery cost?</h2><p>Amazon Prime members can get same-day delivery for free on orders of more than $25, as outlined in Amazon's news release. For orders that fall under that threshold, you'll have to pay a $2.99 delivery fee. Meanwhile, if you aren't an Amazon Prime member, same-day delivery will set you back $12.99 regardless of the total cost. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/fitness/amazon-is-taking-up-to-71-percent-off-new-balance-running-shoes-and-sneakers-15-deals-id-shop-now">Amazon is taking up to 71% off New Balance running shoes and sneakers — 15 deals I'd shop now</a></li><li><a href="https://www.tomsguide.com/audio/smart-speakers/i-used-the-echo-dot-max-and-echo-studio-to-create-an-alexa-home-theater-heres-how-it-sounds">I used the Echo Dot Max and Echo Studio to create an Alexa Home Theater — here's how it sounds</a></li><li><a href="https://www.tomsguide.com/us/best-e-readers,review-2766.html">The best Kindles in 2025: Our top picks tested and rated</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Design Without Limits ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/design-without-limits</link>
                                                                            <description>
                            <![CDATA[ Architect Dale Whitfield uses Snapdragon to Redefine the Studio ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">r2zsDsBC6hN4b5p2NUD9BF</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/PGCtMsYenqTBQwni83nvif-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 12 Dec 2025 12:00:48 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tom&#039;s Guide ]]></dc:creator>                                                                                                        <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/PGCtMsYenqTBQwni83nvif-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Architect Dale Whitfield talks about his experience with Snapdragon products]]></media:description>                                                            <media:text><![CDATA[Architect Dale Whitfield talks about his experience with Snapdragon products]]></media:text>
                                <media:title type="plain"><![CDATA[Architect Dale Whitfield talks about his experience with Snapdragon products]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/PGCtMsYenqTBQwni83nvif-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div class="ceros-embed-wrapper">        <div style="position: relative;width: auto;padding: 0 0 363.54% ;height: 0;top: 0;left: 0;bottom: 0;right: 0;margin: 0;border: 0 none"        id="experience-69259377d88c4" data-aspectratio="0.27507163" data-mobile-aspectratio="">        <iframe        allowfullscreen        src="https://view.ceros.com/dennis/toms-guide-snapdragon-design-without-limits?heightOverride=6980"        style="position: absolute;top: 0;left: 0;bottom: 0;right: 0;margin: 0;padding: 0;border: 0 none;height: 1px;width: 1px;min-height: 100%;min-width: 100%"        frameborder="0" class="ceros-experience" title="Snapdragon x Tom's Guide | Platinum Advertorial | Nov 25"        scrolling="no"></iframe>    </div>    <script type="text/javascript" src="https://view.ceros.com/scroll-proxy.min.js" data-ceros-origin-domains="view.ceros.com"></script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The best Christmas gift ideas in 2025: a foolproof guide of the best tech, lifestyle and home presents for every person on your nice list  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/the-best-christmas-gift-ideas-in-2025-a-foolproof-guide-of-the-best-tech-lifestyle-and-home-presents-for-every-person-on-your-nice-list</link>
                                                                            <description>
                            <![CDATA[ Looking for some fresh Christmas gift ideas this year? Here are some of our top picks for every budget, from stocking stuffers to 'big' gifts. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">a5aBb6e2W2sKXa9fSLCXHY</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/3jxyzLrvoUZYr3b9V3qQRC-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 05 Dec 2025 00:07:12 +0000</pubDate>                                                                                                                                <updated>Mon, 15 Dec 2025 22:21:18 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ lucy.scotting@futurenet.com (Lucy Scotting) ]]></author>                    <dc:creator><![CDATA[ Lucy Scotting ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/UC9ncAYxkmJ5ipHEyX44ri.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Lucy Scotting is a digital content writer for Tom’s Guide in Australia, covering NBN and internet-related news. Lucy started her career writing for HR and staffing industry publications, with articles covering emerging tech, business and finance.&lt;/p&gt;&lt;p&gt;In her spare time, Lucy can be found watching sci-fi movies, working on her dystopian fiction novel (in progress since 2017) or hanging out with her dog, Fletcher, and her three cats. If she’s not found doing any of the above, she’s likely on her next adventure to a new city, country, or continent. &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/3jxyzLrvoUZYr3b9V3qQRC-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Holiday Gifts]]></media:description>                                                            <media:text><![CDATA[Holiday Gifts]]></media:text>
                                <media:title type="plain"><![CDATA[Holiday Gifts]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/3jxyzLrvoUZYr3b9V3qQRC-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Ho ho ho, it's Christmas time! Well <em>almost. </em>There are only 13 days to go until Santa sets off to deliver gifts, and while the jolly fellow will get you everything you wished for, you may be having some gift-giving troubles of your own.</p><p>Fret not — you can refer to us here at Tom's Guide as "Santa's little helpers", as we've compiled some of the best Christmas gift ideas in 2025. Whether you're shopping for the tech-savvy relos or looking for something extra for the kids, we've got you covered. </p><p>Right now, there's a healthy abundance of deals available, with plenty of the best tech, home appliances, lifestyle gifts and more, at some of our favourite retailers. Plus, these deals come with free or expedited delivery within seven business days, so you'll have plenty of time to get each gift wrapped and under the tree before the big day.</p><p>Spoiling your loved ones this holiday season shouldn't burn a hole in your wallet, so we've categorised the deals below into different price points. Ranging from stocking stuffers under AU$25 to gifts in the higher AU$300 mark, there's something for everyone on your nice list here. </p><p>If these gift ideas don't quite tickle your fancy, you can always use them as a sounding board or prepare your own shopping list for the impending <a href="https://www.tomsguide.com/deals/boxing-day-sales-au">Boxing Day sales</a>. </p><h3 class="article-body__section" id="section-christmas-gift-ideas-2025-retailer-quicklinks"><span>Christmas gift ideas 2025: Retailer quicklinks</span></h3><ul><li><a href="https://www.asos.com/au/"><strong>ASOS</strong></a><strong>: </strong>shop clothing, accessories, shoes</li><li><a href="https://www.amazon.com.au/b/?_encoding=UTF8&ie=UTF8&node=212354899051&pd_rd_w=Dqq4l&content-id=amzn1.sym.9d2a5c1e-cf15-4228-992a-5367ada5975e&pf_rd_p=9d2a5c1e-cf15-4228-992a-5367ada5975e&pf_rd_r=R8BR9NXHMACMET81CSDY&pd_rd_wg=xDyad&pd_rd_r=cf773880-a066-4e97-9f52-d0e5c3b684af&ref_=pd_hp_d_atf_unk"><strong>Amazon</strong></a><strong>: </strong>shop everything from electronics, appliances and more</li><li><a href="https://www.tomsguide.com/au/coupons/breville" target="_blank"><strong>Breville</strong></a><strong>: </strong>score 10% off with our exclusive coupon codes</li><li><a href="https://www.tomsguide.com/coupons/bose-au" target="_blank"><strong>Bose</strong></a><strong>: </strong>knock 10% off Bose's audio gear with our exclusive coupon code</li><li><a href="https://www.disneyplus.com/en-au" target="_blank"><strong>Disney Plus</strong></a><strong>: </strong>save up to AU$63 on a premium annual subscription just in time for Christmas</li><li><a href="https://www.tomsguide.com/au/computing/dell-coupon-codes" target="_blank"><strong>Dell</strong></a><strong>:</strong> shop our coupon page for up to 13% select Dell laptops and computers</li><li><a href="https://www.dyson.com.au/" target="_blank"><strong>Dyson</strong></a><strong>:</strong> shop and save on selected vacuums, hair tools and purifiers</li><li><a href="https://gourmetbasket.com.au/occasion/christmas-gift-hampers/"><strong>Gourmet Basket</strong></a><strong>: </strong>luxury wine and cheese hampers, tea and coffee baskets and more</li><li><a href="https://www.tomsguide.com/au/coupons/hp.com" target="_blank"><strong>HP</strong></a><strong>:</strong> get 5% off all purchases with our exclusive <strong>FUTURE5</strong> code</li><li><a href="https://www.tomsguide.com/coupons/jbl-au" target="_blank"><strong>JBL</strong></a><strong>: </strong>score up to 20% off full-priced items using our coupon codes</li><li><a href="https://kitchenaid.com.au/collections/sale" target="_blank"><strong>KitchenAid</strong></a><strong>: </strong>save up to 30% on select KitchenAid appliances</li><li><a href="https://www.kogan.com/au/c/christmas/" target="_blank"><strong>Kogan:</strong></a> save up to 70% off everything from televisions to furniture</li><li><a href="https://www.lovehoney.com.au/"><strong>Lovehoney</strong></a><strong>: </strong>shop gifts for either her or him with up to 70% off Lovehoney's range</li><li><a href="https://myer.sjv.io/c/338476/1279730/15706?subId1=tomsguide-au-6001315319442564960&sharedId=tomsguide-au&u=https%3A%2F%2Fwww.myer.com.au%2F"><strong>Myer</strong></a><strong>: </strong>shop the best tech, fashion, accessories and appliances gifts</li><li><a href="https://secretlabchairs.com.au/" target="_blank"><strong>Secretlab</strong></a><strong>: </strong>nab a discounted gaming chair or desk</li><li><a href="https://www.thegoodguys.com.au/"><strong>The Good Guys</strong></a><strong>: </strong>coffee machines, vacuum cleaners, wearables and home appliances</li><li><a href="https://www.theiconic.com.au/christmas-gifts/"><strong>The Iconic</strong></a><strong>: </strong>shop clothing, sleepwear, shoes and accessories</li></ul><h3 class="article-body__section" id="section-stocking-stuffers-under-au-25"><span>Stocking Stuffers Under AU$25</span></h3><div class="product"><a data-dimension112="d2721cd3-9145-4618-a094-974820347129" data-action="Deal Block" data-label="With thousands of positively glowing reviews on the listing, this simple Lego set is ideal for flower enthusiasts, with two pastel-hued cuttings of these iconic blooms. Each lotus flower stem measures over 19cm long and comes with different coloured pieces to create your own unique stems." data-dimension48="With thousands of positively glowing reviews on the listing, this simple Lego set is ideal for flower enthusiasts, with two pastel-hued cuttings of these iconic blooms. Each lotus flower stem measures over 19cm long and comes with different coloured pieces to create your own unique stems." data-dimension25="$12" href="https://www.amazon.com.au/LEGO-40647-Lotus-Flowers/dp/B0C7HBX24Y" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:101.47%;"><img id="8WxiRTcprgxtXwDwdgMWBC" name="717iDw6uFlL._AC_SX679_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/8WxiRTcprgxtXwDwdgMWBC.jpg" mos="" align="middle" fullscreen="" width="679" height="689" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With thousands of positively glowing reviews on the listing, this simple Lego set is ideal for flower enthusiasts, with two pastel-hued cuttings of these iconic blooms. Each lotus flower stem measures over 19cm long and comes with different coloured pieces to create your own unique stems. <a class="view-deal button" href="https://www.amazon.com.au/LEGO-40647-Lotus-Flowers/dp/B0C7HBX24Y" target="_blank" rel="nofollow" data-dimension112="d2721cd3-9145-4618-a094-974820347129" data-action="Deal Block" data-label="With thousands of positively glowing reviews on the listing, this simple Lego set is ideal for flower enthusiasts, with two pastel-hued cuttings of these iconic blooms. Each lotus flower stem measures over 19cm long and comes with different coloured pieces to create your own unique stems." data-dimension48="With thousands of positively glowing reviews on the listing, this simple Lego set is ideal for flower enthusiasts, with two pastel-hued cuttings of these iconic blooms. Each lotus flower stem measures over 19cm long and comes with different coloured pieces to create your own unique stems." data-dimension25="$12">View Deal</a></p></div><div class="product"><a data-dimension112="c6f88f2f-5ab6-42b7-93a6-33996330a498" data-action="Deal Block" data-label="two-pack for just AU$31" data-dimension48="two-pack for just AU$31" data-dimension25="$17" href="https://www.amazon.com.au/dp/B0D484S271" 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="DU9Eig3tBs6JZTSyq75GAF" name="blink_mini_2.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/DU9Eig3tBs6JZTSyq75GAF.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Despite receiving an upgrade with the Mini 2K camera in recent months, Blink's impressive first-generation Mini 2 has just gotten even more affordable thanks to Amazon. Now just AU$17 for a single unit, the Blink Mini 2 offers high-resolution live-view footage, a built-in LED spotlight and two-way audio. The camera also detects motion, so your loved ones can put their mind at ease when away from home. You can also grab a <a href="https://www.amazon.com.au/Introducing-Blink-Mini-Plug-built/dp/B0D484Q7MG/ref=ast_sto_dp_puis" data-dimension112="c6f88f2f-5ab6-42b7-93a6-33996330a498" data-action="Deal Block" data-label="two-pack for just AU$31" data-dimension48="two-pack for just AU$31" data-dimension25="$17">two-pack for just AU$31</a>, now discounted by 61% — that’s just AU$15.50 each. <a class="view-deal button" href="https://www.amazon.com.au/dp/B0D484S271" target="_blank" rel="nofollow" data-dimension112="c6f88f2f-5ab6-42b7-93a6-33996330a498" data-action="Deal Block" data-label="two-pack for just AU$31" data-dimension48="two-pack for just AU$31" data-dimension25="$17">View Deal</a></p></div><div class="product"><a data-dimension112="e15bcf38-d171-449b-a550-898a6c2940e6" data-action="Deal Block" data-label="best power banks" data-dimension48="best power banks" data-dimension25="$24.69" href="https://www.amazon.com.au/INIU-Portable-High-Speed-Flashlight-Compatible/dp/B07CZDXDG8/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1300px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="zKv9K5ZZoSryd23yhkVw2A" name="INIU B6 9.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zKv9K5ZZoSryd23yhkVw2A.jpg" mos="" align="middle" fullscreen="" width="1300" height="1300" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If your loved ones are constantly on the go, be it commuting or travelling, there's no better accessory to have than a portable power bank for your devices. Our colleagues over at TechRadar give it top marks in their<a href="https://www.techradar.com/au/news/top-portable-chargers#section-the-best-budget-power-bank" data-dimension112="e15bcf38-d171-449b-a550-898a6c2940e6" data-action="Deal Block" data-label="best power banks" data-dimension48="best power banks" data-dimension25="$24.69"> best power banks</a> guide, as it can fast charge your phone or your laptop with ease, and still have extra juice left over. <a class="view-deal button" href="https://www.amazon.com.au/INIU-Portable-High-Speed-Flashlight-Compatible/dp/B07CZDXDG8/" target="_blank" rel="nofollow" data-dimension112="e15bcf38-d171-449b-a550-898a6c2940e6" data-action="Deal Block" data-label="best power banks" data-dimension48="best power banks" data-dimension25="$24.69">View Deal</a></p></div><div class="product"><a data-dimension112="dbd1af8a-d641-47ff-b3b4-aa32b999b4b0" data-action="Deal Block" data-label="Keep track of your keys, bag, or wallet with Ugreen's FineTrack smart tracker. Now just AU$17.99 on Amazon, the tracker has a built-in buzzer that can play up to 80dB of sound to find your item and can be tracked through the "Find My" App for iOS users." data-dimension48="Keep track of your keys, bag, or wallet with Ugreen's FineTrack smart tracker. Now just AU$17.99 on Amazon, the tracker has a built-in buzzer that can play up to 80dB of sound to find your item and can be tracked through the "Find My" App for iOS users." data-dimension25="$17.99" href="https://www.amazon.com.au/UGREEN-45297-Smart-Bluetooth-Finder/dp/B0D53RXMB1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:522px;"><p class="vanilla-image-block" style="padding-top:96.17%;"><img id="4SjKSNTL3M7uB3eS2F5RM7" name="51fgU1ee8wL._AC_SX522" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4SjKSNTL3M7uB3eS2F5RM7.png" mos="" align="middle" fullscreen="" width="522" height="502" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Keep track of your keys, bag, or wallet with Ugreen's FineTrack smart tracker. Now just AU$17.99 on Amazon, the tracker has a built-in buzzer that can play up to 80dB of sound to find your item and can be tracked through the "Find My" App for iOS users. <a class="view-deal button" href="https://www.amazon.com.au/UGREEN-45297-Smart-Bluetooth-Finder/dp/B0D53RXMB1" target="_blank" rel="nofollow" data-dimension112="dbd1af8a-d641-47ff-b3b4-aa32b999b4b0" data-action="Deal Block" data-label="Keep track of your keys, bag, or wallet with Ugreen's FineTrack smart tracker. Now just AU$17.99 on Amazon, the tracker has a built-in buzzer that can play up to 80dB of sound to find your item and can be tracked through the "Find My" App for iOS users." data-dimension48="Keep track of your keys, bag, or wallet with Ugreen's FineTrack smart tracker. Now just AU$17.99 on Amazon, the tracker has a built-in buzzer that can play up to 80dB of sound to find your item and can be tracked through the "Find My" App for iOS users." data-dimension25="$17.99">View Deal</a></p></div><h3 class="article-body__section" id="section-gifts-under-au-50"><span>Gifts Under AU$50</span></h3><div class="product"><a data-dimension112="1e967422-e745-4253-be73-10df1ae9d55d" data-action="Deal Block" data-label="Knocking up to 51% off, these clogs are extremely versatile, breathable and dry fast when wet, making them perfect for almost every activity. Not to mention that Crocs have come back into style lately, with sizes for kids, women's, and men's to choose from, making these clogs perfect for everyone. Plus, at this price, you can grab a discounted pack of Jibbitz to personalise the pair for your giftee. A range of colours is available under the same listing." data-dimension48="Knocking up to 51% off, these clogs are extremely versatile, breathable and dry fast when wet, making them perfect for almost every activity. Not to mention that Crocs have come back into style lately, with sizes for kids, women's, and men's to choose from, making these clogs perfect for everyone. Plus, at this price, you can grab a discounted pack of Jibbitz to personalise the pair for your giftee. A range of colours is available under the same listing." data-dimension25="$39" href="https://www.amazon.com.au/crocs-Classic-Comfort-Shoes-Black/dp/B0D61FS3KF" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2009px;"><p class="vanilla-image-block" style="padding-top:99.50%;"><img id="kdTTmdo3izyjgYSKcrrpsY" name="1731426555.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kdTTmdo3izyjgYSKcrrpsY.jpg" mos="" align="middle" fullscreen="" width="2009" height="1999" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Knocking up to 51% off, these clogs are extremely versatile, breathable and dry fast when wet, making them perfect for almost every activity. Not to mention that Crocs have come back into style lately, with sizes for kids, women's, and men's to choose from, making these clogs perfect for everyone. Plus, at this price, you can grab a discounted pack of Jibbitz to personalise the pair for your giftee. A range of colours is available under the same listing. <a class="view-deal button" href="https://www.amazon.com.au/crocs-Classic-Comfort-Shoes-Black/dp/B0D61FS3KF" target="_blank" rel="nofollow" data-dimension112="1e967422-e745-4253-be73-10df1ae9d55d" data-action="Deal Block" data-label="Knocking up to 51% off, these clogs are extremely versatile, breathable and dry fast when wet, making them perfect for almost every activity. Not to mention that Crocs have come back into style lately, with sizes for kids, women's, and men's to choose from, making these clogs perfect for everyone. Plus, at this price, you can grab a discounted pack of Jibbitz to personalise the pair for your giftee. A range of colours is available under the same listing." data-dimension48="Knocking up to 51% off, these clogs are extremely versatile, breathable and dry fast when wet, making them perfect for almost every activity. Not to mention that Crocs have come back into style lately, with sizes for kids, women's, and men's to choose from, making these clogs perfect for everyone. Plus, at this price, you can grab a discounted pack of Jibbitz to personalise the pair for your giftee. A range of colours is available under the same listing." data-dimension25="$39">View Deal</a></p></div><div class="product"><a data-dimension112="4ebb106b-4d65-420d-92aa-fcdda2b48af2" data-action="Deal Block" data-label="The festive season is here, and these Harry Potter Lego Advent Calendars typically sell out like hot cakes. If you've got a young wizard in your life, zoom your broom and nab one of these 24-day sets right now." data-dimension48="The festive season is here, and these Harry Potter Lego Advent Calendars typically sell out like hot cakes. If you've got a young wizard in your life, zoom your broom and nab one of these 24-day sets right now." data-dimension25="$47.99" href="https://www.myer.com.au/p/lego-harry-potter-advent-calendar-2025-76456" 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="LEvzEf7Bw9TrWyrGCXWZpm" name="harry-advent-lego" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/LEvzEf7Bw9TrWyrGCXWZpm.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The festive season is here, and these Harry Potter Lego Advent Calendars typically sell out like hot cakes. If you've got a young wizard in your life, zoom your broom and nab one of these 24-day sets right now.<a class="view-deal button" href="https://www.myer.com.au/p/lego-harry-potter-advent-calendar-2025-76456" target="_blank" rel="nofollow" data-dimension112="4ebb106b-4d65-420d-92aa-fcdda2b48af2" data-action="Deal Block" data-label="The festive season is here, and these Harry Potter Lego Advent Calendars typically sell out like hot cakes. If you've got a young wizard in your life, zoom your broom and nab one of these 24-day sets right now." data-dimension48="The festive season is here, and these Harry Potter Lego Advent Calendars typically sell out like hot cakes. If you've got a young wizard in your life, zoom your broom and nab one of these 24-day sets right now." data-dimension25="$47.99">View Deal</a></p></div><div class="product"><a data-dimension112="694a6c45-c208-4c56-beec-4a9ab78089d9" data-action="Deal Block" data-label="Another great home security gift is Blink's Video Doorbell System, which includes a Sync Module Core for secure footage saving. Blink's doorbell has a two-year battery life, meaning you won't have to worry about hardwiring if your loved ones are renting. It also has a 150° head-to-toe view, can automatically send parcel and person alerts, and help keep their worries at bay with continuous live view." data-dimension48="Another great home security gift is Blink's Video Doorbell System, which includes a Sync Module Core for secure footage saving. Blink's doorbell has a two-year battery life, meaning you won't have to worry about hardwiring if your loved ones are renting. It also has a 150° head-to-toe view, can automatically send parcel and person alerts, and help keep their worries at bay with continuous live view." data-dimension25="$49" href="https://www.amazon.com.au/Blink-Video-Doorbell/dp/B0DJDSZJX6" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1612px;"><p class="vanilla-image-block" style="padding-top:86.60%;"><img id="tcqqYFb3J3AWqsS4RccVfQ" name="Blink Video Doorbell" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tcqqYFb3J3AWqsS4RccVfQ.png" mos="" align="middle" fullscreen="" width="1612" height="1396" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Another great home security gift is Blink's Video Doorbell System, which includes a Sync Module Core for secure footage saving. Blink's doorbell has a two-year battery life, meaning you won't have to worry about hardwiring if your loved ones are renting. It also has a 150° head-to-toe view, can automatically send parcel and person alerts, and help keep their worries at bay with continuous live view. <a class="view-deal button" href="https://www.amazon.com.au/Blink-Video-Doorbell/dp/B0DJDSZJX6" target="_blank" rel="nofollow" data-dimension112="694a6c45-c208-4c56-beec-4a9ab78089d9" data-action="Deal Block" data-label="Another great home security gift is Blink's Video Doorbell System, which includes a Sync Module Core for secure footage saving. Blink's doorbell has a two-year battery life, meaning you won't have to worry about hardwiring if your loved ones are renting. It also has a 150° head-to-toe view, can automatically send parcel and person alerts, and help keep their worries at bay with continuous live view." data-dimension48="Another great home security gift is Blink's Video Doorbell System, which includes a Sync Module Core for secure footage saving. Blink's doorbell has a two-year battery life, meaning you won't have to worry about hardwiring if your loved ones are renting. It also has a 150° head-to-toe view, can automatically send parcel and person alerts, and help keep their worries at bay with continuous live view." data-dimension25="$49">View Deal</a></p></div><div class="product"><a data-dimension112="1f6f01eb-1241-49d2-b2dc-6010bbf9b3f1" data-action="Deal Block" data-label="A great travel gift is the Twelve South AirFly SE, a handy little transmitter that connects your Bluetooth headphones to your in-flight entertainment screen. This transmitter was an absolute winner in my books, as I was able to use my Apple AirPods Max throughout the entire 10-hour flight to Tokyo with no hassles (or annoying wires!)." data-dimension48="A great travel gift is the Twelve South AirFly SE, a handy little transmitter that connects your Bluetooth headphones to your in-flight entertainment screen. This transmitter was an absolute winner in my books, as I was able to use my Apple AirPods Max throughout the entire 10-hour flight to Tokyo with no hassles (or annoying wires!)." data-dimension25="$51.90" href="https://www.amazon.com.au/Twelve-South-Bluetooth-Transmitter-Headphones/dp/B0BQZBMXD4?th=1" 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="yd8hRcH27iPRCPZXaYm4mX" name="airfly-se.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yd8hRcH27iPRCPZXaYm4mX.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>A great travel gift is the Twelve South AirFly SE, a handy little transmitter that connects your Bluetooth headphones to your in-flight entertainment screen. This transmitter was an absolute winner in my books, as I was able to use my Apple AirPods Max throughout the entire 10-hour flight to Tokyo with no hassles (or annoying wires!).<a class="view-deal button" href="https://www.amazon.com.au/Twelve-South-Bluetooth-Transmitter-Headphones/dp/B0BQZBMXD4?th=1" target="_blank" rel="nofollow" data-dimension112="1f6f01eb-1241-49d2-b2dc-6010bbf9b3f1" data-action="Deal Block" data-label="A great travel gift is the Twelve South AirFly SE, a handy little transmitter that connects your Bluetooth headphones to your in-flight entertainment screen. This transmitter was an absolute winner in my books, as I was able to use my Apple AirPods Max throughout the entire 10-hour flight to Tokyo with no hassles (or annoying wires!)." data-dimension48="A great travel gift is the Twelve South AirFly SE, a handy little transmitter that connects your Bluetooth headphones to your in-flight entertainment screen. This transmitter was an absolute winner in my books, as I was able to use my Apple AirPods Max throughout the entire 10-hour flight to Tokyo with no hassles (or annoying wires!)." data-dimension25="$51.90">View Deal</a></p></div><div class="product"><a data-dimension112="7636b5d6-4c9e-4285-af74-afe3961cfc48" data-action="Deal Block" data-label="Sometimes the best gift is one you don't think about receiving — and that sentiment rings true for this electric toothbrush. Oral-B's Pro 800 CrossAction may not offer more than one cleaning mode, however, this electric toothbrush surpasses manual brushing with its rotating and pulsating head for superior plaque removal. It also includes a travel case and a replacement brush head." data-dimension48="Sometimes the best gift is one you don't think about receiving — and that sentiment rings true for this electric toothbrush. Oral-B's Pro 800 CrossAction may not offer more than one cleaning mode, however, this electric toothbrush surpasses manual brushing with its rotating and pulsating head for superior plaque removal. It also includes a travel case and a replacement brush head." data-dimension25="$49" href="https://www.amazon.com.au/Oral-B-Electric-Toothbrush-Travel-Case/dp/B0FCLWDBJK" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:930px;"><p class="vanilla-image-block" style="padding-top:122.47%;"><img id="b2yVaqmiL7YziXqEv6RAh7" name="oral-b pro 700" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/b2yVaqmiL7YziXqEv6RAh7.jpg" mos="" align="middle" fullscreen="" width="930" height="1139" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Sometimes the best gift is one you don't think about receiving — and that sentiment rings true for this electric toothbrush. Oral-B's Pro 800 CrossAction may not offer more than one cleaning mode, however, this electric toothbrush surpasses manual brushing with its rotating and pulsating head for superior plaque removal. It also includes a travel case and a replacement brush head. <a class="view-deal button" href="https://www.amazon.com.au/Oral-B-Electric-Toothbrush-Travel-Case/dp/B0FCLWDBJK" target="_blank" rel="nofollow" data-dimension112="7636b5d6-4c9e-4285-af74-afe3961cfc48" data-action="Deal Block" data-label="Sometimes the best gift is one you don't think about receiving — and that sentiment rings true for this electric toothbrush. Oral-B's Pro 800 CrossAction may not offer more than one cleaning mode, however, this electric toothbrush surpasses manual brushing with its rotating and pulsating head for superior plaque removal. It also includes a travel case and a replacement brush head." data-dimension48="Sometimes the best gift is one you don't think about receiving — and that sentiment rings true for this electric toothbrush. Oral-B's Pro 800 CrossAction may not offer more than one cleaning mode, however, this electric toothbrush surpasses manual brushing with its rotating and pulsating head for superior plaque removal. It also includes a travel case and a replacement brush head." data-dimension25="$49">View Deal</a></p></div><h3 class="article-body__section" id="section-gifts-under-au-100"><span>Gifts Under AU$100</span></h3><div class="product"><a data-dimension112="468f3784-754d-4bd1-a360-6eada20cdb2c" data-action="Deal Block" data-label="Looking for a great gift for the gym junkie in your life? This portable blender is perfect for on-the-go protein shakes, juices, smoothies, party drinks and more. It's compact, cordless and can power through 15 blending cycles on a single charge. Available in fun colourways, including navy, white and magenta pink." data-dimension48="Looking for a great gift for the gym junkie in your life? This portable blender is perfect for on-the-go protein shakes, juices, smoothies, party drinks and more. It's compact, cordless and can power through 15 blending cycles on a single charge. Available in fun colourways, including navy, white and magenta pink." data-dimension25="$59" href="https://www.myer.com.au/p/nutribullet-portable-blender-nb07400w" 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="yfXsPRnVK3q6yLmVbLiR5B" name="nutribullet-portable-navy.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yfXsPRnVK3q6yLmVbLiR5B.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Looking for a great gift for the gym junkie in your life? This portable blender is perfect for on-the-go protein shakes, juices, smoothies, party drinks and more. It's compact, cordless and can power through 15 blending cycles on a single charge. </p><p>Available in fun colourways, including navy, white and magenta pink. <a class="view-deal button" href="https://www.myer.com.au/p/nutribullet-portable-blender-nb07400w" target="_blank" rel="nofollow" data-dimension112="468f3784-754d-4bd1-a360-6eada20cdb2c" data-action="Deal Block" data-label="Looking for a great gift for the gym junkie in your life? This portable blender is perfect for on-the-go protein shakes, juices, smoothies, party drinks and more. It's compact, cordless and can power through 15 blending cycles on a single charge. Available in fun colourways, including navy, white and magenta pink." data-dimension48="Looking for a great gift for the gym junkie in your life? This portable blender is perfect for on-the-go protein shakes, juices, smoothies, party drinks and more. It's compact, cordless and can power through 15 blending cycles on a single charge. Available in fun colourways, including navy, white and magenta pink." data-dimension25="$59">View Deal</a></p></div><div class="product"><a data-dimension112="a2cd7788-0414-4253-8bcc-f5e48d0eadef" data-action="Deal Block" data-label="As the first in the series made specifically for the Nintendo Switch 2, Pokémon Legends: Z-A promises sharper visuals and smoother gameplay than the notoriously rough Scarlet &amp; Violet. However, this time the classic turn-based combat has been swapped for a real-time system, sure to thrill some fans and frustrate others." data-dimension48="As the first in the series made specifically for the Nintendo Switch 2, Pokémon Legends: Z-A promises sharper visuals and smoother gameplay than the notoriously rough Scarlet &amp; Violet. However, this time the classic turn-based combat has been swapped for a real-time system, sure to thrill some fans and frustrate others." data-dimension25="$84" href="https://www.amazon.com.au/dp/B0FB8RB84F" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:929px;"><p class="vanilla-image-block" style="padding-top:161.46%;"><img id="9iTK8hVLWyUFuDp8bJDtQU" name="Pokémon Legends: Z-A" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9iTK8hVLWyUFuDp8bJDtQU.jpg" mos="" align="middle" fullscreen="" width="929" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>As the first in the series made specifically for the Nintendo Switch 2, Pokémon Legends: Z-A promises sharper visuals and smoother gameplay than the notoriously rough Scarlet & Violet. However, this time the classic turn-based combat has been swapped for a real-time system, sure to thrill some fans and frustrate others.<a class="view-deal button" href="https://www.amazon.com.au/dp/B0FB8RB84F" target="_blank" rel="nofollow" data-dimension112="a2cd7788-0414-4253-8bcc-f5e48d0eadef" data-action="Deal Block" data-label="As the first in the series made specifically for the Nintendo Switch 2, Pokémon Legends: Z-A promises sharper visuals and smoother gameplay than the notoriously rough Scarlet &amp; Violet. However, this time the classic turn-based combat has been swapped for a real-time system, sure to thrill some fans and frustrate others." data-dimension48="As the first in the series made specifically for the Nintendo Switch 2, Pokémon Legends: Z-A promises sharper visuals and smoother gameplay than the notoriously rough Scarlet &amp; Violet. However, this time the classic turn-based combat has been swapped for a real-time system, sure to thrill some fans and frustrate others." data-dimension25="$84">View Deal</a></p></div><div class="product"><a data-dimension112="1122faed-d6da-4925-89d1-ca4cd2de9585" data-action="Deal Block" data-label="I'm not going to lie here — I got one of these Kogan ice makers as a Christmas gift in December 2023, and it's truly become something I cannot live without. Perfect for summer (or in my case, all-year-round iced coffees), this machine can produce up to 12 kg of frozen bullet ice within 24 hours. You can choose between small and large sizes, and it comes with a scoop for easy serving into your preferred beverage." data-dimension48="I'm not going to lie here — I got one of these Kogan ice makers as a Christmas gift in December 2023, and it's truly become something I cannot live without. Perfect for summer (or in my case, all-year-round iced coffees), this machine can produce up to 12 kg of frozen bullet ice within 24 hours. You can choose between small and large sizes, and it comes with a scoop for easy serving into your preferred beverage." data-dimension25="$79.99" href="https://www.kogan.com/au/buy/kogan-12kg-portable-ice-cube-maker-with-self-cleaning-black-kogan/" 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="t69YKygaLmdEdKv85i66uK" name="kogan-ice-maker" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/t69YKygaLmdEdKv85i66uK.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>I'm not going to lie here — I got one of these Kogan ice makers as a Christmas gift in December 2023, and it's truly become something I cannot live without. Perfect for summer (or in my case, all-year-round iced coffees), this machine can produce up to 12 kg of frozen bullet ice within 24 hours. You can choose between small and large sizes, and it comes with a scoop for easy serving into your preferred beverage. <a class="view-deal button" href="https://www.kogan.com/au/buy/kogan-12kg-portable-ice-cube-maker-with-self-cleaning-black-kogan/" target="_blank" rel="nofollow" data-dimension112="1122faed-d6da-4925-89d1-ca4cd2de9585" data-action="Deal Block" data-label="I'm not going to lie here — I got one of these Kogan ice makers as a Christmas gift in December 2023, and it's truly become something I cannot live without. Perfect for summer (or in my case, all-year-round iced coffees), this machine can produce up to 12 kg of frozen bullet ice within 24 hours. You can choose between small and large sizes, and it comes with a scoop for easy serving into your preferred beverage." data-dimension48="I'm not going to lie here — I got one of these Kogan ice makers as a Christmas gift in December 2023, and it's truly become something I cannot live without. Perfect for summer (or in my case, all-year-round iced coffees), this machine can produce up to 12 kg of frozen bullet ice within 24 hours. You can choose between small and large sizes, and it comes with a scoop for easy serving into your preferred beverage." data-dimension25="$79.99">View Deal</a></p></div><div class="product"><a data-dimension112="779f8890-defb-4b7d-9b08-2391863474d7" data-action="Deal Block" data-label="the Twilight The Cullen House Lego set" data-dimension48="the Twilight The Cullen House Lego set" data-dimension25="$79.20" href="https://www.amazon.com.au/21357-Collectible-Brick-Built-Buildable-Memorabilia/dp/B0DWF6XWX3" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:100.15%;"><img id="j3cX4TbWoRVJJNPAopgF5f" name="luxo-jr-lego" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/j3cX4TbWoRVJJNPAopgF5f.png" mos="" align="middle" fullscreen="" width="679" height="680" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Arguably, my most sought-after gift this year would be this Pixar Luxo Jr Lego build (though my second choice is <a href="https://www.amazon.com.au/LEGO-21354-Ideas/dp/B0DHZ6GTRV/" target="_blank" data-dimension112="779f8890-defb-4b7d-9b08-2391863474d7" data-action="Deal Block" data-label="the Twilight The Cullen House Lego set" data-dimension48="the Twilight The Cullen House Lego set" data-dimension25="$79.20">the Twilight The Cullen House Lego set</a>, of course). This fun lamp brings home the nostalgia of all the studio's movies with a posable head, extendable arm, and the beloved Pixar ball. <a class="view-deal button" href="https://www.amazon.com.au/21357-Collectible-Brick-Built-Buildable-Memorabilia/dp/B0DWF6XWX3" target="_blank" rel="nofollow" data-dimension112="779f8890-defb-4b7d-9b08-2391863474d7" data-action="Deal Block" data-label="the Twilight The Cullen House Lego set" data-dimension48="the Twilight The Cullen House Lego set" data-dimension25="$79.20">View Deal</a></p></div><h3 class="article-body__section" id="section-gifts-under-au-300"><span>Gifts Under AU$300</span></h3><div class="product"><a data-dimension112="fd377274-a828-4537-b4e4-405e18260c0d" data-action="Deal Block" data-label="Coconut for AU$98" data-dimension48="Coconut for AU$98" data-dimension25="$198" href="https://www.thegoodguys.com.au/nespresso-vertuo-pop-pistachio-value-bundle-pack-bnv150ptc4ian2" 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="ooGYGjuTDD64Un9o27Q5YM" name="Nespresso Vertuo Pop Bundle Pack" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ooGYGjuTDD64Un9o27Q5YM.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Got a home barista who loves creamy lattes and cappuccinos on your list? This bundle offers the same one-touch coffee convenience as the standalone Nespresso Vertuo Pop, only with an included Nespresso milk frother and iced travel tumbler. This deal applies to both the stunning Pistachio and Lemon colour variants.</p><p>If your budget doesn't stretch to the full AU$198, you can nab a similar model without the frother in <a href="https://www.thegoodguys.com.au/nespresso-vertuo-pop-white-bnv120wht4jan1" target="_blank" data-dimension112="fd377274-a828-4537-b4e4-405e18260c0d" data-action="Deal Block" data-label="Coconut for AU$98" data-dimension48="Coconut for AU$98" data-dimension25="$198">Coconut for AU$98</a>. <a class="view-deal button" href="https://www.thegoodguys.com.au/nespresso-vertuo-pop-pistachio-value-bundle-pack-bnv150ptc4ian2" target="_blank" rel="nofollow" data-dimension112="fd377274-a828-4537-b4e4-405e18260c0d" data-action="Deal Block" data-label="Coconut for AU$98" data-dimension48="Coconut for AU$98" data-dimension25="$198">View Deal</a></p></div><div class="product"><a data-dimension112="2556ac7b-8e67-42ee-8c77-995fd7556c62" data-action="Deal Block" data-label="If you're giving your kids a new TV or shopping for your parents this Christmas, this screen from Kogan could be the one. At an impressive 62% discount, this 32-inch smart TV will do the job well according to user reviews, and it costs less than AU$250. You can stream using your favourite apps, and even use it hands-free thanks to the built-in Google Assistant voice controls." data-dimension48="If you're giving your kids a new TV or shopping for your parents this Christmas, this screen from Kogan could be the one. At an impressive 62% discount, this 32-inch smart TV will do the job well according to user reviews, and it costs less than AU$250. You can stream using your favourite apps, and even use it hands-free thanks to the built-in Google Assistant voice controls." data-dimension25="$229" href="https://www.kogan.com/au/buy/kogan-32-qled-full-hd-smart-ai-google-tv-fq9t-kogan/" 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="7FwMxZuNbij8RvrBCzJGKL" name="kogan-32-tv" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7FwMxZuNbij8RvrBCzJGKL.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you're giving your kids a new TV or shopping for your parents this Christmas, this screen from Kogan could be the one. At an impressive 62% discount, this 32-inch smart TV will do the job well according to user reviews, and it costs less than AU$250. You can stream using your favourite apps, and even use it hands-free thanks to the built-in Google Assistant voice controls. <a class="view-deal button" href="https://www.kogan.com/au/buy/kogan-32-qled-full-hd-smart-ai-google-tv-fq9t-kogan/" target="_blank" rel="nofollow" data-dimension112="2556ac7b-8e67-42ee-8c77-995fd7556c62" data-action="Deal Block" data-label="If you're giving your kids a new TV or shopping for your parents this Christmas, this screen from Kogan could be the one. At an impressive 62% discount, this 32-inch smart TV will do the job well according to user reviews, and it costs less than AU$250. You can stream using your favourite apps, and even use it hands-free thanks to the built-in Google Assistant voice controls." data-dimension48="If you're giving your kids a new TV or shopping for your parents this Christmas, this screen from Kogan could be the one. At an impressive 62% discount, this 32-inch smart TV will do the job well according to user reviews, and it costs less than AU$250. You can stream using your favourite apps, and even use it hands-free thanks to the built-in Google Assistant voice controls." data-dimension25="$229">View Deal</a></p></div><div class="product"><a data-dimension112="32f40d1d-e1fa-4f22-bd67-cdc9cb78a2a0" data-action="Deal Block" data-label="Finally, a Lego set that represents the feline friend on your shopping list, this adorable creature is the purrfect companion to any home decor. Available with yellow and blue eyes in the box, this Lego cat is designed with a posable head, tail and paws." data-dimension48="Finally, a Lego set that represents the feline friend on your shopping list, this adorable creature is the purrfect companion to any home decor. Available with yellow and blue eyes in the box, this Lego cat is designed with a posable head, tail and paws." data-dimension25="$135.20" href="https://www.amazon.com.au/21349-Animal-Lovers-Collectible-Creative-Activity/dp/B0CY9Y18HB" 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="eFSckEKf6f72J9xdBSzw3E" name="lego tuxedo cat" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/eFSckEKf6f72J9xdBSzw3E.jpg" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Finally, a Lego set that represents the feline friend on your shopping list, this adorable creature is the purrfect companion to any home decor. Available with yellow and blue eyes in the box, this Lego cat is designed with a posable head, tail and paws.<a class="view-deal button" href="https://www.amazon.com.au/21349-Animal-Lovers-Collectible-Creative-Activity/dp/B0CY9Y18HB" target="_blank" rel="nofollow" data-dimension112="32f40d1d-e1fa-4f22-bd67-cdc9cb78a2a0" data-action="Deal Block" data-label="Finally, a Lego set that represents the feline friend on your shopping list, this adorable creature is the purrfect companion to any home decor. Available with yellow and blue eyes in the box, this Lego cat is designed with a posable head, tail and paws." data-dimension48="Finally, a Lego set that represents the feline friend on your shopping list, this adorable creature is the purrfect companion to any home decor. Available with yellow and blue eyes in the box, this Lego cat is designed with a posable head, tail and paws." data-dimension25="$135.20">View Deal</a></p></div><div class="product"><a data-dimension112="459412fa-dffd-40c1-90db-23afe6a3127c" data-action="Deal Block" data-label="ivory" data-dimension48="ivory" data-dimension25="$122.50" href="https://www.myer.com.au/p/kadi-the-weekender-in-charcoal" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:978px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="7xDVTTXmo3psdMRK8Cj7L5" name="kadi-the-weekender-bag.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7xDVTTXmo3psdMRK8Cj7L5.jpg" mos="" align="middle" fullscreen="" width="978" height="978" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Got that one friend or sibling who's already planned their next holiday? Featuring a waterproof base compartment, laptop pocket, internal key clip, detachable shoulder strap, and a separate shoe compartment, this stylish yet durable bag is perfect for any weekend away or short trips. It's also the perfect size for carry-on luggage, with room to keep any travel necessities close by during long-haul trips.</p><p>This versatile bag is available in four colourways —<a href="https://www.myer.com.au/p/kadi-the-weekender-in-ivory" data-dimension112="459412fa-dffd-40c1-90db-23afe6a3127c" data-action="Deal Block" data-label="ivory" data-dimension48="ivory" data-dimension25="$122.50"> ivory</a>,<a href="https://www.myer.com.au/p/kadi-the-weekender-in-olive"> olive</a>,<a href="https://www.myer.com.au/p/kadi-the-weekender-in-pebble"> pebble</a> and charcoal — and also comes in a larger<a href="https://www.myer.com.au/p/kadi-the-long-weekender-in-charcoal"> Long Weekender</a> size.<a class="view-deal button" href="https://www.myer.com.au/p/kadi-the-weekender-in-charcoal" target="_blank" rel="nofollow" data-dimension112="459412fa-dffd-40c1-90db-23afe6a3127c" data-action="Deal Block" data-label="ivory" data-dimension48="ivory" data-dimension25="$122.50">View Deal</a></p></div><div class="product"><a data-dimension112="6b47b87e-65d1-48ae-b146-2098df2a3087" data-action="Deal Block" data-label="best under desk treadmills" data-dimension48="best under desk treadmills" data-dimension25="$199" href="https://www.amazon.com.au/Sperax-Vibration-Treadmill-Portable-Treadmills/dp/B0DS5D1WV1" 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="b69SMLw2Tx5Thp8ADqtFJQ" name="sperax-3-in-1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/b69SMLw2Tx5Thp8ADqtFJQ.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you or your partner works from home, this walking pad could be a great addition to their gifts. While we haven't reviewed this particular walking pad in our <a href="https://www.tomsguide.com/best-picks/best-under-desk-treadmills" data-dimension112="6b47b87e-65d1-48ae-b146-2098df2a3087" data-action="Deal Block" data-label="best under desk treadmills" data-dimension48="best under desk treadmills" data-dimension25="$199">best under desk treadmills</a> lineup, it does meet the criteria to be included in the running. The Sperax RM-A-01 walking pad houses three modes — walking, jogging and vibration — so you can meet your fitness goals while working from home. It's light, compact and easily folded away, so you won't have to worry about the machine taking up too much floor space when not in use. <a class="view-deal button" href="https://www.amazon.com.au/Sperax-Vibration-Treadmill-Portable-Treadmills/dp/B0DS5D1WV1" target="_blank" rel="nofollow" data-dimension112="6b47b87e-65d1-48ae-b146-2098df2a3087" data-action="Deal Block" data-label="best under desk treadmills" data-dimension48="best under desk treadmills" data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="0b659f62-32c9-4c46-b49f-dd8add7f5574" data-action="Deal Block" data-label="white 9.5L variant for AU$299.99" data-dimension48="white 9.5L variant for AU$299.99" data-dimension25="$199.99" href="https://ninjakitchen.com.au/collections/sale/products/ninja-doublestack-xxl-7-6l-2-drawer-air-fryer" 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="H7TVEoDX26dUtCAnyg62Hn" name="ninja-doublestack-air-fryer" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/H7TVEoDX26dUtCAnyg62Hn.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Honestly, there's someone in your life who doesn't have an air fryer, so it might be the best time to gift them this Ninja model, now 50% off. This model houses two independently controlled drawers that can cook up to four different foods at once, all while taking up less counter space than a typical extra-large air fryer. With a massive 7.6L capacity, you can even control the timings so that your whole meal — sides and all — are done at the exact same time. </p><p>Also available in the <a href="https://ninjakitchen.com.au/collections/sale/products/ninja-doublestack-xxxl-9-5l-2-drawer-air-fryer" target="_blank" data-dimension112="0b659f62-32c9-4c46-b49f-dd8add7f5574" data-action="Deal Block" data-label="white 9.5L variant for AU$299.99" data-dimension48="white 9.5L variant for AU$299.99" data-dimension25="$199.99">white 9.5L variant for AU$299.99</a>, down from AU$499.99.<a class="view-deal button" href="https://ninjakitchen.com.au/collections/sale/products/ninja-doublestack-xxl-7-6l-2-drawer-air-fryer" target="_blank" rel="nofollow" data-dimension112="0b659f62-32c9-4c46-b49f-dd8add7f5574" data-action="Deal Block" data-label="white 9.5L variant for AU$299.99" data-dimension48="white 9.5L variant for AU$299.99" data-dimension25="$199.99">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Pocket rocket! This tiny 10,000mAh power bank fits in any pocket and is 32% off right now for Black Friday  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/pocket-rocket-this-tiny-10-000mah-power-bank-fits-in-any-pocket-and-is-32-percent-off-right-now-for-black-friday</link>
                                                                            <description>
                            <![CDATA[ The Iniu Mini Power Bank crams a 10,000mAh battery into a tiny package, keeping you charged on the go. And right now it's 32% off for Black Friday. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LL4vYBmoLsU3aehbqBeMdA</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/9QjwgzaWrVNZiWzYbw6qp-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 26 Nov 2025 13:12:28 +0000</pubDate>                                                                                                                                <updated>Wed, 26 Nov 2025 13:28:39 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&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/9QjwgzaWrVNZiWzYbw6qp-1280-80.jpg">
                                                            <media:credit><![CDATA[Iniu / Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Iniu Pocket Rocket portable charger in hand, against a pink background, with a Tom&#039;s Guide deal badge on the left of the image.]]></media:description>                                                            <media:text><![CDATA[The Iniu Pocket Rocket portable charger in hand, against a pink background, with a Tom&#039;s Guide deal badge on the left of the image.]]></media:text>
                                <media:title type="plain"><![CDATA[The Iniu Pocket Rocket portable charger in hand, against a pink background, with a Tom&#039;s Guide deal badge on the left of the image.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/9QjwgzaWrVNZiWzYbw6qp-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/live/news/black-friday-amazon-deals-2025-top-discounts">Black Friday deals</a> are here, meaning you can save big on great tech. This deal right here has to be one of my favorites so far. Right now, the tiny (but mighty) <a href="https://www.amazon.com/INIU-Portable-10000mAh-Essentials-Powerbank/dp/B0DQD35SQ4" target="_blank" rel="nofollow">Iniu Mini Power Bank is 32% off at Amazon for Black Friday</a>. At $26, this is the cheapest it's ever been.</p><p>This mini pocket rocket takes one of the top spots on our <a href="https://www.tomsguide.com/best-picks/best-portable-chargers">best power banks</a> guide, and for good reason. I've been using this little charger for a few months now, and I absolutely love it. So it's well worth snapping up this deal.</p><div class="product"><a data-dimension112="d6573453-cd35-4804-8670-d0a7345123dd" data-action="Deal Block" data-label="10,000mAh capacity, 45W PD charging, a USB-C cable that doubles as a wrist strap, and all in a super-compact shell that fits into virtually any pocket. What more do youi want? "32% off for Black Friday" I hear you say? Well, you're in luck." data-dimension48="10,000mAh capacity, 45W PD charging, a USB-C cable that doubles as a wrist strap, and all in a super-compact shell that fits into virtually any pocket. What more do youi want? "32% off for Black Friday" I hear you say? Well, you're in luck." data-dimension25="$26" href="https://www.amazon.com/INIU-Portable-10000mAh-Essentials-Powerbank/dp/B0DQD35SQ4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1245px;"><p class="vanilla-image-block" style="padding-top:120.48%;"><img id="4t4fPy7ZKkbYpNPW7zi3yL" name="Iniu Mini Portable Power Bank" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4t4fPy7ZKkbYpNPW7zi3yL.jpg" mos="" align="middle" fullscreen="" width="1245" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>10,000mAh capacity, 45W PD charging, a USB-C cable that doubles as a wrist strap, and all in a super-compact shell that fits into virtually any pocket. What more do youi want? "32% off for Black Friday" I hear you say? Well, you're in luck.<a class="view-deal button" href="https://www.amazon.com/INIU-Portable-10000mAh-Essentials-Powerbank/dp/B0DQD35SQ4" target="_blank" rel="nofollow" data-dimension112="d6573453-cd35-4804-8670-d0a7345123dd" data-action="Deal Block" data-label="10,000mAh capacity, 45W PD charging, a USB-C cable that doubles as a wrist strap, and all in a super-compact shell that fits into virtually any pocket. What more do youi want? "32% off for Black Friday" I hear you say? Well, you're in luck." data-dimension48="10,000mAh capacity, 45W PD charging, a USB-C cable that doubles as a wrist strap, and all in a super-compact shell that fits into virtually any pocket. What more do youi want? "32% off for Black Friday" I hear you say? Well, you're in luck." data-dimension25="$26">View Deal</a></p></div><div class="product"><a data-dimension112="e1a7699d-2b03-4491-8d96-0e2b91a5a0d4" data-action="Deal Block" data-label="My fellow Brits aren't left out on the action either! The Iniu Mini Portable Charger is also on sale in the U.K. for Black Friday. A real bobby dazzler of a deal." data-dimension48="My fellow Brits aren't left out on the action either! The Iniu Mini Portable Charger is also on sale in the U.K. for Black Friday. A real bobby dazzler of a deal." data-dimension25="£28.49" href="https://www.amazon.co.uk/INIU-Charging-10000mAh-Battery-Portable/dp/B0DQD385HN" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1245px;"><p class="vanilla-image-block" style="padding-top:120.48%;"><img id="4t4fPy7ZKkbYpNPW7zi3yL" name="Iniu Mini Portable Power Bank" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4t4fPy7ZKkbYpNPW7zi3yL.jpg" mos="" align="middle" fullscreen="" width="1245" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>My fellow Brits aren't left out on the action either! The Iniu Mini Portable Charger is also on sale in the U.K. for Black Friday. A real bobby dazzler of a deal.<a class="view-deal button" href="https://www.amazon.co.uk/INIU-Charging-10000mAh-Battery-Portable/dp/B0DQD385HN" target="_blank" rel="nofollow" data-dimension112="e1a7699d-2b03-4491-8d96-0e2b91a5a0d4" data-action="Deal Block" data-label="My fellow Brits aren't left out on the action either! The Iniu Mini Portable Charger is also on sale in the U.K. for Black Friday. A real bobby dazzler of a deal." data-dimension48="My fellow Brits aren't left out on the action either! The Iniu Mini Portable Charger is also on sale in the U.K. for Black Friday. A real bobby dazzler of a deal." data-dimension25="£28.49">View Deal</a></p></div><h2 id="tiny-but-mighty">Tiny but mighty</h2><p>As I mentioned above, I love this little power bank. I got hold of mine a couple of months back and, initially, I just left it on my desk. I didn't <em><strong>need</strong></em> a 10,000mAh power bank, as I already had a 20,000mAh one in my bag that can charge laptops, tablets and phones.</p><p>My big power bank is just that, though: big! A few weeks after getting the Iniu, I was set to go on a motorcycle trip where space is at a premium. I needed a power bank that would fit seamlessly into one my of bike jacket's very small pockets. And suddenly, the Iniu came into its own! It fit perfectly.</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:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6h5fsTWWJnGWcR6LZWR6dm" name="Iniu mini power bank 1" alt="A sage green Iniu Mini Power Bank in hand." src="https://cdn.mos.cms.futurecdn.net/6h5fsTWWJnGWcR6LZWR6dm.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>On the trip, the Iniu was so tiny that I could fit it into another pocket alongside my <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/gopro-max2-review">GoPro MAX2</a> to charge while I was riding. Now that winter has hit, I've purchased a heated vest to go under my riding jacket, which can be powered via USB-C. No need to guess what I'll be using to do that!</p><p>I also use the Iniu regularly for charging my <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-pro-review">iPhone 17 Pro</a>, which it does pretty quickly thanks to 45W PD charging. 10 minutes gets me about 20%, so on an average motorcycle pit stop I can easily put back 50-60% battery.</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:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="52wtTuTwimvy3kCntsVCjm" name="Iniu mini power bank 2" alt="A sage green Iniu Mini Power Bank charging a GoPro MAX2 on a wodden surface." src="https://cdn.mos.cms.futurecdn.net/52wtTuTwimvy3kCntsVCjm.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>You don't need to worry about carrying a USB-C cable with you, either. The Iniu's carry strap <strong>is</strong> its USB-C cable. It locks into place when clipped into the wrist strap holder, making for a secure strap, but when removed is a braided cable that's short enough to not get in the way. </p><p>You also get three outputs (2x USB-C, 1x USB-A) and a bright digital readout that tells you how much battery capacity remains. All in all, I can't recommend this little charger enough. I'd happily buy it at full price, so with this deal, it's a no-brainer!</p><p><em>For more killer deals on tech, check out our </em><a href="https://www.tomsguide.com/live/news/black-friday-deals-live-2025-amazon-walmart-target"><em>Black Friday deals live blog</em></a><em>.</em></p><h2 class="article-body__section" id="section-shop-today-s-best-black-friday-deals"><span>Shop today's best Black Friday deals</span></h2><ul><li><strong>Amazon: </strong><a href="https://www.amazon.com/b?node=210998206011" target="_blank" rel="nofollow"><strong>50% off Ring, Ninja, Under Armour and more</strong></a><strong></strong></li><li><strong>REI: </strong><a href="https://www.rei.com/f/scd-deals" target="_blank" rel="nofollow"><strong>half-off Arc'teryx, Patagonia and more</strong></a><strong></strong></li><li><strong>Walmart: </strong><a href="https://www.walmart.com/cp/gifts/3131907" target="_blank" rel="nofollow"><strong>holiday gifts from $15</strong></a><strong></strong></li><li><strong>Dell: </strong><a href="https://www.dell.com/en-us/shop/deals?sortBy=price-ascending" target="_blank" rel="nofollow"><strong>monitors from $69, laptops from $249</strong></a><strong></strong></li><li><strong>Nectar: </strong><a href="https://www.nectarsleep.com/" target="_blank" rel="nofollow"><strong>50% off mattresses + 66% off bundles</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/site/all-electronics-on-sale/all-computers-tablets-on-sale/pcmcat1632941704767.c?id=pcmcat1632941704767" target="_blank" rel="nofollow"><strong>laptops from $149</strong></a><strong></strong></li><li><strong>Lenovo: </strong><a href="https://www.lenovo.com/us/en/d/deals/laptops/?IPromoID=LEN380027&sortBy=priceUp" target="_blank" rel="nofollow"><strong>doorbuster laptop deals from $319</strong></a><strong></strong></li><li><strong>Wayfair: </strong><a href="https://www.wayfair.com/daily-sales" target="_blank" rel="nofollow"><strong>up to 80% off home decor</strong></a><strong></strong></li><li><strong>Nike: </strong><a href="https://www.nike.com/w/sale-3yaep?sortBy=priceAsc" target="_blank" rel="nofollow"><strong>apparel/sneakers from $7</strong></a><strong></strong></li><li><strong>Lululemon: </strong><a href="https://shop.lululemon.com/c/we-made-too-much/n18mhd?Ns=price%7C0" target="_blank" rel="nofollow"><strong>top picks from $9</strong></a><strong></strong></li><li><strong>Birkenstock: </strong><a href="https://www.nordstrom.com/browse/sale?sort=PercentOff&filterByBrand=birkenstock" target="_blank" rel="nofollow"><strong>deals from $20 @ Nordstrom</strong></a><strong></strong></li><li><strong>Saatva: </strong><a href="https://www.saatva.com/mattresses/saatva-classic?utm_source=futurepublishing&utm_medium=affiliate&coupon=awyqqgzvxqicebab" target="_blank" rel="nofollow"><strong>luxury mattresses from $1,099</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 11 tech gifts that blew us away in 2025, from MacBooks to Xbox handhelds ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/11-tech-gifts-that-blew-us-away-in-2025-from-macbooks-to-xbox-handhelds</link>
                                                                            <description>
                            <![CDATA[ Make someone’s Christmas ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">2sLdYXkUQbQw4hLMYkkBC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/6YcbKy49DDzyKbiNDEPNsP-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 11 Nov 2025 16:48:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/6YcbKy49DDzyKbiNDEPNsP-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[tech gifts]]></media:description>                                                            <media:text><![CDATA[tech gifts]]></media:text>
                                <media:title type="plain"><![CDATA[tech gifts]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/6YcbKy49DDzyKbiNDEPNsP-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>While the Sleigh Bells will be ringing soon, there’s the small matter of Black Friday in between. It’s always a challenge (the fun kind) to stay on top of the year’s best tech, but that’s exactly what we do at Tom’s Guide - and 2025 has been packed with fun new tech gifts to buy!</p><p>From handheld PC/console hybrids, to sleek keyboards and shimmering smart lights, a lot of tech blew us away this year. And because of that, they are some incredible picks for present ideas for loved ones - or for yourself. Go on, you’ve earned it.</p><h3 class="article-body__section" id="section-our-favorite-tech-gifts"><span>Our Favorite Tech Gifts</span></h3><div class="product"><a data-dimension112="7bfc45a6-c631-444c-a5f0-c33a1405fc3a" data-action="Deal Block" data-label="Apple MacBook Air (M4)Apple is in the enviable position of being able to release great laptops every year with incremental performance bumps, but this one comes with a slight price cut alongside the improved M4 chip. There&rsquo;s no exterior change here from the M3 model, but it remains an excellent, ultra-portable laptop with a great battery and a machine that nails every fundamental aspect of Mac computing. Apple MacBook Air (M4)" data-dimension48="Apple MacBook Air (M4)Apple is in the enviable position of being able to release great laptops every year with incremental performance bumps, but this one comes with a slight price cut alongside the improved M4 chip. There&rsquo;s no exterior change here from the M3 model, but it remains an excellent, ultra-portable laptop with a great battery and a machine that nails every fundamental aspect of Mac computing. Apple MacBook Air (M4)" data-dimension25="$" href="https://www.amazon.com/Apple-2025-MacBook-13-inch-Laptop/dp/B0DZD9S5GC" 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="jaozhA6DUqwVKiykJv3KGG" name="macbook air m4  13inch" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/jaozhA6DUqwVKiykJv3KGG.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.amazon.com/Apple-2025-MacBook-13-inch-Laptop/dp/B0DZD9S5GC" target="_blank" rel="nofollow" data-dimension112="7bfc45a6-c631-444c-a5f0-c33a1405fc3a" data-action="Deal Block" data-label="Apple MacBook Air (M4)Apple is in the enviable position of being able to release great laptops every year with incremental performance bumps, but this one comes with a slight price cut alongside the improved M4 chip. There&rsquo;s no exterior change here from the M3 model, but it remains an excellent, ultra-portable laptop with a great battery and a machine that nails every fundamental aspect of Mac computing. Apple MacBook Air (M4)" data-dimension48="Apple MacBook Air (M4)Apple is in the enviable position of being able to release great laptops every year with incremental performance bumps, but this one comes with a slight price cut alongside the improved M4 chip. There&rsquo;s no exterior change here from the M3 model, but it remains an excellent, ultra-portable laptop with a great battery and a machine that nails every fundamental aspect of Mac computing. Apple MacBook Air (M4)" data-dimension25="$"><strong>Apple MacBook Air (M4)</strong></a><br>Apple is in the enviable position of being able to release great laptops every year with incremental performance bumps, but <a href="https://www.tomsguide.com/computing/laptops/macbook-air-m4-review">this one</a> comes with a slight price cut alongside the improved M4 chip. There’s no exterior change here from the M3 model, but it remains an excellent, ultra-portable laptop with a great battery and a machine that nails every fundamental aspect of Mac computing.<a class="view-deal button" href="https://www.amazon.com/Apple-2025-MacBook-13-inch-Laptop/dp/B0DZD9S5GC" target="_blank" rel="nofollow" data-dimension112="7bfc45a6-c631-444c-a5f0-c33a1405fc3a" data-action="Deal Block" data-label="Apple MacBook Air (M4)Apple is in the enviable position of being able to release great laptops every year with incremental performance bumps, but this one comes with a slight price cut alongside the improved M4 chip. There&rsquo;s no exterior change here from the M3 model, but it remains an excellent, ultra-portable laptop with a great battery and a machine that nails every fundamental aspect of Mac computing. Apple MacBook Air (M4)" data-dimension48="Apple MacBook Air (M4)Apple is in the enviable position of being able to release great laptops every year with incremental performance bumps, but this one comes with a slight price cut alongside the improved M4 chip. There&rsquo;s no exterior change here from the M3 model, but it remains an excellent, ultra-portable laptop with a great battery and a machine that nails every fundamental aspect of Mac computing. Apple MacBook Air (M4)" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="3734ad6c-680e-42fe-93f7-d27e6d65dd48" data-action="Deal Block" data-label="Asus ROG Xbox Ally XMicrosoft&rsquo;s long-awaited foray into the handheld gaming PC space comes arm-in-arm with ASUS, but if your gaming library is spread across Steam, Battle Net, the Xbox PC app and more, then you&rsquo;re in luck. Not only is the ROG Xbox Ally X a powerhouse, but it&rsquo;s essentially a one-stop shop that can boot into all of those PC launchers without feeling too much like, well, a PC. Asus ROG Xbox Ally X" data-dimension48="Asus ROG Xbox Ally XMicrosoft&rsquo;s long-awaited foray into the handheld gaming PC space comes arm-in-arm with ASUS, but if your gaming library is spread across Steam, Battle Net, the Xbox PC app and more, then you&rsquo;re in luck. Not only is the ROG Xbox Ally X a powerhouse, but it&rsquo;s essentially a one-stop shop that can boot into all of those PC launchers without feeling too much like, well, a PC. Asus ROG Xbox Ally X" data-dimension25="$" href="https://www.bestbuy.com/product/rog-xbox-ally-x-7-fhd-120hz-gaming-handheld-amd-ryzen-ai-z2-extreme-processor-24gb-with-1tb-ssd-windows/JJGHGPLVHW" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:900px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="548UpWLbfBsamCE78PxvGd" name="Xbox Ally X" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/548UpWLbfBsamCE78PxvGd.jpg" mos="" align="middle" fullscreen="" width="900" height="900" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.bestbuy.com/product/rog-xbox-ally-x-7-fhd-120hz-gaming-handheld-amd-ryzen-ai-z2-extreme-processor-24gb-with-1tb-ssd-windows/JJGHGPLVHW" target="_blank" rel="nofollow" data-dimension112="3734ad6c-680e-42fe-93f7-d27e6d65dd48" data-action="Deal Block" data-label="Asus ROG Xbox Ally XMicrosoft&rsquo;s long-awaited foray into the handheld gaming PC space comes arm-in-arm with ASUS, but if your gaming library is spread across Steam, Battle Net, the Xbox PC app and more, then you&rsquo;re in luck. Not only is the ROG Xbox Ally X a powerhouse, but it&rsquo;s essentially a one-stop shop that can boot into all of those PC launchers without feeling too much like, well, a PC. Asus ROG Xbox Ally X" data-dimension48="Asus ROG Xbox Ally XMicrosoft&rsquo;s long-awaited foray into the handheld gaming PC space comes arm-in-arm with ASUS, but if your gaming library is spread across Steam, Battle Net, the Xbox PC app and more, then you&rsquo;re in luck. Not only is the ROG Xbox Ally X a powerhouse, but it&rsquo;s essentially a one-stop shop that can boot into all of those PC launchers without feeling too much like, well, a PC. Asus ROG Xbox Ally X" data-dimension25="$"><strong>Asus ROG Xbox Ally X</strong></a><br>Microsoft’s long-awaited foray into the handheld gaming PC space comes arm-in-arm with ASUS, but if your gaming library is spread across Steam, Battle Net, the Xbox PC app and more, then you’re in luck. Not only is the <a href="https://www.tomsguide.com/gaming/handheld-gaming/rog-xbox-ally-x-review">ROG Xbox Ally X</a> a powerhouse, but it’s essentially a one-stop shop that can boot into all of those PC launchers without feeling too much like, well, a PC. <a class="view-deal button" href="https://www.bestbuy.com/product/rog-xbox-ally-x-7-fhd-120hz-gaming-handheld-amd-ryzen-ai-z2-extreme-processor-24gb-with-1tb-ssd-windows/JJGHGPLVHW" target="_blank" rel="nofollow" data-dimension112="3734ad6c-680e-42fe-93f7-d27e6d65dd48" data-action="Deal Block" data-label="Asus ROG Xbox Ally XMicrosoft&rsquo;s long-awaited foray into the handheld gaming PC space comes arm-in-arm with ASUS, but if your gaming library is spread across Steam, Battle Net, the Xbox PC app and more, then you&rsquo;re in luck. Not only is the ROG Xbox Ally X a powerhouse, but it&rsquo;s essentially a one-stop shop that can boot into all of those PC launchers without feeling too much like, well, a PC. Asus ROG Xbox Ally X" data-dimension48="Asus ROG Xbox Ally XMicrosoft&rsquo;s long-awaited foray into the handheld gaming PC space comes arm-in-arm with ASUS, but if your gaming library is spread across Steam, Battle Net, the Xbox PC app and more, then you&rsquo;re in luck. Not only is the ROG Xbox Ally X a powerhouse, but it&rsquo;s essentially a one-stop shop that can boot into all of those PC launchers without feeling too much like, well, a PC. Asus ROG Xbox Ally X" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="51d1aa8f-4901-4064-8c1f-10732f3fd5a8" data-action="Deal Block" data-label="Eureka Ergonomic Gaming ChairFitting in the middle of a Venn diagram between ergonomics and gaming sensibilities, the Eureka Ergonomic Gaming Chair achieves the almost impossible by doing a pretty great job at both. Its breathable backrest helps you stay focused on the game in warm situations, and it&rsquo;s easy to put together and very adjustable. Eureka Ergonomic Gaming Chair" data-dimension48="Eureka Ergonomic Gaming ChairFitting in the middle of a Venn diagram between ergonomics and gaming sensibilities, the Eureka Ergonomic Gaming Chair achieves the almost impossible by doing a pretty great job at both. Its breathable backrest helps you stay focused on the game in warm situations, and it&rsquo;s easy to put together and very adjustable. Eureka Ergonomic Gaming Chair" data-dimension25="$" href="https://www.amazon.com/EUREKA-ERGONOMIC-Adjustable-Ergonomic-Comfortable/dp/B0DXVF6PM5" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1464px;"><p class="vanilla-image-block" style="padding-top:102.46%;"><img id="sJdNGLDB2y6DbEhr9KLMYM" name="Eureka Ergonomic gaming chair" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/sJdNGLDB2y6DbEhr9KLMYM.jpg" mos="" align="middle" fullscreen="" width="1464" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.amazon.com/EUREKA-ERGONOMIC-Adjustable-Ergonomic-Comfortable/dp/B0DXVF6PM5" target="_blank" rel="nofollow" data-dimension112="51d1aa8f-4901-4064-8c1f-10732f3fd5a8" data-action="Deal Block" data-label="Eureka Ergonomic Gaming ChairFitting in the middle of a Venn diagram between ergonomics and gaming sensibilities, the Eureka Ergonomic Gaming Chair achieves the almost impossible by doing a pretty great job at both. Its breathable backrest helps you stay focused on the game in warm situations, and it&rsquo;s easy to put together and very adjustable. Eureka Ergonomic Gaming Chair" data-dimension48="Eureka Ergonomic Gaming ChairFitting in the middle of a Venn diagram between ergonomics and gaming sensibilities, the Eureka Ergonomic Gaming Chair achieves the almost impossible by doing a pretty great job at both. Its breathable backrest helps you stay focused on the game in warm situations, and it&rsquo;s easy to put together and very adjustable. Eureka Ergonomic Gaming Chair" data-dimension25="$"><strong>Eureka Ergonomic Gaming Chair</strong></a><br>Fitting in the middle of a Venn diagram between ergonomics and gaming sensibilities, the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/eureka-axion-gaming-chair-review">Eureka Ergonomic Gaming Chair</a> achieves the almost impossible by doing a pretty great job at both. Its breathable backrest helps you stay focused on the game in warm situations, and it’s easy to put together and very adjustable.<a class="view-deal button" href="https://www.amazon.com/EUREKA-ERGONOMIC-Adjustable-Ergonomic-Comfortable/dp/B0DXVF6PM5" target="_blank" rel="nofollow" data-dimension112="51d1aa8f-4901-4064-8c1f-10732f3fd5a8" data-action="Deal Block" data-label="Eureka Ergonomic Gaming ChairFitting in the middle of a Venn diagram between ergonomics and gaming sensibilities, the Eureka Ergonomic Gaming Chair achieves the almost impossible by doing a pretty great job at both. Its breathable backrest helps you stay focused on the game in warm situations, and it&rsquo;s easy to put together and very adjustable. Eureka Ergonomic Gaming Chair" data-dimension48="Eureka Ergonomic Gaming ChairFitting in the middle of a Venn diagram between ergonomics and gaming sensibilities, the Eureka Ergonomic Gaming Chair achieves the almost impossible by doing a pretty great job at both. Its breathable backrest helps you stay focused on the game in warm situations, and it&rsquo;s easy to put together and very adjustable. Eureka Ergonomic Gaming Chair" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="fee36e79-c3f5-497e-9600-7bd4298d0e4f" data-action="Deal Block" data-label="Keychron K2 HE Mechanical KeyboardOK, it technically launched at the tail-end of 2024, but the Keychron K2 HE is a fantastic keyboard worth highlighting. Whether you&rsquo;re using it for work, play, or a little of both, it pairs the customizable nature of Keychron with fantastic Hall Effect switches. It also looks better than just about any board on the market in our minds. Keychron K2 HE Mechanical Keyboard" data-dimension48="Keychron K2 HE Mechanical KeyboardOK, it technically launched at the tail-end of 2024, but the Keychron K2 HE is a fantastic keyboard worth highlighting. Whether you&rsquo;re using it for work, play, or a little of both, it pairs the customizable nature of Keychron with fantastic Hall Effect switches. It also looks better than just about any board on the market in our minds. Keychron K2 HE Mechanical Keyboard" data-dimension25="$" href="https://www.amazon.com/Keychron-Mechanical-Double-Rail-Bluetooth-Compatible/dp/B0DCVPGB9N" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1214px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="2khbcQwSMdbVZhUkXHgY68" name="Keychron K2 HE Wireless Magnetic Switch Custom Keyboard" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2khbcQwSMdbVZhUkXHgY68.jpg" mos="" align="middle" fullscreen="" width="1214" height="1214" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.amazon.com/Keychron-Mechanical-Double-Rail-Bluetooth-Compatible/dp/B0DCVPGB9N" target="_blank" rel="nofollow" data-dimension112="fee36e79-c3f5-497e-9600-7bd4298d0e4f" data-action="Deal Block" data-label="Keychron K2 HE Mechanical KeyboardOK, it technically launched at the tail-end of 2024, but the Keychron K2 HE is a fantastic keyboard worth highlighting. Whether you&rsquo;re using it for work, play, or a little of both, it pairs the customizable nature of Keychron with fantastic Hall Effect switches. It also looks better than just about any board on the market in our minds. Keychron K2 HE Mechanical Keyboard" data-dimension48="Keychron K2 HE Mechanical KeyboardOK, it technically launched at the tail-end of 2024, but the Keychron K2 HE is a fantastic keyboard worth highlighting. Whether you&rsquo;re using it for work, play, or a little of both, it pairs the customizable nature of Keychron with fantastic Hall Effect switches. It also looks better than just about any board on the market in our minds. Keychron K2 HE Mechanical Keyboard" data-dimension25="$"><strong>Keychron K2 HE Mechanical Keyboard</strong></a><br>OK, it technically launched at the tail-end of 2024, but the <a href="https://www.tomsguide.com/computing/peripherals/keychron-k2-he-review">Keychron K2 HE</a> is a fantastic keyboard worth highlighting. Whether you’re using it for work, play, or a little of both, it pairs the customizable nature of Keychron with fantastic Hall Effect switches. It also looks better than just about any board on the market in our minds.<a class="view-deal button" href="https://www.amazon.com/Keychron-Mechanical-Double-Rail-Bluetooth-Compatible/dp/B0DCVPGB9N" target="_blank" rel="nofollow" data-dimension112="fee36e79-c3f5-497e-9600-7bd4298d0e4f" data-action="Deal Block" data-label="Keychron K2 HE Mechanical KeyboardOK, it technically launched at the tail-end of 2024, but the Keychron K2 HE is a fantastic keyboard worth highlighting. Whether you&rsquo;re using it for work, play, or a little of both, it pairs the customizable nature of Keychron with fantastic Hall Effect switches. It also looks better than just about any board on the market in our minds. Keychron K2 HE Mechanical Keyboard" data-dimension48="Keychron K2 HE Mechanical KeyboardOK, it technically launched at the tail-end of 2024, but the Keychron K2 HE is a fantastic keyboard worth highlighting. Whether you&rsquo;re using it for work, play, or a little of both, it pairs the customizable nature of Keychron with fantastic Hall Effect switches. It also looks better than just about any board on the market in our minds. Keychron K2 HE Mechanical Keyboard" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="114961c7-cc54-4925-a641-1ff35117f0e8" data-action="Deal Block" data-label="Govee Curtain Lights ProThe Govee Curtain Lights Pro are an awesome way to decorate your home for the Holidays, letting you share just about anything through the medium of, well, lighting. Still, it gets even better when you use it as a smart display, showcasing your clock, the weather, and the temperature outdoors for your indoor office. Govee Curtain Lights Pro" data-dimension48="Govee Curtain Lights ProThe Govee Curtain Lights Pro are an awesome way to decorate your home for the Holidays, letting you share just about anything through the medium of, well, lighting. Still, it gets even better when you use it as a smart display, showcasing your clock, the weather, and the temperature outdoors for your indoor office. Govee Curtain Lights Pro" data-dimension25="$" href="https://www.amazon.com/Govee-Upgraded-Changing-Waterproof-5-41%C3%975-77ft/dp/B0FCRJ7Y4J" 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:97.40%;"><img id="d96X7CqTmVUnxhPs58y6LZ" name="Govee Curtain Lights Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/d96X7CqTmVUnxhPs58y6LZ.jpg" mos="" align="middle" fullscreen="" width="1500" height="1461" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.amazon.com/Govee-Upgraded-Changing-Waterproof-5-41%C3%975-77ft/dp/B0FCRJ7Y4J" target="_blank" rel="nofollow" data-dimension112="114961c7-cc54-4925-a641-1ff35117f0e8" data-action="Deal Block" data-label="Govee Curtain Lights ProThe Govee Curtain Lights Pro are an awesome way to decorate your home for the Holidays, letting you share just about anything through the medium of, well, lighting. Still, it gets even better when you use it as a smart display, showcasing your clock, the weather, and the temperature outdoors for your indoor office. Govee Curtain Lights Pro" data-dimension48="Govee Curtain Lights ProThe Govee Curtain Lights Pro are an awesome way to decorate your home for the Holidays, letting you share just about anything through the medium of, well, lighting. Still, it gets even better when you use it as a smart display, showcasing your clock, the weather, and the temperature outdoors for your indoor office. Govee Curtain Lights Pro" data-dimension25="$"><strong>Govee Curtain Lights Pro</strong></a><br>The <a href="https://www.tomsguide.com/home/smart-home/i-just-installed-govees-new-curtain-lights-pro-and-this-hidden-feature-makes-me-want-to-leave-them-on-all-the-time">Govee Curtain Lights Pro</a> are an awesome way to decorate your home for the Holidays, letting you share just about anything through the medium of, well, lighting. Still, it gets even better when you use it as a smart display, showcasing your clock, the weather, and the temperature outdoors for your indoor office.<a class="view-deal button" href="https://www.amazon.com/Govee-Upgraded-Changing-Waterproof-5-41%C3%975-77ft/dp/B0FCRJ7Y4J" target="_blank" rel="nofollow" data-dimension112="114961c7-cc54-4925-a641-1ff35117f0e8" data-action="Deal Block" data-label="Govee Curtain Lights ProThe Govee Curtain Lights Pro are an awesome way to decorate your home for the Holidays, letting you share just about anything through the medium of, well, lighting. Still, it gets even better when you use it as a smart display, showcasing your clock, the weather, and the temperature outdoors for your indoor office. Govee Curtain Lights Pro" data-dimension48="Govee Curtain Lights ProThe Govee Curtain Lights Pro are an awesome way to decorate your home for the Holidays, letting you share just about anything through the medium of, well, lighting. Still, it gets even better when you use it as a smart display, showcasing your clock, the weather, and the temperature outdoors for your indoor office. Govee Curtain Lights Pro" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="589b3674-0872-47be-b626-7029e423b1cd" data-action="Deal Block" data-label="DJI NeoAnother 2024 arrival that we can&rsquo;t get enough of, the DJI Neo is a fantastic drone that&rsquo;s a great value proposition. Ideal for beginners, it packs 4K recording, multiple shooting modes, and a compact design that makes you more likely to take it on vacation. No FAA regulations are involved, either. DJI Neo" data-dimension48="DJI NeoAnother 2024 arrival that we can&rsquo;t get enough of, the DJI Neo is a fantastic drone that&rsquo;s a great value proposition. Ideal for beginners, it packs 4K recording, multiple shooting modes, and a compact design that makes you more likely to take it on vacation. No FAA regulations are involved, either. DJI Neo" data-dimension25="$" href="https://www.amazon.com/DJI-Three-Battery-QuickShots-Stabilized-Controller-Free/dp/B0DDS1368S" 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="yQ2D9952vwuZALYFFAiFF6" name="Neo-dealbox" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yQ2D9952vwuZALYFFAiFF6.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.amazon.com/DJI-Three-Battery-QuickShots-Stabilized-Controller-Free/dp/B0DDS1368S" target="_blank" rel="nofollow" data-dimension112="589b3674-0872-47be-b626-7029e423b1cd" data-action="Deal Block" data-label="DJI NeoAnother 2024 arrival that we can&rsquo;t get enough of, the DJI Neo is a fantastic drone that&rsquo;s a great value proposition. Ideal for beginners, it packs 4K recording, multiple shooting modes, and a compact design that makes you more likely to take it on vacation. No FAA regulations are involved, either. DJI Neo" data-dimension48="DJI NeoAnother 2024 arrival that we can&rsquo;t get enough of, the DJI Neo is a fantastic drone that&rsquo;s a great value proposition. Ideal for beginners, it packs 4K recording, multiple shooting modes, and a compact design that makes you more likely to take it on vacation. No FAA regulations are involved, either. DJI Neo" data-dimension25="$"><strong>DJI Neo</strong></a><br>Another 2024 arrival that we can’t get enough of, the <a href="https://www.tomsguide.com/cameras-photography/drones/i-tested-the-dji-neo-and-its-so-good-that-all-i-can-think-about-now-is-flying-it">DJI Neo</a> is a fantastic drone that’s a great value proposition. Ideal for beginners, it packs 4K recording, multiple shooting modes, and a compact design that makes you more likely to take it on vacation. No FAA regulations are involved, either.<a class="view-deal button" href="https://www.amazon.com/DJI-Three-Battery-QuickShots-Stabilized-Controller-Free/dp/B0DDS1368S" target="_blank" rel="nofollow" data-dimension112="589b3674-0872-47be-b626-7029e423b1cd" data-action="Deal Block" data-label="DJI NeoAnother 2024 arrival that we can&rsquo;t get enough of, the DJI Neo is a fantastic drone that&rsquo;s a great value proposition. Ideal for beginners, it packs 4K recording, multiple shooting modes, and a compact design that makes you more likely to take it on vacation. No FAA regulations are involved, either. DJI Neo" data-dimension48="DJI NeoAnother 2024 arrival that we can&rsquo;t get enough of, the DJI Neo is a fantastic drone that&rsquo;s a great value proposition. Ideal for beginners, it packs 4K recording, multiple shooting modes, and a compact design that makes you more likely to take it on vacation. No FAA regulations are involved, either. DJI Neo" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="e0901393-2321-4f50-a852-72a077801dd1" data-action="Deal Block" data-label="Fujifilm Instax mini EvoThis adorable, retro-tinged camera is a social media star&rsquo;s best friend, with 100 effect combinations across 10 filters and 10 lens effects. Images come out great whichever option you select (even in low light), and it&rsquo;s small enough to fit into an everyday carry. Fujifilm Instax mini Evo" data-dimension48="Fujifilm Instax mini EvoThis adorable, retro-tinged camera is a social media star&rsquo;s best friend, with 100 effect combinations across 10 filters and 10 lens effects. Images come out great whichever option you select (even in low light), and it&rsquo;s small enough to fit into an everyday carry. Fujifilm Instax mini Evo" data-dimension25="$" href="https://www.walmart.com/ip/FUJIFILM-INSTAX-MINI-EVO-Hybrid-Instant-Camera-Black/367663480/" 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="SJvyJkgK8QuA8m5xuJBim" name="Mini-Evo-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SJvyJkgK8QuA8m5xuJBim.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.walmart.com/ip/FUJIFILM-INSTAX-MINI-EVO-Hybrid-Instant-Camera-Black/367663480/" target="_blank" rel="nofollow" data-dimension112="e0901393-2321-4f50-a852-72a077801dd1" data-action="Deal Block" data-label="Fujifilm Instax mini EvoThis adorable, retro-tinged camera is a social media star&rsquo;s best friend, with 100 effect combinations across 10 filters and 10 lens effects. Images come out great whichever option you select (even in low light), and it&rsquo;s small enough to fit into an everyday carry. Fujifilm Instax mini Evo" data-dimension48="Fujifilm Instax mini EvoThis adorable, retro-tinged camera is a social media star&rsquo;s best friend, with 100 effect combinations across 10 filters and 10 lens effects. Images come out great whichever option you select (even in low light), and it&rsquo;s small enough to fit into an everyday carry. Fujifilm Instax mini Evo" data-dimension25="$"><strong>Fujifilm Instax mini Evo</strong></a><br>This adorable, retro-tinged camera is a social media star’s best friend, with 100 effect combinations across 10 filters and 10 lens effects. Images come out great whichever option you select (even in low light), and it’s small enough to fit into an everyday carry. <a class="view-deal button" href="https://www.walmart.com/ip/FUJIFILM-INSTAX-MINI-EVO-Hybrid-Instant-Camera-Black/367663480/" target="_blank" rel="nofollow" data-dimension112="e0901393-2321-4f50-a852-72a077801dd1" data-action="Deal Block" data-label="Fujifilm Instax mini EvoThis adorable, retro-tinged camera is a social media star&rsquo;s best friend, with 100 effect combinations across 10 filters and 10 lens effects. Images come out great whichever option you select (even in low light), and it&rsquo;s small enough to fit into an everyday carry. Fujifilm Instax mini Evo" data-dimension48="Fujifilm Instax mini EvoThis adorable, retro-tinged camera is a social media star&rsquo;s best friend, with 100 effect combinations across 10 filters and 10 lens effects. Images come out great whichever option you select (even in low light), and it&rsquo;s small enough to fit into an everyday carry. Fujifilm Instax mini Evo" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="82c498f0-4aab-437f-856f-8cc4af4247a3" data-action="Deal Block" data-label="Fujifilm X-M5Looking to give the vlogger in your life an upgrade? Look no further than the Fujifilm X-M5, which is a portable powerhouse that can simulate shooting on film, while being good value for money, too. It can record up to 4K video, and also offers vertical recording in landscape orientation, making it ideal for multiple content types. Fujifilm X-M5" data-dimension48="Fujifilm X-M5Looking to give the vlogger in your life an upgrade? Look no further than the Fujifilm X-M5, which is a portable powerhouse that can simulate shooting on film, while being good value for money, too. It can record up to 4K video, and also offers vertical recording in landscape orientation, making it ideal for multiple content types. Fujifilm X-M5" data-dimension25="$" href="https://www.adorama.com/ifjxm5skn.html" 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="vtcH67GJX2u6cHfwmqiQ3Q" name="X-M5-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vtcH67GJX2u6cHfwmqiQ3Q.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.adorama.com/ifjxm5skn.html" target="_blank" rel="nofollow" data-dimension112="82c498f0-4aab-437f-856f-8cc4af4247a3" data-action="Deal Block" data-label="Fujifilm X-M5Looking to give the vlogger in your life an upgrade? Look no further than the Fujifilm X-M5, which is a portable powerhouse that can simulate shooting on film, while being good value for money, too. It can record up to 4K video, and also offers vertical recording in landscape orientation, making it ideal for multiple content types. Fujifilm X-M5" data-dimension48="Fujifilm X-M5Looking to give the vlogger in your life an upgrade? Look no further than the Fujifilm X-M5, which is a portable powerhouse that can simulate shooting on film, while being good value for money, too. It can record up to 4K video, and also offers vertical recording in landscape orientation, making it ideal for multiple content types. Fujifilm X-M5" data-dimension25="$"><strong>Fujifilm X-M5</strong></a><br>Looking to give the vlogger in your life an upgrade? Look no further than the <a href="https://www.tomsguide.com/cameras-photography/fujifilm-x-m5-review">Fujifilm X-M5</a>, which is a portable powerhouse that can simulate shooting on film, while being good value for money, too. It can record up to 4K video, and also offers vertical recording in landscape orientation, making it ideal for multiple content types.<a class="view-deal button" href="https://www.adorama.com/ifjxm5skn.html" target="_blank" rel="nofollow" data-dimension112="82c498f0-4aab-437f-856f-8cc4af4247a3" data-action="Deal Block" data-label="Fujifilm X-M5Looking to give the vlogger in your life an upgrade? Look no further than the Fujifilm X-M5, which is a portable powerhouse that can simulate shooting on film, while being good value for money, too. It can record up to 4K video, and also offers vertical recording in landscape orientation, making it ideal for multiple content types. Fujifilm X-M5" data-dimension48="Fujifilm X-M5Looking to give the vlogger in your life an upgrade? Look no further than the Fujifilm X-M5, which is a portable powerhouse that can simulate shooting on film, while being good value for money, too. It can record up to 4K video, and also offers vertical recording in landscape orientation, making it ideal for multiple content types. Fujifilm X-M5" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="9063521b-4a2e-4007-8662-e225a90964e7" data-action="Deal Block" data-label="Apple iPhone 17The base iPhone has been great for years, but Apple really pushed things to a new level this year with the iPhone 17. It finally gets Apple&rsquo;s ProMotion from the Pro line for smoother scrolling and gaming, the chip is fantastic, and you get twice the storage at the base end without a price hike. In fact, we&rsquo;d say it&rsquo;s an easier recommendation than the Pro now. Apple iPhone 17" data-dimension48="Apple iPhone 17The base iPhone has been great for years, but Apple really pushed things to a new level this year with the iPhone 17. It finally gets Apple&rsquo;s ProMotion from the Pro line for smoother scrolling and gaming, the chip is fantastic, and you get twice the storage at the base end without a price hike. In fact, we&rsquo;d say it&rsquo;s an easier recommendation than the Pro now. Apple iPhone 17" data-dimension25="$" href="https://www.apple.com/shop/buy-iphone/iphone-17" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1211px;"><p class="vanilla-image-block" style="padding-top:123.86%;"><img id="7KmLGxUJwrEKiqzGnVwshE" name="iPhone 17" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7KmLGxUJwrEKiqzGnVwshE.jpg" mos="" align="middle" fullscreen="" width="1211" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.apple.com/shop/buy-iphone/iphone-17" target="_blank" rel="nofollow" data-dimension112="9063521b-4a2e-4007-8662-e225a90964e7" data-action="Deal Block" data-label="Apple iPhone 17The base iPhone has been great for years, but Apple really pushed things to a new level this year with the iPhone 17. It finally gets Apple&rsquo;s ProMotion from the Pro line for smoother scrolling and gaming, the chip is fantastic, and you get twice the storage at the base end without a price hike. In fact, we&rsquo;d say it&rsquo;s an easier recommendation than the Pro now. Apple iPhone 17" data-dimension48="Apple iPhone 17The base iPhone has been great for years, but Apple really pushed things to a new level this year with the iPhone 17. It finally gets Apple&rsquo;s ProMotion from the Pro line for smoother scrolling and gaming, the chip is fantastic, and you get twice the storage at the base end without a price hike. In fact, we&rsquo;d say it&rsquo;s an easier recommendation than the Pro now. Apple iPhone 17" data-dimension25="$"><strong>Apple iPhone 17</strong></a><br>The base iPhone has been great for years, but Apple really pushed things to a new level this year with the <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-review">iPhone 17</a>. It finally gets Apple’s ProMotion from the Pro line for smoother scrolling and gaming, the chip is fantastic, and you get twice the storage at the base end without a price hike. In fact, we’d say it’s an easier recommendation than the Pro now.<a class="view-deal button" href="https://www.apple.com/shop/buy-iphone/iphone-17" target="_blank" rel="nofollow" data-dimension112="9063521b-4a2e-4007-8662-e225a90964e7" data-action="Deal Block" data-label="Apple iPhone 17The base iPhone has been great for years, but Apple really pushed things to a new level this year with the iPhone 17. It finally gets Apple&rsquo;s ProMotion from the Pro line for smoother scrolling and gaming, the chip is fantastic, and you get twice the storage at the base end without a price hike. In fact, we&rsquo;d say it&rsquo;s an easier recommendation than the Pro now. Apple iPhone 17" data-dimension48="Apple iPhone 17The base iPhone has been great for years, but Apple really pushed things to a new level this year with the iPhone 17. It finally gets Apple&rsquo;s ProMotion from the Pro line for smoother scrolling and gaming, the chip is fantastic, and you get twice the storage at the base end without a price hike. In fact, we&rsquo;d say it&rsquo;s an easier recommendation than the Pro now. Apple iPhone 17" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="a3245daa-13e7-45b9-a946-5c8c1cbadd35" data-action="Deal Block" data-label="LG C5 OLEDLG&rsquo;s C-series of TVs have always been fantastic, but the latest C5 might be the best it&rsquo;s ever been. It&rsquo;s bright, and avoids being too reflective, and the latest webOS 25 is responsive and packed with features from the jump. And gamers can rest easy knowing there&rsquo;s minimal input lag, an easy-to-access Game Settings bar, and 144Hz VRR. LG C5 OLED" data-dimension48="LG C5 OLEDLG&rsquo;s C-series of TVs have always been fantastic, but the latest C5 might be the best it&rsquo;s ever been. It&rsquo;s bright, and avoids being too reflective, and the latest webOS 25 is responsive and packed with features from the jump. And gamers can rest easy knowing there&rsquo;s minimal input lag, an easy-to-access Game Settings bar, and 144Hz VRR. LG C5 OLED" data-dimension25="$" href="https://www.amazon.com/LG-Upscaling-Filmmaker-Orchestra-OLED55C5PUA/dp/B0DYQF1Q3Z" 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></strong><a href="https://www.amazon.com/LG-Upscaling-Filmmaker-Orchestra-OLED55C5PUA/dp/B0DYQF1Q3Z" target="_blank" rel="nofollow" data-dimension112="a3245daa-13e7-45b9-a946-5c8c1cbadd35" data-action="Deal Block" data-label="LG C5 OLEDLG&rsquo;s C-series of TVs have always been fantastic, but the latest C5 might be the best it&rsquo;s ever been. It&rsquo;s bright, and avoids being too reflective, and the latest webOS 25 is responsive and packed with features from the jump. And gamers can rest easy knowing there&rsquo;s minimal input lag, an easy-to-access Game Settings bar, and 144Hz VRR. LG C5 OLED" data-dimension48="LG C5 OLEDLG&rsquo;s C-series of TVs have always been fantastic, but the latest C5 might be the best it&rsquo;s ever been. It&rsquo;s bright, and avoids being too reflective, and the latest webOS 25 is responsive and packed with features from the jump. And gamers can rest easy knowing there&rsquo;s minimal input lag, an easy-to-access Game Settings bar, and 144Hz VRR. LG C5 OLED" data-dimension25="$"><strong>LG C5 OLED</strong></a><br>LG’s C-series of TVs have always been fantastic, but <a href="https://www.tomsguide.com/tvs/oled-tvs/lg-c5-oled-tv-review#section-lg-c5-oled-review-pricing-and-availability">the latest C5</a> might be the best it’s ever been. It’s bright, and avoids being too reflective, and the latest webOS 25 is responsive and packed with features from the jump. And gamers can rest easy knowing there’s minimal input lag, an easy-to-access Game Settings bar, and 144Hz VRR.<a class="view-deal button" href="https://www.amazon.com/LG-Upscaling-Filmmaker-Orchestra-OLED55C5PUA/dp/B0DYQF1Q3Z" target="_blank" rel="nofollow" data-dimension112="a3245daa-13e7-45b9-a946-5c8c1cbadd35" data-action="Deal Block" data-label="LG C5 OLEDLG&rsquo;s C-series of TVs have always been fantastic, but the latest C5 might be the best it&rsquo;s ever been. It&rsquo;s bright, and avoids being too reflective, and the latest webOS 25 is responsive and packed with features from the jump. And gamers can rest easy knowing there&rsquo;s minimal input lag, an easy-to-access Game Settings bar, and 144Hz VRR. LG C5 OLED" data-dimension48="LG C5 OLEDLG&rsquo;s C-series of TVs have always been fantastic, but the latest C5 might be the best it&rsquo;s ever been. It&rsquo;s bright, and avoids being too reflective, and the latest webOS 25 is responsive and packed with features from the jump. And gamers can rest easy knowing there&rsquo;s minimal input lag, an easy-to-access Game Settings bar, and 144Hz VRR. LG C5 OLED" data-dimension25="$">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I got this compact power bank for my Meta Quest 3, but now I use it to charge everything ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/i-got-this-compact-power-bank-for-my-meta-quest-3-but-now-i-use-it-for-everything</link>
                                                                            <description>
                            <![CDATA[ If you're looking for a way to extend the Meta Quest 3's battery life, this Kiwi Design P5000 Compact Power Bank bundle will effortlessly give you extra VR time. But it can be used for all your USB-C devices, too. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">3GgDZcWud2NPijQrFMYxFW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EnQUJYb4YzqFePQWREVhyU-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 08 Nov 2025 06:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Darragh Murphy ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5QiaTSWf9FcVB7STxcdo4M.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Darragh is Tom’s Guide’s Computing Editor and is fascinated by all things bizarre in tech. This usually leads to assorted coverage varying from washing machines designed for earbuds to the wild world of laptops. Whether it&#039;s connecting Scar from The Lion King to two-factor authentication or turning his love for laptops into a fabricated rap battle from 8 Mile, he believes there’s always a quirky spin to be made.&lt;br&gt;&lt;br&gt;Darragh has previously been an Editor for Laptop Mag and a News Editor for Time Out Dubai, where he also headed the gaming and tech section. His work can be seen in Mashable, Android Police, Shortlist Dubai, Proton, theBit.nz, ReviewsFire and more. &lt;br&gt;&lt;br&gt;While laptops are his bread and butter, he’s also reviewed smartphones, monitors, speakers, docking stations and VPNs. He’s covered IFA, MWC Barcelona, the Consumer Electronics Show (&lt;a href=&quot;https://www.tomsguide.com/uk/tag/ces&quot; target=&quot;_blank&quot;&gt;CES&lt;/a&gt;) and more.&lt;br&gt;&lt;br&gt;When he&#039;s not checking out the latest devices and all things computing, he can be found going for dreaded long runs, watching terrible shark movies, and trying to find time to game.&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/EnQUJYb4YzqFePQWREVhyU-1280-80.jpg">
                                                            <media:credit><![CDATA[Future / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Kiwi Design P5000 Compact Power Bank]]></media:description>                                                            <media:text><![CDATA[Kiwi Design P5000 Compact Power Bank]]></media:text>
                                <media:title type="plain"><![CDATA[Kiwi Design P5000 Compact Power Bank]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EnQUJYb4YzqFePQWREVhyU-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If there's one essential upgrade every Meta Quest owner needs, it's a way to extend the VR headsets' battery life. Sure, the <a href="https://www.tomsguide.com/reviews/meta-quest-3">Quest 3</a> and <a href="https://www.tomsguide.com/computing/vr-ar/meta-quest-3s-review">Quest 3S</a> may be among the <a href="https://www.tomsguide.com/best-picks/best-vr-headsets">best VR headsets</a> around, but getting two hours before they go kaput simply isn't enough to make the most out of them. </p><p>Enter Kiwi Design. One of the leading brands behind all things Meta Quest accessories, the company has already impressed with tis <a href="https://www.tomsguide.com/computing/vr-ar/i-cant-put-my-meta-quest-3-down-thanks-to-this-vr-accessory-and-now-i-cant-imagine-playing-without-it">H4 Boost Halo Battery Strap</a> and <a href="https://www.tomsguide.com/computing/vr-ar/kiwi-design-k4-duo-meta-quest-vr-head-strap-review">K4 Duo Strap</a> for upgraded audio. Now, there's another handy accessory in its arsenal: the Kiwi Design P5000 Compact Power Bank. <em> </em></p><div class="product"><a data-dimension112="f92260d0-ac7e-4776-9477-c118872a616a" data-action="Deal Block" data-label="The Kiwi Design P5000 Compact Power Bank comes in a set of two 5,000mAh power banks, and while they're designed for VR headsets like the Meta Quest 3 and Quest 3S, they also act as reliable backup batteries for pretty much all USB-C devices. With the secure bracket that can be attached using a hook-and-loop velcro strap, 20W magnetic dock for fast charging and a lightweight, portable design, these P5000 power banks can help power your devices anywhere. Use the code NC6YXJ56HVZR to get an extra 10% off!" data-dimension48="The Kiwi Design P5000 Compact Power Bank comes in a set of two 5,000mAh power banks, and while they're designed for VR headsets like the Meta Quest 3 and Quest 3S, they also act as reliable backup batteries for pretty much all USB-C devices. With the secure bracket that can be attached using a hook-and-loop velcro strap, 20W magnetic dock for fast charging and a lightweight, portable design, these P5000 power banks can help power your devices anywhere. Use the code NC6YXJ56HVZR to get an extra 10% off!" data-dimension25="$80" href="https://www.kiwidesign.com/products/gb02-battery-pack" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="msXGvFx6qjJF7nVvmXvdeh" name="Kiwi Design P5000 Compact Power Bank deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/msXGvFx6qjJF7nVvmXvdeh.jpg" mos="" align="middle" fullscreen="" width="1600" height="1600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Kiwi Design P5000 Compact Power Bank comes in a set of two 5,000mAh power banks, and while they're designed for VR headsets like the Meta Quest 3 and Quest 3S, they also act as reliable backup batteries for pretty much all USB-C devices. With the secure bracket that can be attached using a hook-and-loop velcro strap, 20W magnetic dock for fast charging and a lightweight, portable design, these P5000 power banks can help power your devices anywhere. Use the code <strong>NC6YXJ56HVZR</strong> to get an extra 10% off! <a class="view-deal button" href="https://www.kiwidesign.com/products/gb02-battery-pack" target="_blank" rel="nofollow" data-dimension112="f92260d0-ac7e-4776-9477-c118872a616a" data-action="Deal Block" data-label="The Kiwi Design P5000 Compact Power Bank comes in a set of two 5,000mAh power banks, and while they're designed for VR headsets like the Meta Quest 3 and Quest 3S, they also act as reliable backup batteries for pretty much all USB-C devices. With the secure bracket that can be attached using a hook-and-loop velcro strap, 20W magnetic dock for fast charging and a lightweight, portable design, these P5000 power banks can help power your devices anywhere. Use the code NC6YXJ56HVZR to get an extra 10% off!" data-dimension48="The Kiwi Design P5000 Compact Power Bank comes in a set of two 5,000mAh power banks, and while they're designed for VR headsets like the Meta Quest 3 and Quest 3S, they also act as reliable backup batteries for pretty much all USB-C devices. With the secure bracket that can be attached using a hook-and-loop velcro strap, 20W magnetic dock for fast charging and a lightweight, portable design, these P5000 power banks can help power your devices anywhere. Use the code NC6YXJ56HVZR to get an extra 10% off!" data-dimension25="$80">View Deal</a></p></div><p>Wait, just a power bank? Surely there are enough of those going around that can give any VR headset a boost. That was my initial thought, but not only is the P5000 designed to be a valuable backup battery for virtually all VR headsets, it also comes bundled as a set of two.</p><p>That means this power bank bundle offers up two 5,000mAh capacity batteries that can be attached to a Meta Quest 3/3S, which I've used to get an additional three hours of playtime out of my headset. They're light, easily swappable and can be attached anywhere thanks to the secure bracket that uses a secure velcro strap. </p><p>Since using the P5000 Power Banks, they've already offered a simple yet effective system of comfortably charging my Meta Quest 3 without being tethered to a cable. But this versatility doesn't stop at VR, as these battery boosters also serve a multi-purpose use for any USB-C device that requires extra juice. </p><p>From attaching it to my <a href="https://www.tomsguide.com/computing/i-traveled-500-miles-with-this-laptop-backpack-and-its-done-wonders-for-my-daily-commute">Alpaka backpack</a> to act as an impromptu charger while on the go to acting as a backup to power up my iPhone, Apple Watch and AirPods, I now use the P5000 Compact Power Banks for everything. There are some of the <a href="https://www.tomsguide.com/best-picks/best-portable-chargers">best power banks</a> you can get for your Meta Quest headset, but also for so much more. </p><h2 id="double-the-battery-power">Double the battery power</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="EKDTnzZi8E8icmfhxFsWxU" name="Kiwi Design P5000 Compact Power Bank" alt="Kiwi Design P5000 Compact Power Bank" src="https://cdn.mos.cms.futurecdn.net/EKDTnzZi8E8icmfhxFsWxU.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>With just 5,000mAh battery capacity between the two P5000s, these are far from the most you can get from a power bank today. I mean, our current favorite, the CUKTECH 30 Power Bank, offers a whopping 40,000mAh to power your devices many times over. </p><p>But this smaller capacity is intended by Kiwi Design. Weighing just 0.2lbs/105g each, they barely add any weight when I attached one to my Meta Quest 3, and that also makes them extremely portable to carry around and strap onto other devices. </p><p>And of course, having two power banks handy will always be better than one, and the P5000s are easily swappable when I'm in dire need of extra battery life. After using up one power bank to get an additional 1.5 hours out of the VR headset, all I needed to do was pop it out and fit in the other that's fully charged. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qFKnhtKiCzPRnmMULW256V" name="Kiwi Design P5000 Compact Power Bank" alt="Kiwi Design P5000 Compact Power Bank" src="https://cdn.mos.cms.futurecdn.net/qFKnhtKiCzPRnmMULW256V.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>In fact, despite already delivering a total of five hours of battery to the Quest 3, I could prolong this by charging the substitute P5000 once it was used up. That's thanks to the included 20W magnetic charging docks, which take around an hour and a half to charge the batteries from 0% to 100%. It's like an infinite loop of charging. </p><p>I'm also a fan of the bracket with a hook-and-loop velcro strap, which meant I could place it anywhere on my Meta Quest 3's head strap. I placed it on the top, but it can be strapped onto the side or back, too. What's more, when attached, the P5000 stays securely fastened, as a clasp mechanism keeps it locked in place, with the orange button on top making it easy to release it. For the amount of moving around done in VR, especially when playing the <a href="https://www.tomsguide.com/best-picks/best-meta-quest-3-games">best Meta Quest games</a>, that's hugely welcome. </p><p>While head straps with built-in batteries like Kiwi Design's H4 Boost offer longer battery life in a single session (without the need to change batteries), I got more use out of the P5000 Compact Power Banks in the real world. </p><h2 id="extra-portable-power">Extra portable power</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="342sR3GJWaBvSNBZuumAAV" name="Kiwi Design P5000 Compact Power Bank" alt="Kiwi Design P5000 Compact Power Bank" src="https://cdn.mos.cms.futurecdn.net/342sR3GJWaBvSNBZuumAAV.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>Power banks are made for portability, and that's exactly what the P5000s achieve. They're named "Compact" for a reason, with each fitting the size of my hand. I've slipped them into the pockets of my backpack without them taking up much space at all. </p><p>No, I don't take them along with me to charge my Quest 3 (that generally stays at home). Since they come with USB-C slots, I can plug these power banks into nearly any of my devices. I've used it to charge my <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-10-review">Apple Watch 10</a>, power up my <a href="https://www.tomsguide.com/audio/earbuds/apple-airpods-4-review">AirPods 4</a>, and even give my <a href="https://www.tomsguide.com/computing/smart-glasses/even-realities-g1-smart-glasses-review">Even Realities G1 smart glasses</a> case extra juice. I was also able to charge multiple devices at once using the <a href="https://www.tomsguide.com/tech/ive-been-using-this-3-in-1-wireless-charger-for-2-weeks-and-its-a-must-have-for-travel">Satechi OntheGo 3-in-1 Charger</a>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LKJ553W9pfCgmpFy85QVwU" name="Kiwi Design P5000 Compact Power Bank" alt="Kiwi Design P5000 Compact Power Bank" src="https://cdn.mos.cms.futurecdn.net/LKJ553W9pfCgmpFy85QVwU.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>The bracket delivers even more charging opportunities. Since it can be attached to anything the strap can wrap around, I put it on my backpack strap to act as an easy-to-access charger while on the move. But there are better places to put it, like on selfie sticks or <a href="https://www.tomsguide.com/best-picks/best-iphone-tripods">tripods</a> to charge your smartphone, <a href="https://www.tomsguide.com/us/best-bluetooth-speakers,review-1982.html">Bluetooth speakers</a> when pumping out tunes outdoors and even <a href="https://www.tomsguide.com/us/best-action-cameras,review-3046.html">action cameras</a>.</p><h2 id="is-the-kiwi-design-p5000-compact-power-bank-worth-it">Is the Kiwi Design P5000 Compact Power Bank worth it?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DgzQ26aB8BVLG3DixXMkxU" name="Kiwi Design P5000 Compact Power Bank" alt="Kiwi Design P5000 Compact Power Bank" src="https://cdn.mos.cms.futurecdn.net/DgzQ26aB8BVLG3DixXMkxU.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>Kiwi Design may have made a reliable power bank system for VR headsets, but it took the P5000 Compact Power Bank's design further by making it for way more than just charging a Meta Quest 3. </p><p>Providing two 5,000mAh power banks is already a win, but being able to easily use them for most charging scenarios is a huge perk to have. And, once one loses juice, another will be standing by fully charged to take advantage of. </p><p>It's a great way to charge a Meta Quest headset, although its $89 price tag can seem a little steep considering the usual $79 cost of the Kiwi Design H4 Boost Battery Strap (<a href="https://www.amazon.com/Comfort-Battery-Accessories-Headset-Pressure-PC/dp/B0D6W88TCN/" target="_blank" rel="nofollow">currently down to $63 at Amazon</a>). That said, that can't be used for other devices, and again, there's <em>two </em>power banks to make use of. I do wish the charging speeds were faster, but that doesn't take away from what these power banks offer.</p><p>If you're in need of versatile backup batteries for your VR headset and other devices, Kiwi Design's P5000 Compact Power Banks will do the trick. </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/i-ditched-my-laptop-charger-for-this-power-bank-with-140w-charging-speed-and-its-down-to-its-all-time-lowest-price">I ditched my laptop charger for this power bank with 140W charging speed — and it's down to its all-time lowest price</a></li><li><a href="https://www.tomsguide.com/gaming/i-turned-my-living-room-into-an-arcade-with-the-gaime-light-guns-and-lost-a-whole-night-to-time-crisis">I turned my living room into an arcade with the G’AIM’E light guns and lost a whole night to Time Crisis</a></li><li><a href="https://www.tomsguide.com/computing/virtual-reality/i-just-tested-mixed-reality-link-for-windows-11-with-my-meta-quest-3-and-its-shockingly-good-for-a-free-feature">I just tested Mixed Reality Link for Windows 11 with my Meta Quest 3, and it’s shockingly good for a free feature</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Best tech gifts 2025 — 31+ picks for the gadget-lover on your list ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/best-tech-gifts-and-gadgets</link>
                                                                            <description>
                            <![CDATA[ Here are the best tech gifts for 2025 from our team of experts. We've included products for every budget and every kind of person you have your list. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">yasvxow9KfF49Z2mQvcoCj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/8aLWiS9kcjU7X69VwJKNxj-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 05 Nov 2025 14:21:49 +0000</pubDate>                                                                                                                                <updated>Tue, 11 Nov 2025 16:50:08 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Kate Kozuch ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xAVUdx6Qtp3SzugnnfNYsL.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Kate Kozuch is a managing editor of social and video at Tom&#039;s Guide, where she&#039;s been with the team since 2019. She also reviews smartwatches, covers TVs, tests the latest audio products and dabbles in cooking appliances. Of course, that&#039;s not when she&#039;s working on building the &lt;a href=&quot;https://www.tomsguide.com/reference/smart-home-guide&quot;&gt;ultimate DIY smart home&lt;/a&gt;. She has conducted over 100 different product reviews across these categories, turning her findings into buying guides and face-offs. She also manages a number of gift guides on the site. Kate has a strong on-camera presence as well. She has appeared on Cheddar and Fox 5 NY to talk trending tech news. She is also regularly featured on the Tom&#039;s Guide YouTube channel, runs the &lt;a href=&quot;https://www.tiktok.com/@tomsguide?lang=en&quot;&gt;Tom&#039;s Guide TikTok account&lt;/a&gt; with over 350,000 followers, and features all the tech she&#039;s testing &lt;a href=&quot;https://www.instagram.com/katekozuch/&quot;&gt;on her Instagram&lt;/a&gt;. When she’s not filming tech videos, you can find her taking up a new sport, mastering the NYT Crossword or channeling her inner celebrity chef. Speaking of, be sure to ask her about the time Guy Fieri made her a margarita at CES, or when her video of Martha Stewart drinking a margarita went mega-viral. Clearly, Kate has a thing for culinary icons and margaritas.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/8aLWiS9kcjU7X69VwJKNxj-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tech gift guide]]></media:description>                                                            <media:text><![CDATA[Tech gift guide]]></media:text>
                                <media:title type="plain"><![CDATA[Tech gift guide]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/8aLWiS9kcjU7X69VwJKNxj-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ve rounded up the best tech gifts you can buy this year. My team and I spend all year testing top tech products, from smart home gadgets and gaming gear to audio equipment and connected fitness devices, so hopefully I can make your gift shopping a lot easier.</p><p>The great thing about the tech gifts and gadgets on my list is that there’s truly something for everyone. Shopping for an avid gamer? I’ve got the hottest consoles and game titles. Need a gift for someone always on the go? I’ll show you my favorite travel and mobile accessories. How about the home chef or fitness enthusiast? I’ve got foolproof recommendations for them, too.</p><p>I’ve put together the ultimate selection of tech gifts and, to make things simple, I’ve separated them by category and included options for every budget.</p><h3 class="article-body__section" id="section-mobile-and-tech-accessories"><span>Mobile and Tech Accessories</span></h3><div class="product"><a data-dimension112="9d98801f-ae19-4b9c-95d6-b900bc07e5dc" data-action="Deal Block" data-label="Apple AirTag" data-dimension48="Apple AirTag" data-dimension25="$24" href="https://www.amazon.com/dp/B0CWXNS552" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1498px;"><p class="vanilla-image-block" style="padding-top:100.13%;"><img id="BcBjvsdUuy3wm5KWLWHFrB" name="airtag deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BcBjvsdUuy3wm5KWLWHFrB.jpg" mos="" align="middle" fullscreen="" width="1498" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/reviews/apple-airtags" data-dimension112="9d98801f-ae19-4b9c-95d6-b900bc07e5dc" data-action="Deal Block" data-label="Apple AirTag" data-dimension48="Apple AirTag" data-dimension25="$24">Apple AirTag</a> is an excellent key finder that is extremely easy to set up and does a great job of locating your valuables. In other words, it's the perfect gift for the person who's always misplacing their keys. Someone can never have too many!<a class="view-deal button" href="https://www.amazon.com/dp/B0CWXNS552" target="_blank" rel="nofollow" data-dimension112="9d98801f-ae19-4b9c-95d6-b900bc07e5dc" data-action="Deal Block" data-label="Apple AirTag" data-dimension48="Apple AirTag" data-dimension25="$24">View Deal</a></p></div><div class="product"><a data-dimension112="c66e6c96-e1db-4591-81a7-b038cf160c4e" data-action="Deal Block" data-label="This 10,000mAh portable charger from Anker has a built-in USB-C cable, making it the perfect accessory for most smartphones and tablets. I especially like this battery pack accessory because of its battery status display." data-dimension48="This 10,000mAh portable charger from Anker has a built-in USB-C cable, making it the perfect accessory for most smartphones and tablets. I especially like this battery pack accessory because of its battery status display." data-dimension25="$29" href="https://www.amazon.com/gp/product/B0C9CPK4GL" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:816px;"><p class="vanilla-image-block" style="padding-top:95.34%;"><img id="hjMpdWYCbpeGkLffGgxka8" name="Screenshot 2023-11-24 at 9.33.52 AM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hjMpdWYCbpeGkLffGgxka8.png" mos="" align="middle" fullscreen="" width="816" height="778" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This 10,000mAh portable charger from Anker has a built-in USB-C cable, making it the perfect accessory for most smartphones and tablets. I especially like this battery pack accessory because of its battery status display.<a class="view-deal button" href="https://www.amazon.com/gp/product/B0C9CPK4GL" target="_blank" rel="nofollow" data-dimension112="c66e6c96-e1db-4591-81a7-b038cf160c4e" data-action="Deal Block" data-label="This 10,000mAh portable charger from Anker has a built-in USB-C cable, making it the perfect accessory for most smartphones and tablets. I especially like this battery pack accessory because of its battery status display." data-dimension48="This 10,000mAh portable charger from Anker has a built-in USB-C cable, making it the perfect accessory for most smartphones and tablets. I especially like this battery pack accessory because of its battery status display." data-dimension25="$29">View Deal</a></p></div><div class="product"><a data-dimension112="a6157cc8-d462-4d84-9bf5-dfe62123e354" data-action="Deal Block" data-label="For an organized charging solution, Belkin's 3-in-1 wireless charging stand is perfect gift of convenience for the person who either can't keep track of all their gadgets, or who's nightstand is always mess of charging cables. Make sure to clip the coupon for $10 off." data-dimension48="For an organized charging solution, Belkin's 3-in-1 wireless charging stand is perfect gift of convenience for the person who either can't keep track of all their gadgets, or who's nightstand is always mess of charging cables. Make sure to clip the coupon for $10 off." data-dimension25="$109" href="https://www.amazon.com/Belkin-MagSafe-Wireless-Charging-Stand/dp/B0DL86NC5Z" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:924px;"><p class="vanilla-image-block" style="padding-top:84.96%;"><img id="2VaNNmdRQes3LyzQwoBvbi" name="51e3Cc-kqCL._AC_SL1000_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2VaNNmdRQes3LyzQwoBvbi.jpg" mos="" align="middle" fullscreen="" width="924" height="785" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>For an organized charging solution, Belkin's 3-in-1 wireless charging stand is perfect gift of convenience<em> </em>for the person who either can't keep track of all their gadgets, or who's nightstand is always mess of charging cables. Make sure to clip the coupon for $10 off.<a class="view-deal button" href="https://www.amazon.com/Belkin-MagSafe-Wireless-Charging-Stand/dp/B0DL86NC5Z" target="_blank" rel="nofollow" data-dimension112="a6157cc8-d462-4d84-9bf5-dfe62123e354" data-action="Deal Block" data-label="For an organized charging solution, Belkin's 3-in-1 wireless charging stand is perfect gift of convenience for the person who either can't keep track of all their gadgets, or who's nightstand is always mess of charging cables. Make sure to clip the coupon for $10 off." data-dimension48="For an organized charging solution, Belkin's 3-in-1 wireless charging stand is perfect gift of convenience for the person who either can't keep track of all their gadgets, or who's nightstand is always mess of charging cables. Make sure to clip the coupon for $10 off." data-dimension25="$109">View Deal</a></p></div><div class="product"><a data-dimension112="d3ed9b18-2703-4607-8a1d-cd6b7d578bc9" data-action="Deal Block" data-label="The Fujifilm Instax Mini 12 is one of the best instant cameras for printing memories. Anyone can pick up this camera, shoot and print their photos with no fuss. It's endless fun in a compact package. This bundle includes everyone a new Instax user needs to get started." data-dimension48="The Fujifilm Instax Mini 12 is one of the best instant cameras for printing memories. Anyone can pick up this camera, shoot and print their photos with no fuss. It's endless fun in a compact package. This bundle includes everyone a new Instax user needs to get started." data-dimension25="$109" href="https://www.amazon.com/Fujifilm-INSTAX-Purple-Holiday-Bundle/dp/B0DFKPWWTP/" 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.33%;"><img id="XCdH3C9FGFR9F6FSMqRKwf" name="71vjrB0-ZlL._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XCdH3C9FGFR9F6FSMqRKwf.jpg" mos="" align="middle" fullscreen="" width="1500" height="905" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Fujifilm Instax Mini 12 is one of the best instant cameras for printing memories. Anyone can pick up this camera, shoot and print their photos with no fuss. It's endless fun in a compact package. This bundle includes everyone a new Instax user needs to get started.<a class="view-deal button" href="https://www.amazon.com/Fujifilm-INSTAX-Purple-Holiday-Bundle/dp/B0DFKPWWTP/" target="_blank" rel="nofollow" data-dimension112="d3ed9b18-2703-4607-8a1d-cd6b7d578bc9" data-action="Deal Block" data-label="The Fujifilm Instax Mini 12 is one of the best instant cameras for printing memories. Anyone can pick up this camera, shoot and print their photos with no fuss. It's endless fun in a compact package. This bundle includes everyone a new Instax user needs to get started." data-dimension48="The Fujifilm Instax Mini 12 is one of the best instant cameras for printing memories. Anyone can pick up this camera, shoot and print their photos with no fuss. It's endless fun in a compact package. This bundle includes everyone a new Instax user needs to get started." data-dimension25="$109">View Deal</a></p></div><div class="product"><a data-dimension112="5869c0f9-6428-4d7d-a3af-b47d4a4794fe" data-action="Deal Block" data-label="best Kindles," data-dimension48="best Kindles," data-dimension25="$159" href="https://www.amazon.com/All-new-Amazon-Kindle-Paperwhite-glare-free/dp/B0CFPJYX7P/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1465px;"><p class="vanilla-image-block" style="padding-top:102.39%;"><img id="QLdgDSHsY8qXsAtBhBiqAS" name="515vhWKOsGL._AC_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QLdgDSHsY8qXsAtBhBiqAS.jpg" mos="" align="middle" fullscreen="" width="1465" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Among all the <a href="https://www.tomsguide.com/us/best-e-readers,review-2766.html" data-dimension112="5869c0f9-6428-4d7d-a3af-b47d4a4794fe" data-action="Deal Block" data-label="best Kindles," data-dimension48="best Kindles," data-dimension25="$159">best Kindles, </a>my favorite choice for most people is the Kindle Paperwhite. The 7-inch display, water-resistant design and 12-week battery life make it a great gift. But you can read our full <a href="https://www.tomsguide.com/tablets/e-readers/kindle-paperwhite-2024-review">Kindle Paperwhite review</a> to learn more.<a class="view-deal button" href="https://www.amazon.com/All-new-Amazon-Kindle-Paperwhite-glare-free/dp/B0CFPJYX7P/" target="_blank" rel="nofollow" data-dimension112="5869c0f9-6428-4d7d-a3af-b47d4a4794fe" data-action="Deal Block" data-label="best Kindles," data-dimension48="best Kindles," data-dimension25="$159">View Deal</a></p></div><div class="product"><a data-dimension112="5cfb1ba2-eda1-4f96-ad6d-0553b333a3c3" data-action="Deal Block" data-label="Ray‑Ban Meta Gen  2" data-dimension48="Ray‑Ban Meta Gen  2" data-dimension25="$379" href="https://www.amazon.com/dp/B0FLYGRDKW" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1096px;"><p class="vanilla-image-block" style="padding-top:87.23%;"><img id="qzynQ64gtueqmge6cPzTU5" name="rbm.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qzynQ64gtueqmge6cPzTU5.png" mos="" align="middle" fullscreen="" width="1096" height="956" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>For the style‑savvy tech lover, the <a href="https://www.tomsguide.com/computing/smart-glasses/ray-ban-meta-gen-2-review" data-dimension112="5cfb1ba2-eda1-4f96-ad6d-0553b333a3c3" data-action="Deal Block" data-label="Ray‑Ban Meta Gen  2" data-dimension48="Ray‑Ban Meta Gen  2" data-dimension25="$379">Ray‑Ban Meta Gen  2</a> blends iconic sunnies with next‑level wearable smarts. With a 12‑MP ultra‑wide camera, open‑ear speakers, built‑in Meta AI and up to 8 hours of battery life, it’s like a smartphone you wear.<a class="view-deal button" href="https://www.amazon.com/dp/B0FLYGRDKW" target="_blank" rel="nofollow" data-dimension112="5cfb1ba2-eda1-4f96-ad6d-0553b333a3c3" data-action="Deal Block" data-label="Ray‑Ban Meta Gen  2" data-dimension48="Ray‑Ban Meta Gen  2" data-dimension25="$379">View Deal</a></p></div><h3 class="article-body__section" id="section-smart-home"><span>Smart Home</span></h3><div class="product"><a data-dimension112="e7cea3b9-ae90-43fd-a2c4-4d683f4d189b" data-action="Deal Block" data-label="Give the gift of effortless entertainment with Google TV this holiday season. The 65-inch display features TCL’s advanced Halo Control System for stunning picture quality and ultra-high contrast, paired with Google TV’s powerful search and access to over 10,000 apps for a premium viewing experience. With hundreds of free channels included out of the box, the TCL 65-inch is the gift that keeps on giving.Some apps, content, and/or features may not be available in all countries. Subject to availability. Subscription, download, or purchase may be required for viewing. US only." data-dimension48="Give the gift of effortless entertainment with Google TV this holiday season. The 65-inch display features TCL’s advanced Halo Control System for stunning picture quality and ultra-high contrast, paired with Google TV’s powerful search and access to over 10,000 apps for a premium viewing experience. With hundreds of free channels included out of the box, the TCL 65-inch is the gift that keeps on giving.Some apps, content, and/or features may not be available in all countries. Subject to availability. Subscription, download, or purchase may be required for viewing. US only." data-dimension25="$" href="https://www.bestbuy.com/product/tcl-65-class-qm8k-series-4k-uhd-hdr-qd-mini-led-smart-tv-with-google-tv-2025/J36QYTQZ3T?ref=186&loc=TCL_1102253" target="_blank" rel="nofollow sponsored"><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:60.78%;"><img id="M8txBoGMQKb57Q6tpFm2CA" name="tcl_qdminiled_googletv_dealblock" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/M8txBoGMQKb57Q6tpFm2CA.png" mos="" align="middle" fullscreen="" width="900" height="547" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Give the gift of effortless entertainment with Google TV this holiday season. The 65-inch display features TCL’s advanced Halo Control System for stunning picture quality and ultra-high contrast, paired with Google TV’s powerful search and access to over 10,000 apps for a premium viewing experience. With hundreds of free channels included out of the box, the TCL 65-inch is the gift that keeps on giving.</p><p></p><p><sup><em>Some apps, content, and/or features may not be available in all countries. Subject to availability. Subscription, download, or purchase may be required for viewing. US only.</em></sup><a class="view-deal button" href="https://www.bestbuy.com/product/tcl-65-class-qm8k-series-4k-uhd-hdr-qd-mini-led-smart-tv-with-google-tv-2025/J36QYTQZ3T?ref=186&loc=TCL_1102253" target="_blank" rel="nofollow sponsored" data-dimension112="e7cea3b9-ae90-43fd-a2c4-4d683f4d189b" data-action="Deal Block" data-label="Give the gift of effortless entertainment with Google TV this holiday season. The 65-inch display features TCL’s advanced Halo Control System for stunning picture quality and ultra-high contrast, paired with Google TV’s powerful search and access to over 10,000 apps for a premium viewing experience. With hundreds of free channels included out of the box, the TCL 65-inch is the gift that keeps on giving.Some apps, content, and/or features may not be available in all countries. Subject to availability. Subscription, download, or purchase may be required for viewing. US only." data-dimension48="Give the gift of effortless entertainment with Google TV this holiday season. The 65-inch display features TCL’s advanced Halo Control System for stunning picture quality and ultra-high contrast, paired with Google TV’s powerful search and access to over 10,000 apps for a premium viewing experience. With hundreds of free channels included out of the box, the TCL 65-inch is the gift that keeps on giving.Some apps, content, and/or features may not be available in all countries. Subject to availability. Subscription, download, or purchase may be required for viewing. US only." data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="cd54dbdc-3f21-4c89-8c99-d5fa11fd8eea" data-action="Deal Block" data-label="These color outdoor light bulbs make any patio feel like a party destination. I recommend paring them to the companion app for easy control. They're also weather-proof and shatter-proof, so you can leave them up year-round. There are three size options starting at 24ft." data-dimension48="These color outdoor light bulbs make any patio feel like a party destination. I recommend paring them to the companion app for easy control. They're also weather-proof and shatter-proof, so you can leave them up year-round. There are three size options starting at 24ft." data-dimension25="$34" href="https://www.amazon.com/Govee-Dimmable-Waterproof-Shatterproof-Changing/dp/B09DFGM7S2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1489px;"><p class="vanilla-image-block" style="padding-top:96.84%;"><img id="X9w7jnKh6KsVha4auTvAzY" name="71xDsFn+SrL._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/X9w7jnKh6KsVha4auTvAzY.jpg" mos="" align="middle" fullscreen="" width="1489" height="1442" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These color outdoor light bulbs make any patio feel like a party destination. I recommend paring them to the companion app for easy control. They're also weather-proof and shatter-proof, so you can leave them up year-round. There are three size options starting at 24ft.<a class="view-deal button" href="https://www.amazon.com/Govee-Dimmable-Waterproof-Shatterproof-Changing/dp/B09DFGM7S2" target="_blank" rel="nofollow" data-dimension112="cd54dbdc-3f21-4c89-8c99-d5fa11fd8eea" data-action="Deal Block" data-label="These color outdoor light bulbs make any patio feel like a party destination. I recommend paring them to the companion app for easy control. They're also weather-proof and shatter-proof, so you can leave them up year-round. There are three size options starting at 24ft." data-dimension48="These color outdoor light bulbs make any patio feel like a party destination. I recommend paring them to the companion app for easy control. They're also weather-proof and shatter-proof, so you can leave them up year-round. There are three size options starting at 24ft." data-dimension25="$34">View Deal</a></p></div><div class="product"><a data-dimension112="bc11116c-e4f2-43ad-9f22-a1e5c80bb341" data-action="Deal Block" data-label="best smart plugs" data-dimension48="best smart plugs" data-dimension25="$25" href="https://www.amazon.com/Kasa-Smart-Protector-Required-KP303/dp/B083JKSSR5" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1401px;"><p class="vanilla-image-block" style="padding-top:69.24%;"><img id="d7XGcKASeNrgN4BRizTjLJ" name="Kasa Strip.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/d7XGcKASeNrgN4BRizTjLJ.jpg" mos="" align="middle" fullscreen="" width="1401" height="970" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>We named this space-saving power strip one of the <a href="https://www.tomsguide.com/us/best-smart-plugs,review-4087.html" data-dimension112="bc11116c-e4f2-43ad-9f22-a1e5c80bb341" data-action="Deal Block" data-label="best smart plugs" data-dimension48="best smart plugs" data-dimension25="$25">best smart plugs</a> you can buy. It comes with outlets plus USB ports, and you can control each connected device individually, plus you can monitor energy usage. <a class="view-deal button" href="https://www.amazon.com/Kasa-Smart-Protector-Required-KP303/dp/B083JKSSR5" target="_blank" rel="nofollow" data-dimension112="bc11116c-e4f2-43ad-9f22-a1e5c80bb341" data-action="Deal Block" data-label="best smart plugs" data-dimension48="best smart plugs" data-dimension25="$25">View Deal</a></p></div><div class="product"><a data-dimension112="78efde6c-db34-4c1b-a966-f82512df9862" data-action="Deal Block" data-label="Echo Show 15 review" data-dimension48="Echo Show 15 review" data-dimension25="$299" href="https://www.amazon.com/dp/B0C5DPSW5Y" 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:65.20%;"><img id="cqUWj2eExAK4UAypD6XpfM" name="Amazon Echo Show 15 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/cqUWj2eExAK4UAypD6XpfM.jpg" mos="" align="middle" fullscreen="" width="1500" height="978" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Echo Show 15 has a large display and adaptive interface with widgets that lets you easily interact with smart home devices. It can even be used a digital picture frame. Read our full <a href="https://www.tomsguide.com/reviews/amazon-echo-show-15" data-dimension112="78efde6c-db34-4c1b-a966-f82512df9862" data-action="Deal Block" data-label="Echo Show 15 review" data-dimension48="Echo Show 15 review" data-dimension25="$299">Echo Show 15 review</a> to learn more.<a class="view-deal button" href="https://www.amazon.com/dp/B0C5DPSW5Y" target="_blank" rel="nofollow" data-dimension112="78efde6c-db34-4c1b-a966-f82512df9862" data-action="Deal Block" data-label="Echo Show 15 review" data-dimension48="Echo Show 15 review" data-dimension25="$299">View Deal</a></p></div><h3 class="article-body__section" id="section-audio-and-home-entertainment"><span>Audio and Home Entertainment </span></h3><div class="product"><a data-dimension112="89fc49ea-5a1a-4e7f-a9e3-e090f5cce5bd" data-action="Deal Block" data-label="JLab JBuds Mini review" data-dimension48="JLab JBuds Mini review" data-dimension25="$38" href="https://www.bestbuy.com/site/jlab-jbuds-mini-true-wireless-earbuds-black/6558680.p?skuId=6558680" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:942px;"><p class="vanilla-image-block" style="padding-top:98.51%;"><img id="MrTFwUu3FnGeJNTSCxXcb3" name="Screenshot 2023-11-29 at 3.14.10 PM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/MrTFwUu3FnGeJNTSCxXcb3.png" mos="" align="middle" fullscreen="" width="942" height="928" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>For just $39 the JBuds Mini wireless earbuds deliver strong performance, and the super-compact design will be attractive to anyone with small ears. Read our full <a href="https://www.tomsguide.com/reviews/Jlab-jbuds-mini" data-dimension112="89fc49ea-5a1a-4e7f-a9e3-e090f5cce5bd" data-action="Deal Block" data-label="JLab JBuds Mini review" data-dimension48="JLab JBuds Mini review" data-dimension25="$38">JLab JBuds Mini review</a> to learn more.<a class="view-deal button" href="https://www.bestbuy.com/site/jlab-jbuds-mini-true-wireless-earbuds-black/6558680.p?skuId=6558680" target="_blank" rel="nofollow" data-dimension112="89fc49ea-5a1a-4e7f-a9e3-e090f5cce5bd" data-action="Deal Block" data-label="JLab JBuds Mini review" data-dimension48="JLab JBuds Mini review" data-dimension25="$38">View Deal</a></p></div><div class="product"><a data-dimension112="e081ecf4-4a86-4833-b5f6-3b69142cfcf4" data-action="Deal Block" data-label="Ultimate Ears Miniroll" data-dimension48="Ultimate Ears Miniroll" data-dimension25="$59" href="https://www.amazon.com/dp/B0DCJ9N5XR/" 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="c7eZDyb9Q5kq7TU3Bc3qNR" name="UE Miniroll prod render" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/c7eZDyb9Q5kq7TU3Bc3qNR.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/audio/bluetooth-speakers/ue-miniroll-review-tiny-but-mighty" data-dimension112="e081ecf4-4a86-4833-b5f6-3b69142cfcf4" data-action="Deal Block" data-label="Ultimate Ears Miniroll" data-dimension48="Ultimate Ears Miniroll" data-dimension25="$59">Ultimate Ears Miniroll</a> is the ultimate musical companion. It’s a super small Bluetooth speaker, so it’ll fit into a backpack without a problem. It’s sturdy too, which will let it survive even the most traumatic of outdoor mishaps. <a class="view-deal button" href="https://www.amazon.com/dp/B0DCJ9N5XR/" target="_blank" rel="nofollow" data-dimension112="e081ecf4-4a86-4833-b5f6-3b69142cfcf4" data-action="Deal Block" data-label="Ultimate Ears Miniroll" data-dimension48="Ultimate Ears Miniroll" data-dimension25="$59">View Deal</a></p></div><div class="product"><a data-dimension112="80155b3c-78ab-43a1-a011-57138560b3be" data-action="Deal Block" data-label="Apple AirPods 4" data-dimension48="Apple AirPods 4" data-dimension25="$149" href="https://www.amazon.com/Apple-Headphones-Cancellation-Transparency-Personalized/dp/B0DGJ7HYG1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:225px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="SqrmdVjagrzjgHVourtnUW" name="AirPods 4.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SqrmdVjagrzjgHVourtnUW.jpg" mos="" align="middle" fullscreen="" width="225" height="225" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/earbuds/apple-airpods-4-review" data-dimension112="80155b3c-78ab-43a1-a011-57138560b3be" data-action="Deal Block" data-label="Apple AirPods 4" data-dimension48="Apple AirPods 4" data-dimension25="$149">Apple AirPods 4</a> with Active Noise Cancellation are the best entry-level AirPods to gets These relatively affordable buds work great with all Apple devices and have Find My in the charging case, so no need to worry about it getting lost.<a class="view-deal button" href="https://www.amazon.com/Apple-Headphones-Cancellation-Transparency-Personalized/dp/B0DGJ7HYG1" target="_blank" rel="nofollow" data-dimension112="80155b3c-78ab-43a1-a011-57138560b3be" data-action="Deal Block" data-label="Apple AirPods 4" data-dimension48="Apple AirPods 4" data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="1f46636c-7702-4693-806c-15fa8e834a35" data-action="Deal Block" data-label="The super compact Roku Streambar SE is a brilliant little soundbar, perfect for smaller bedroom TVs. It's also packed with Roku streaming, so you don't need a separate streaming box." data-dimension48="The super compact Roku Streambar SE is a brilliant little soundbar, perfect for smaller bedroom TVs. It's also packed with Roku streaming, so you don't need a separate streaming box." data-dimension25="$79" href="https://www.amazon.com/dp/B0CTBF4MKS/" 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:78.60%;"><img id="VBCHcPGQqKcQAhJ2TGT5X9" name="Roku Streambar SE deal.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/VBCHcPGQqKcQAhJ2TGT5X9.jpg" mos="" align="middle" fullscreen="" width="1500" height="1179" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The super compact Roku Streambar SE is a brilliant little soundbar, perfect for smaller bedroom TVs. It's also packed with Roku streaming, so you don't need a separate streaming box. <a class="view-deal button" href="https://www.amazon.com/dp/B0CTBF4MKS/" target="_blank" rel="nofollow" data-dimension112="1f46636c-7702-4693-806c-15fa8e834a35" data-action="Deal Block" data-label="The super compact Roku Streambar SE is a brilliant little soundbar, perfect for smaller bedroom TVs. It's also packed with Roku streaming, so you don't need a separate streaming box." data-dimension48="The super compact Roku Streambar SE is a brilliant little soundbar, perfect for smaller bedroom TVs. It's also packed with Roku streaming, so you don't need a separate streaming box." data-dimension25="$79">View Deal</a></p></div><div class="product"><a data-dimension112="06929504-5e97-45c5-882a-fe3d5f2d9d6c" data-action="Deal Block" data-label="Beats Pill" data-dimension48="Beats Pill" data-dimension25="$99" href="https://www.target.com/p/beats-pill-wireless-bluetooth-speaker/-/A-92595737?" 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="FPY4EtJ5Suam26ErQqMFLD" name="Beat Pill Wireless" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FPY4EtJ5Suam26ErQqMFLD.jpg" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Beats doesn't just make headphones, there's the <a href="https://www.tomsguide.com/audio/beats-pill-2024-tested-5-things-i-like-3-that-i-dont" data-dimension112="06929504-5e97-45c5-882a-fe3d5f2d9d6c" data-action="Deal Block" data-label="Beats Pill" data-dimension48="Beats Pill" data-dimension25="$99">Beats Pill</a> bluetooth speaker as well! It's a small speaker that can pump out surprisingly rich, spacious audio. Its champagne color makes it look pretty luxurious, too. <a class="view-deal button" href="https://www.target.com/p/beats-pill-wireless-bluetooth-speaker/-/A-92595737?" target="_blank" rel="nofollow" data-dimension112="06929504-5e97-45c5-882a-fe3d5f2d9d6c" data-action="Deal Block" data-label="Beats Pill" data-dimension48="Beats Pill" data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="4e23ff54-71c4-45c9-807a-92cc26a22b9f" data-action="Deal Block" data-label="Sonos Move 2 review" data-dimension48="Sonos Move 2 review" data-dimension25="$499" href="https://www.sonos.com/en-us/shop/move-2-black" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1170px;"><p class="vanilla-image-block" style="padding-top:83.59%;"><img id="YkyYZ2A934HN2ECB6WwsCG" name="Sonos Move deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YkyYZ2A934HN2ECB6WwsCG.jpg" mos="" align="middle" fullscreen="" width="1170" height="978" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This booming battery-powered smart speaker has a long-lasting battery, water-resistance and technology that auto-calibrates the sound to your surroundings. Read my full <a href="https://www.tomsguide.com/reviews/sonos-move-2" data-dimension112="4e23ff54-71c4-45c9-807a-92cc26a22b9f" data-action="Deal Block" data-label="Sonos Move 2 review" data-dimension48="Sonos Move 2 review" data-dimension25="$499">Sonos Move 2 review</a> to read why I love it.<a class="view-deal button" href="https://www.sonos.com/en-us/shop/move-2-black" target="_blank" rel="nofollow" data-dimension112="4e23ff54-71c4-45c9-807a-92cc26a22b9f" data-action="Deal Block" data-label="Sonos Move 2 review" data-dimension48="Sonos Move 2 review" data-dimension25="$499">View Deal</a></p></div><h3 class="article-body__section" id="section-gaming"><span>Gaming</span></h3><div class="product"><a data-dimension112="4e5f7856-94da-42a7-a0bb-82ad7d49f1dd" data-action="Deal Block" data-label="Meta Quest 3S review" data-dimension48="Meta Quest 3S review" data-dimension25="$299" href="https://www.amazon.com/Meta-Quest-128GB-Cardboard-Exclusive-Oculus-dp-B0F2GYMC8H/dp/B0F2GYMC8H" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="gzEKYhLQHt9zpGkHj4e8gQ" name="Meta Quest 3S" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/gzEKYhLQHt9zpGkHj4e8gQ.jpg" mos="" align="middle" fullscreen="" width="2000" height="2000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Meta Quest 3S is one of the best VR headset for gamers, with many of the Quest 3 features in a more affordable package. Read our full <a href="https://www.tomsguide.com/computing/vr-ar/meta-quest-3s-review" data-dimension112="4e5f7856-94da-42a7-a0bb-82ad7d49f1dd" data-action="Deal Block" data-label="Meta Quest 3S review" data-dimension48="Meta Quest 3S review" data-dimension25="$299">Meta Quest 3S review</a> to learn more.<a class="view-deal button" href="https://www.amazon.com/Meta-Quest-128GB-Cardboard-Exclusive-Oculus-dp-B0F2GYMC8H/dp/B0F2GYMC8H" target="_blank" rel="nofollow" data-dimension112="4e5f7856-94da-42a7-a0bb-82ad7d49f1dd" data-action="Deal Block" data-label="Meta Quest 3S review" data-dimension48="Meta Quest 3S review" data-dimension25="$299">View Deal</a></p></div><div class="product"><a data-dimension112="00b68bf4-7dbd-44e3-92ff-f80d7d7f87e5" data-action="Deal Block" data-label="Nintendo Switch 2" data-dimension48="Nintendo Switch 2" data-dimension25="$449" href="https://www.amazon.com/Nintendo-Switch-2-System/dp/B0F3GWXLTS" 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:103.11%;"><img id="JmvgbChb3JH9sDxCQuHg3L" name="switch-2-console-box" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/JmvgbChb3JH9sDxCQuHg3L.jpg" mos="" align="middle" fullscreen="" width="900" height="928" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-console-review" data-dimension112="00b68bf4-7dbd-44e3-92ff-f80d7d7f87e5" data-action="Deal Block" data-label="Nintendo Switch 2" data-dimension48="Nintendo Switch 2" data-dimension25="$449">Nintendo Switch 2</a> is the long-awaited follow-up to the best-selling hybrid console. Our Editor's Choice pick is an iterative successor to the original Nintendo Switch, offering a home console and handheld experience in one package. It packs new features, including a larger display, redesigned Joy-Cons and more internal power for increased performance.<a class="view-deal button" href="https://www.amazon.com/Nintendo-Switch-2-System/dp/B0F3GWXLTS" target="_blank" rel="nofollow" data-dimension112="00b68bf4-7dbd-44e3-92ff-f80d7d7f87e5" data-action="Deal Block" data-label="Nintendo Switch 2" data-dimension48="Nintendo Switch 2" data-dimension25="$449">View Deal</a></p></div><div class="product"><a data-dimension112="88267e17-3d96-4e12-bb08-ccb6b1512d78" data-action="Deal Block" data-label="PS5 Slim" data-dimension48="PS5 Slim" data-dimension25="$549" href="https://www.bestbuy.com/site/sony-playstation-5-slim-console-white/6566039.p?skuId=6566039" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:900px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="sk4P9G7NmAPRLPEgk4GCBd" name="ps5 slim.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/sk4P9G7NmAPRLPEgk4GCBd.jpg" mos="" align="middle" fullscreen="" width="900" height="900" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The PlayStation 5 Slim, or <a href="https://www.tomsguide.com/gaming/playstation/ps5-slim" data-dimension112="88267e17-3d96-4e12-bb08-ccb6b1512d78" data-action="Deal Block" data-label="PS5 Slim" data-dimension48="PS5 Slim" data-dimension25="$549">PS5 Slim</a> is significantly slimmer than the original. What's more, you don't have to worry about finding stock. You'll be considered a hero for wrapping this up under the tree. <a class="view-deal button" href="https://www.bestbuy.com/site/sony-playstation-5-slim-console-white/6566039.p?skuId=6566039" target="_blank" rel="nofollow" data-dimension112="88267e17-3d96-4e12-bb08-ccb6b1512d78" data-action="Deal Block" data-label="PS5 Slim" data-dimension48="PS5 Slim" data-dimension25="$549">View Deal</a></p></div><div class="product"><a data-dimension112="51f89773-d6a1-4d99-944c-0d8a6b002d14" data-action="Deal Block" data-label="Xbox Series X" data-dimension48="Xbox Series X" data-dimension25="$589" href="https://www.amazon.com/Xbox-X-1TB-Digital/dp/B0DCD9LGHY/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:822px;"><p class="vanilla-image-block" style="padding-top:93.07%;"><img id="guxCB3dAXHJAaeXpNmvrk6" name="515tLyCgdXL._AC_SL1080_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/guxCB3dAXHJAaeXpNmvrk6.jpg" mos="" align="middle" fullscreen="" width="822" height="765" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/reviews/xbox-series-x" data-dimension112="51f89773-d6a1-4d99-944c-0d8a6b002d14" data-action="Deal Block" data-label="Xbox Series X" data-dimension48="Xbox Series X" data-dimension25="$589">Xbox Series X</a> is another excellent console gift idea. The stylish black box can run games at 4K resolution at 60 frames per second without breaking a sweat. Plus, <a href="https://www.tomsguide.com/news/xbox-game-pass">Xbox Game Pass</a> is the best subscription service in gaming.<a class="view-deal button" href="https://www.amazon.com/Xbox-X-1TB-Digital/dp/B0DCD9LGHY/" target="_blank" rel="nofollow" data-dimension112="51f89773-d6a1-4d99-944c-0d8a6b002d14" data-action="Deal Block" data-label="Xbox Series X" data-dimension48="Xbox Series X" data-dimension25="$589">View Deal</a></p></div><div class="product"><a data-dimension112="18bdade9-89a5-4935-afa9-15111781ec6f" data-action="Deal Block" data-label="Lego Pac-Mac Arcade" data-dimension48="Lego Pac-Mac Arcade" data-dimension25="$268.5" href="https://www.lego.com/en-us/product/pac-man-arcade-10323" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:944px;"><p class="vanilla-image-block" style="padding-top:107.42%;"><img id="PJnYCnLWouGDbSiw6iK6pU" name="Screenshot 2023-11-29 at 3.54.54 PM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PJnYCnLWouGDbSiw6iK6pU.png" mos="" align="middle" fullscreen="" width="944" height="1014" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.lego.com/en-us/product/pac-man-arcade-10323" target="_blank" rel="nofollow" data-dimension112="18bdade9-89a5-4935-afa9-15111781ec6f" data-action="Deal Block" data-label="Lego Pac-Mac Arcade" data-dimension48="Lego Pac-Mac Arcade" data-dimension25="$268.5"><strong>Lego Pac-Mac Arcade</strong></a><br>The Lego Pac-Mac Arcade isn't technically a piece of tech, but it's a wonderful gift idea for gamers who already have all the gear they possibly need. This 2651-piece set recreates the iconic arcade game with simulated mechanics.<a class="view-deal button" href="https://www.lego.com/en-us/product/pac-man-arcade-10323" target="_blank" rel="nofollow" data-dimension112="18bdade9-89a5-4935-afa9-15111781ec6f" data-action="Deal Block" data-label="Lego Pac-Mac Arcade" data-dimension48="Lego Pac-Mac Arcade" data-dimension25="$268.5">View Deal</a></p></div><h3 class="article-body__section" id="section-lifestyle"><span>Lifestyle</span></h3><div class="product"><a data-dimension112="39e3d7fd-916e-4c0b-a9ed-399ea5c92b99" data-action="Deal Block" data-label="Every day at home can feel like a spa day with this heated foot massager machine. From deep kneading and compression to scraping and rolling, this massager can do it all. Plus, the foot sleeves are washable." data-dimension48="Every day at home can feel like a spa day with this heated foot massager machine. From deep kneading and compression to scraping and rolling, this massager can do it all. Plus, the foot sleeves are washable." data-dimension25="$109" href="https://www.amazon.com/Breo-Massager-Rolling-Kneading-Compression/dp/B085FZVLV8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1340px;"><p class="vanilla-image-block" style="padding-top:111.94%;"><img id="LzGYHhGGiWRqKfugTjAGHN" name="71R45jdf3NL._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/LzGYHhGGiWRqKfugTjAGHN.jpg" mos="" align="middle" fullscreen="" width="1340" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Every day at home can feel like a spa day with this heated foot massager machine. From deep kneading and compression to scraping and rolling, this massager can do it all. Plus, the foot sleeves are washable. <a class="view-deal button" href="https://www.amazon.com/Breo-Massager-Rolling-Kneading-Compression/dp/B085FZVLV8" target="_blank" rel="nofollow" data-dimension112="39e3d7fd-916e-4c0b-a9ed-399ea5c92b99" data-action="Deal Block" data-label="Every day at home can feel like a spa day with this heated foot massager machine. From deep kneading and compression to scraping and rolling, this massager can do it all. Plus, the foot sleeves are washable." data-dimension48="Every day at home can feel like a spa day with this heated foot massager machine. From deep kneading and compression to scraping and rolling, this massager can do it all. Plus, the foot sleeves are washable." data-dimension25="$109">View Deal</a></p></div><div class="product"><a data-dimension112="b7427e09-9582-45d9-b259-7a239e78c61b" data-action="Deal Block" data-label="Hatch Restore 3" data-dimension48="Hatch Restore 3" data-dimension25="$169" href="https://www.amazon.com/Hatch-Restore-Sunrise-Alarm-Machine/dp/B0DLLSCVZW" 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="89vBDhZ7DpH7qJ5gbWKriK" name="Hatch Restore 3 rosy deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/89vBDhZ7DpH7qJ5gbWKriK.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>For the person who hits snooze twelve times, the <a href="https://www.tomsguide.com/wellness/sleep-tech/hatch-restore-3-sunrise-alarm-clock-review" data-dimension112="b7427e09-9582-45d9-b259-7a239e78c61b" data-action="Deal Block" data-label="Hatch Restore 3" data-dimension48="Hatch Restore 3" data-dimension25="$169">Hatch Restore 3</a> is a total game-changer. It’s a sunrise alarm, sound machine, reading light and meditation coach all in one sleek bedside gadget. It lulls you to sleep with soft light and rain sounds, then wakes you gently. This is the definition of a gift that someone didn’t even know how much they needed.<a class="view-deal button" href="https://www.amazon.com/Hatch-Restore-Sunrise-Alarm-Machine/dp/B0DLLSCVZW" target="_blank" rel="nofollow" data-dimension112="b7427e09-9582-45d9-b259-7a239e78c61b" data-action="Deal Block" data-label="Hatch Restore 3" data-dimension48="Hatch Restore 3" data-dimension25="$169">View Deal</a></p></div><div class="product"><a data-dimension112="5f17965a-94f9-4a6a-85cd-0c8fe9f0505e" data-action="Deal Block" data-label="This FDA-approved LED skincare mask uses a combination of light and vibration therapy with proven benefits to enhance the appearance of skin. It's the ultimate gadget for the skin-care guru." data-dimension48="This FDA-approved LED skincare mask uses a combination of light and vibration therapy with proven benefits to enhance the appearance of skin. It's the ultimate gadget for the skin-care guru." data-dimension25="$649" href="https://www.therabody.com/us/en-us/theraface-mask.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1246px;"><p class="vanilla-image-block" style="padding-top:100.32%;"><img id="LZZ9EpLYYKXGJh2yPfJcW6" name="Screenshot 2023-12-04 at 10.08.53 AM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/LZZ9EpLYYKXGJh2yPfJcW6.png" mos="" align="middle" fullscreen="" width="1246" height="1250" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This FDA-approved LED skincare mask uses a combination of light and vibration therapy with proven benefits to enhance the appearance of skin. It's the ultimate gadget for the skin-care guru.<a class="view-deal button" href="https://www.therabody.com/us/en-us/theraface-mask.html" target="_blank" rel="nofollow" data-dimension112="5f17965a-94f9-4a6a-85cd-0c8fe9f0505e" data-action="Deal Block" data-label="This FDA-approved LED skincare mask uses a combination of light and vibration therapy with proven benefits to enhance the appearance of skin. It's the ultimate gadget for the skin-care guru." data-dimension48="This FDA-approved LED skincare mask uses a combination of light and vibration therapy with proven benefits to enhance the appearance of skin. It's the ultimate gadget for the skin-care guru." data-dimension25="$649">View Deal</a></p></div><div class="product"><a data-dimension112="64d7d7d6-1835-4741-a8e0-e44b343c8bde" data-action="Deal Block" data-label="The Dyson Airstrait isn't your average hair straightener. Its technology powers wet to dry straightening with air — that's right, no hair-damaging hot plates. It's a good alternative gift to the entire Dyson Airwrap system, too." data-dimension48="The Dyson Airstrait isn't your average hair straightener. Its technology powers wet to dry straightening with air — that's right, no hair-damaging hot plates. It's a good alternative gift to the entire Dyson Airwrap system, too." data-dimension25="$549" href="https://www.dyson.com/hair-care/hair-straighteners/airstrait/prussian-blue-rich-copper" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1252px;"><p class="vanilla-image-block" style="padding-top:99.68%;"><img id="KbacFHHKjTojyzPddnU3XZ" name="Screenshot 2023-12-04 at 10.13.15 AM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KbacFHHKjTojyzPddnU3XZ.png" mos="" align="middle" fullscreen="" width="1252" height="1248" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Dyson Airstrait isn't your average hair straightener. Its technology powers wet to dry straightening with air — that's right, no hair-damaging hot plates. It's a good alternative gift to the entire Dyson Airwrap system, too.<a class="view-deal button" href="https://www.dyson.com/hair-care/hair-straighteners/airstrait/prussian-blue-rich-copper" target="_blank" rel="nofollow" data-dimension112="64d7d7d6-1835-4741-a8e0-e44b343c8bde" data-action="Deal Block" data-label="The Dyson Airstrait isn't your average hair straightener. Its technology powers wet to dry straightening with air — that's right, no hair-damaging hot plates. It's a good alternative gift to the entire Dyson Airwrap system, too." data-dimension48="The Dyson Airstrait isn't your average hair straightener. Its technology powers wet to dry straightening with air — that's right, no hair-damaging hot plates. It's a good alternative gift to the entire Dyson Airwrap system, too." data-dimension25="$549">View Deal</a></p></div><h3 class="article-body__section" id="section-fitness"><span>Fitness</span></h3><div class="product"><a data-dimension112="7660fc39-5dc5-4957-b483-907bf9877e90" data-action="Deal Block" data-label="The Theragun Mini Plus is an ultra-portable massager that packs a serious punch. Not only does it offer percussive therapy, but it even has a heat function for even deeper relief. With multiple attachments, it’s the perfect gift for parents, athletes, travelers, or anyone who sits at a desk too long." data-dimension48="The Theragun Mini Plus is an ultra-portable massager that packs a serious punch. Not only does it offer percussive therapy, but it even has a heat function for even deeper relief. With multiple attachments, it’s the perfect gift for parents, athletes, travelers, or anyone who sits at a desk too long." data-dimension25="$279" href="https://www.amazon.com/TheraGun-Mini-Plus-Massage-Therabody/dp/B0FKCSFVLQ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1453px;"><p class="vanilla-image-block" style="padding-top:98.28%;"><img id="UHbQE8VcczdwJ9VcXUkmLK" name="61W-eX5pMDL._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/UHbQE8VcczdwJ9VcXUkmLK.jpg" mos="" align="middle" fullscreen="" width="1453" height="1428" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Theragun Mini Plus is an ultra-portable massager that packs a serious punch. Not only does it offer percussive therapy, but it even has a heat function for even deeper relief. With multiple attachments, it’s the perfect gift for parents, athletes, travelers, or anyone who sits at a desk too long.<a class="view-deal button" href="https://www.amazon.com/TheraGun-Mini-Plus-Massage-Therabody/dp/B0FKCSFVLQ" target="_blank" rel="nofollow" data-dimension112="7660fc39-5dc5-4957-b483-907bf9877e90" data-action="Deal Block" data-label="The Theragun Mini Plus is an ultra-portable massager that packs a serious punch. Not only does it offer percussive therapy, but it even has a heat function for even deeper relief. With multiple attachments, it’s the perfect gift for parents, athletes, travelers, or anyone who sits at a desk too long." data-dimension48="The Theragun Mini Plus is an ultra-portable massager that packs a serious punch. Not only does it offer percussive therapy, but it even has a heat function for even deeper relief. With multiple attachments, it’s the perfect gift for parents, athletes, travelers, or anyone who sits at a desk too long." data-dimension25="$279">View Deal</a></p></div><div class="product"><a data-dimension112="a9b06171-6ad1-4984-86fe-b5a00924e748" data-action="Deal Block" data-label="The Apple Watch 11 features an always-on screen that's 2x more scratch resistant than its predecessor. It's powered by Apple's S10 processor and packs an improved 24-hour battery, 5G radio (cellular model only), Sleep Score, and hypertension alerts. It's available in 42mm and 46mm sizes." data-dimension48="The Apple Watch 11 features an always-on screen that's 2x more scratch resistant than its predecessor. It's powered by Apple's S10 processor and packs an improved 24-hour battery, 5G radio (cellular model only), Sleep Score, and hypertension alerts. It's available in 42mm and 46mm sizes." data-dimension25="$-4.5" href="https://www.amazon.com/Apple-Watch-Smartwatch-Aluminium-Always/dp/B0FQFPB851" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1264px;"><p class="vanilla-image-block" style="padding-top:118.67%;"><img id="zpTresKtjPzk37YdCtdZd9" name="Apple Watch 11 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zpTresKtjPzk37YdCtdZd9.jpg" mos="" align="middle" fullscreen="" width="1264" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Apple Watch 11 features an always-on screen that's 2x more scratch resistant than its predecessor. It's powered by Apple's S10 processor and packs an improved 24-hour battery, 5G radio (cellular model only), Sleep Score, and hypertension alerts. It's available in 42mm and 46mm sizes. <a class="view-deal button" href="https://www.amazon.com/Apple-Watch-Smartwatch-Aluminium-Always/dp/B0FQFPB851" target="_blank" rel="nofollow" data-dimension112="a9b06171-6ad1-4984-86fe-b5a00924e748" data-action="Deal Block" data-label="The Apple Watch 11 features an always-on screen that's 2x more scratch resistant than its predecessor. It's powered by Apple's S10 processor and packs an improved 24-hour battery, 5G radio (cellular model only), Sleep Score, and hypertension alerts. It's available in 42mm and 46mm sizes." data-dimension48="The Apple Watch 11 features an always-on screen that's 2x more scratch resistant than its predecessor. It's powered by Apple's S10 processor and packs an improved 24-hour battery, 5G radio (cellular model only), Sleep Score, and hypertension alerts. It's available in 42mm and 46mm sizes." data-dimension25="$-4.5">View Deal</a></p></div><div class="product"><a data-dimension112="2349a3fc-07c8-4b1e-a611-664336f87be7" data-action="Deal Block" data-label="Oura Ring 4" data-dimension48="Oura Ring 4" data-dimension25="$349" href="https://www.amazon.com/Oura-Ring-Tracking-Wearable-Fitness/dp/B0D9WW6RPJ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:898px;"><p class="vanilla-image-block" style="padding-top:86.97%;"><img id="aLzAChgZfpqBwPA8uzTyf8" name="Oura Ring 4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/aLzAChgZfpqBwPA8uzTyf8.jpg" mos="" align="middle" fullscreen="" width="898" height="781" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/wellness/fitness-trackers/oura-ring-4-review" data-dimension112="2349a3fc-07c8-4b1e-a611-664336f87be7" data-action="Deal Block" data-label="Oura Ring 4" data-dimension48="Oura Ring 4" data-dimension25="$349">Oura Ring 4</a> is the latest smart sleep-tracking ring in the brands line up complete with a robust titanium finish to prevent tarnishing. Just Be prepared to pay a monthly subscription of $5.99 to access all features.<a class="view-deal button" href="https://www.amazon.com/Oura-Ring-Tracking-Wearable-Fitness/dp/B0D9WW6RPJ" target="_blank" rel="nofollow" data-dimension112="2349a3fc-07c8-4b1e-a611-664336f87be7" data-action="Deal Block" data-label="Oura Ring 4" data-dimension48="Oura Ring 4" data-dimension25="$349">View Deal</a></p></div><div class="product"><a data-dimension112="c393179a-263e-4c38-8ecd-914aac93f7d2" data-action="Deal Block" data-label="This is much more than a bike helmet — it features Bluetooth connectivity, built-in speakers and mic. That means you can either listen to music on rides, or intercom multiple helmets together when you ride in a group." data-dimension48="This is much more than a bike helmet — it features Bluetooth connectivity, built-in speakers and mic. That means you can either listen to music on rides, or intercom multiple helmets together when you ride in a group." data-dimension25="$159" href="https://www.amazon.com/Sena-Smart-Cycling-Helmet-Matte/dp/B09HYCPS5V/r" 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.80%;"><img id="HyZck3v83zap9ttujW8fnA" name="71LIBAmF4FL._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HyZck3v83zap9ttujW8fnA.jpg" mos="" align="middle" fullscreen="" width="1500" height="942" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is much more than a bike helmet — it features Bluetooth connectivity, built-in speakers and mic. That means you can either listen to music on rides, or intercom multiple helmets together when you ride in a group.<a class="view-deal button" href="https://www.amazon.com/Sena-Smart-Cycling-Helmet-Matte/dp/B09HYCPS5V/r" target="_blank" rel="nofollow" data-dimension112="c393179a-263e-4c38-8ecd-914aac93f7d2" data-action="Deal Block" data-label="This is much more than a bike helmet — it features Bluetooth connectivity, built-in speakers and mic. That means you can either listen to music on rides, or intercom multiple helmets together when you ride in a group." data-dimension48="This is much more than a bike helmet — it features Bluetooth connectivity, built-in speakers and mic. That means you can either listen to music on rides, or intercom multiple helmets together when you ride in a group." data-dimension25="$159">View Deal</a></p></div><h3 class="article-body__section" id="section-kitchen-gadgets"><span>Kitchen Gadgets</span></h3><div class="product"><a data-dimension112="704bd2e8-ef61-4653-a198-b3fe4b9f9e28" data-action="Deal Block" data-label="This simple espresso maker is the easiest, and most affordable, way to enjoy a Nespresso machine. This is the gift for someone who perhaps just moved into a new home, or who's aging coffee maker could use an upgrade. Bonus points if you pair it with Nespresso pods." data-dimension48="This simple espresso maker is the easiest, and most affordable, way to enjoy a Nespresso machine. This is the gift for someone who perhaps just moved into a new home, or who's aging coffee maker could use an upgrade. Bonus points if you pair it with Nespresso pods." data-dimension25="$109" href="https://www.amazon.com/Nespresso-Vertuo-Espresso-Machine-DeLonghi/dp/B0C3F2S53N" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1150px;"><p class="vanilla-image-block" style="padding-top:130.43%;"><img id="dudZTVyisLCY2YPjcBkCcg" name="71DG-qZ35sL._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dudZTVyisLCY2YPjcBkCcg.jpg" mos="" align="middle" fullscreen="" width="1150" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This simple espresso maker is the easiest, and most affordable, way to enjoy a Nespresso machine. This is the gift for someone who perhaps just moved into a new home, or who's aging coffee maker could use an upgrade. Bonus points if you pair it with Nespresso pods. <a class="view-deal button" href="https://www.amazon.com/Nespresso-Vertuo-Espresso-Machine-DeLonghi/dp/B0C3F2S53N" target="_blank" rel="nofollow" data-dimension112="704bd2e8-ef61-4653-a198-b3fe4b9f9e28" data-action="Deal Block" data-label="This simple espresso maker is the easiest, and most affordable, way to enjoy a Nespresso machine. This is the gift for someone who perhaps just moved into a new home, or who's aging coffee maker could use an upgrade. Bonus points if you pair it with Nespresso pods." data-dimension48="This simple espresso maker is the easiest, and most affordable, way to enjoy a Nespresso machine. This is the gift for someone who perhaps just moved into a new home, or who's aging coffee maker could use an upgrade. Bonus points if you pair it with Nespresso pods." data-dimension25="$109">View Deal</a></p></div><div class="product"><a data-dimension112="1b2b988b-5aaf-4979-bb35-2aa138f8145d" data-action="Deal Block" data-label="What do you get for someone who has every kitchen gadget? We'll guess they don't have a self-stirring popcorn maker. This can make up to 12 cups of popcorn at once, so family movie night is covered." data-dimension48="What do you get for someone who has every kitchen gadget? We'll guess they don't have a self-stirring popcorn maker. This can make up to 12 cups of popcorn at once, so family movie night is covered." data-dimension25="$39" href="https://www.amazon.com/DASH-SmartStoreTM-Stirring-Popcorn-Electric/dp/B0BDSXQCHR" 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:56.73%;"><img id="DvxfJA2P8jfh6ACzsMJumD" name="61KwMnIgSQL._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/DvxfJA2P8jfh6ACzsMJumD.jpg" mos="" align="middle" fullscreen="" width="1500" height="851" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>What do you get for someone who has every kitchen gadget? We'll guess they don't have a self-stirring popcorn maker. This can make up to 12 cups of popcorn at once, so family movie night is covered. <a class="view-deal button" href="https://www.amazon.com/DASH-SmartStoreTM-Stirring-Popcorn-Electric/dp/B0BDSXQCHR" target="_blank" rel="nofollow" data-dimension112="1b2b988b-5aaf-4979-bb35-2aa138f8145d" data-action="Deal Block" data-label="What do you get for someone who has every kitchen gadget? We'll guess they don't have a self-stirring popcorn maker. This can make up to 12 cups of popcorn at once, so family movie night is covered." data-dimension48="What do you get for someone who has every kitchen gadget? We'll guess they don't have a self-stirring popcorn maker. This can make up to 12 cups of popcorn at once, so family movie night is covered." data-dimension25="$39">View Deal</a></p></div><div class="product"><a data-dimension112="956523e5-2b72-42ba-a114-ae1633e1e899" data-action="Deal Block" data-label="The Meater Pro is the best wireless thermometer for monitoring the temperature of any kind of protein in any kind of appliance. We think it's great for people who love their outdoor grills and smokers." data-dimension48="The Meater Pro is the best wireless thermometer for monitoring the temperature of any kind of protein in any kind of appliance. We think it's great for people who love their outdoor grills and smokers." data-dimension25="$129" href="https://store-us.meater.com/products/meater-pro" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1098px;"><p class="vanilla-image-block" style="padding-top:94.35%;"><img id="AHpeKryHYm66UQA3VP2LqL" name="Screenshot 2023-11-29 at 4.29.26 PM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AHpeKryHYm66UQA3VP2LqL.png" mos="" align="middle" fullscreen="" width="1098" height="1036" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Meater Pro is the best wireless thermometer for monitoring the temperature of any kind of protein in any kind of appliance. We think it's great for people who love their outdoor grills and smokers. <a class="view-deal button" href="https://store-us.meater.com/products/meater-pro" target="_blank" rel="nofollow" data-dimension112="956523e5-2b72-42ba-a114-ae1633e1e899" data-action="Deal Block" data-label="The Meater Pro is the best wireless thermometer for monitoring the temperature of any kind of protein in any kind of appliance. We think it's great for people who love their outdoor grills and smokers." data-dimension48="The Meater Pro is the best wireless thermometer for monitoring the temperature of any kind of protein in any kind of appliance. We think it's great for people who love their outdoor grills and smokers." data-dimension25="$129">View Deal</a></p></div><div class="product"><a data-dimension112="c522ad73-e978-4f64-bc03-a6c161a3c32d" data-action="Deal Block" data-label="Ninja Woodfire Outdoor Oven" data-dimension48="Ninja Woodfire Outdoor Oven" data-dimension25="$299" href="https://www.amazon.com/Ninja-Woodfire-Technology-terracotta-OO101/dp/B0C6BQVDX3/" 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:90.20%;"><img id="C5KWDYUzjspNSP6tT8AAQP" name="81IeXOFExqL._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/C5KWDYUzjspNSP6tT8AAQP.jpg" mos="" align="middle" fullscreen="" width="1500" height="1353" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/reviews/ninja-woodfire-outdoor-oven" data-dimension112="c522ad73-e978-4f64-bc03-a6c161a3c32d" data-action="Deal Block" data-label="Ninja Woodfire Outdoor Oven" data-dimension48="Ninja Woodfire Outdoor Oven" data-dimension25="$299">Ninja Woodfire Outdoor Oven</a> is great for making pizzas, smoking wings and many things in between. It's a stellar addition to any outdoor kitchen, but it's also a good fit for small patios and balconies.<a class="view-deal button" href="https://www.amazon.com/Ninja-Woodfire-Technology-terracotta-OO101/dp/B0C6BQVDX3/" target="_blank" rel="nofollow" data-dimension112="c522ad73-e978-4f64-bc03-a6c161a3c32d" data-action="Deal Block" data-label="Ninja Woodfire Outdoor Oven" data-dimension48="Ninja Woodfire Outdoor Oven" data-dimension25="$299">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 35 best stocking stuffers for everyone on your shopping list ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/35-best-stocking-stuffers-for-everyone-on-your-shopping-list</link>
                                                                            <description>
                            <![CDATA[ Don't forget stocking stuffers this holiday season! Here are our favorite small gifting items. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">surkgbA9wjUyUR65Bs5Tna</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/3jtmSt8VAnP6BPtTc2M97R-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 04 Nov 2025 17:20:27 +0000</pubDate>                                                                                                                                <updated>Mon, 10 Nov 2025 16:56:14 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Olivia Halevy ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/YAg7Fmh9dGKbg3hULBMWiU.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Olivia is a Deals Writer at Tom’s Guide. She loves all things lifestyle, shopping and sourcing the best deals from some of the top brands, retailers and websites around. From fashion and beauty to smart home and tech, she has an eye for finding practical, stylish, and reasonably-priced items that help make life simpler (and a little more aesthetically-pleasing).&amp;nbsp;Olivia has over five years of experience writing lifestyle, commerce, and branded content for &lt;a href=&quot;http://patch.com/&quot;&gt;Patch.com&lt;/a&gt;. She&#039;s covered major shopping holidays like Amazon Prime Day, Black Friday and Cyber Monday. In her free time, she enjoys trying out new exercise classes, binge-watching the latest viral TV shows, cooking, spending time with family and taking long walks with her dog, Gus.&amp;nbsp;&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/3jtmSt8VAnP6BPtTc2M97R-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[gift guide]]></media:description>                                                            <media:text><![CDATA[gift guide]]></media:text>
                                <media:title type="plain"><![CDATA[gift guide]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/3jtmSt8VAnP6BPtTc2M97R-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Best stocking stuffers</div><div class="fancy_box_body"><p class="fancy-box__body-text">1. <a data-analytics-id="inline-link" href="#section-editor-s-choice">Editor's Choice</a><br>2. <a data-analytics-id="inline-link" href="#section-tech">Tech</a><br>3. <a data-analytics-id="inline-link" href="#section-home">Home</a><br>4. <a data-analytics-id="inline-link" href="#section-fitness">Fitness</a><br>5. <a data-analytics-id="inline-link" href="#section-food">Food</a><br>6. <a data-analytics-id="inline-link" href="#section-toys-and-games">Toys and Games</a></p></div></div><p>Stocking stuffers may be considered the underdogs of holiday gifting — but if you choose the right items, they could end up stealing the show. That’s certainly the case for the best stocking stuffers you can find this holiday season. There’s something small-but-mighty for every person on your list (and for your budget.)</p><p>To make things simpler, we've rounded up our favorite stocking stuffers that are sure make a big impression. From tech gadgets and home accessories to exciting games and delectable treats, these tiny treasures prove that the best gifts really do come in small packages. </p><h3 class="article-body__section" id="section-editor-s-choice"><span>Editor's Choice</span></h3><div class="product"><a data-dimension112="69ec5aa7-0b04-4719-add7-1579b648c5a9" data-action="Deal Block" data-label="Apple AirTag" data-dimension48="Apple AirTag" data-dimension25="$" href="https://www.amazon.com/Apple-MX532LL-A-AirTag/dp/B0CWXNS552" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1498px;"><p class="vanilla-image-block" style="padding-top:100.13%;"><img id="BcBjvsdUuy3wm5KWLWHFrB" name="airtag deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BcBjvsdUuy3wm5KWLWHFrB.jpg" mos="" align="middle" fullscreen="" width="1498" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Apple-MX532LL-A-AirTag/dp/B0CWXNS552" target="_blank" rel="nofollow" data-dimension112="69ec5aa7-0b04-4719-add7-1579b648c5a9" data-action="Deal Block" data-label="Apple AirTag" data-dimension48="Apple AirTag" data-dimension25="$"><strong>Apple AirTag</strong></a><br>The Apple AirTag is an excellent key finder that is extremely easy to set up and does a great job of locating your valuables. It's also the perfect gift for someone who misplaces their belongings. What more could you ask for? <a class="view-deal button" href="https://www.amazon.com/Apple-MX532LL-A-AirTag/dp/B0CWXNS552" target="_blank" rel="nofollow" data-dimension112="69ec5aa7-0b04-4719-add7-1579b648c5a9" data-action="Deal Block" data-label="Apple AirTag" data-dimension48="Apple AirTag" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="b91f1f3a-9458-43a7-8612-15eb8e7fab36" data-action="Deal Block" data-label="Patchology Under Eye PatchesDid someone say spa day? These hydrating eye patches&nbsp;are exactly what the doctor ordered for rejuvenation. This set of cooling eye gels with hyaluronic acid feature strawberry extract, feeling like a glass of refreshing rose for your face. The package comes with a set of five eye patches, which you can keep together or distribute across several stockings. As a bonus, remind your recipient to put them in the fridge before use. Trust us. Patchology Under Eye Patches" data-dimension48="Patchology Under Eye PatchesDid someone say spa day? These hydrating eye patches&nbsp;are exactly what the doctor ordered for rejuvenation. This set of cooling eye gels with hyaluronic acid feature strawberry extract, feeling like a glass of refreshing rose for your face. The package comes with a set of five eye patches, which you can keep together or distribute across several stockings. As a bonus, remind your recipient to put them in the fridge before use. Trust us. Patchology Under Eye Patches" href="https://www.amazon.com/Patchology-Serve-Chilled-Ros%C3%A9-Hyaluronic/dp/B08YKG1D87" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Re9EcvctBZyb7cudp3i4Ej" name="Patchology" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Re9EcvctBZyb7cudp3i4Ej.jpg" mos="" align="middle" fullscreen="" width="679" height="679" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.amazon.com/Patchology-Serve-Chilled-Ros%C3%A9-Hyaluronic/dp/B08YKG1D87" target="_blank" rel="nofollow" data-dimension112="b91f1f3a-9458-43a7-8612-15eb8e7fab36" data-action="Deal Block" data-label="Patchology Under Eye PatchesDid someone say spa day? These hydrating eye patches&nbsp;are exactly what the doctor ordered for rejuvenation. This set of cooling eye gels with hyaluronic acid feature strawberry extract, feeling like a glass of refreshing rose for your face. The package comes with a set of five eye patches, which you can keep together or distribute across several stockings. As a bonus, remind your recipient to put them in the fridge before use. Trust us. Patchology Under Eye Patches" data-dimension48="Patchology Under Eye PatchesDid someone say spa day? These hydrating eye patches&nbsp;are exactly what the doctor ordered for rejuvenation. This set of cooling eye gels with hyaluronic acid feature strawberry extract, feeling like a glass of refreshing rose for your face. The package comes with a set of five eye patches, which you can keep together or distribute across several stockings. As a bonus, remind your recipient to put them in the fridge before use. Trust us. Patchology Under Eye Patches" data-dimension25=""><strong>Patchology Under Eye Patches</strong></a><br>Did someone say spa day? These hydrating eye patches are exactly what the doctor ordered for rejuvenation. This set of cooling eye gels with hyaluronic acid feature strawberry extract, feeling like a glass of refreshing rose for your face. The package comes with a set of five eye patches, which you can keep together or distribute across several stockings. As a bonus, remind your recipient to put them in the fridge before use. Trust us.<a class="view-deal button" href="https://www.amazon.com/Patchology-Serve-Chilled-Ros%C3%A9-Hyaluronic/dp/B08YKG1D87" target="_blank" rel="nofollow" data-dimension112="b91f1f3a-9458-43a7-8612-15eb8e7fab36" data-action="Deal Block" data-label="Patchology Under Eye PatchesDid someone say spa day? These hydrating eye patches&nbsp;are exactly what the doctor ordered for rejuvenation. This set of cooling eye gels with hyaluronic acid feature strawberry extract, feeling like a glass of refreshing rose for your face. The package comes with a set of five eye patches, which you can keep together or distribute across several stockings. As a bonus, remind your recipient to put them in the fridge before use. Trust us. Patchology Under Eye Patches" data-dimension48="Patchology Under Eye PatchesDid someone say spa day? These hydrating eye patches&nbsp;are exactly what the doctor ordered for rejuvenation. This set of cooling eye gels with hyaluronic acid feature strawberry extract, feeling like a glass of refreshing rose for your face. The package comes with a set of five eye patches, which you can keep together or distribute across several stockings. As a bonus, remind your recipient to put them in the fridge before use. Trust us. Patchology Under Eye Patches" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="e861898a-0551-47f9-abef-99b78a7f23e3" data-action="Deal Block" data-label="Google TV Streamer (4K)" data-dimension48="Google TV Streamer (4K)" data-dimension25="$" target="_blank" rel="nofollow sponsored"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:960px;"><p class="vanilla-image-block" style="padding-top:102.08%;"><img id="qkofWzvajkY96zbPKguAic" name="Streamer (4K) - dealblock" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qkofWzvajkY96zbPKguAic.png" mos="" align="middle" fullscreen="" width="960" height="980" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://store.google.com/product/google_tv_streamer?hl=en-US&utm_source=toms_guide&utm_medium=referral&utm_campaign=GS108608" target="_blank" rel="nofollow sponsored" data-dimension112="e861898a-0551-47f9-abef-99b78a7f23e3" data-action="Deal Block" data-label="Google TV Streamer (4K)" data-dimension48="Google TV Streamer (4K)" data-dimension25="$"><strong>Google TV Streamer (4K)</strong></a><br>Showstopping gifts can be stocking stuffers, too. The Google TV Streamer is a great way to give the gift of effortless entertainment, packed with more than 10,000 entertainment apps and hundreds of free channels. With 4K HDR video quality, supercharged performance for smooth navigation and beautiful design that blends with any decor, the Google TV Streamer is proof that big things really do come in small packages.</p><p> </p><p><sup><em>Some apps, content, and/or features may not be available in all countries. Subject to availability. Subscription, download, or purchase may be required for viewing. To view content in 4K, a 4K-capable TV and reliable broadband internet connection are required.</em></sup><a class="view-deal button" href="" target="_blank" rel="nofollow sponsored" data-dimension112="e861898a-0551-47f9-abef-99b78a7f23e3" data-action="Deal Block" data-label="Google TV Streamer (4K)" data-dimension48="Google TV Streamer (4K)" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="049f3c3d-d97e-48e4-a1d4-b0bea2a1405f" data-action="Deal Block" data-label="HP Sprocket Photo PrinterOf all the best stocking stuffers, the&nbsp;HP Sprocket Photo Printer&nbsp;is the top choice for people who will love bringing their images to life. This device instantly prints 2x3 sticky-backed images from a compatible smartphone app. In the app, you can edit photos with fun stickers, frames and filters before you print, making the stickers cute accessories for stationary, scrapbooking, phone cases and more. HP Sprocket Photo Printer" data-dimension48="HP Sprocket Photo PrinterOf all the best stocking stuffers, the&nbsp;HP Sprocket Photo Printer&nbsp;is the top choice for people who will love bringing their images to life. This device instantly prints 2x3 sticky-backed images from a compatible smartphone app. In the app, you can edit photos with fun stickers, frames and filters before you print, making the stickers cute accessories for stationary, scrapbooking, phone cases and more. HP Sprocket Photo Printer" href="https://www.amazon.com/HP-Sprocket-Portable-Photo-Printer/dp/B07GFP7H8C" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:146.39%;"><img id="kMXEe3Jyosk4zcUa7LsEoB" name="HP Sprocket" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kMXEe3Jyosk4zcUa7LsEoB.jpg" mos="" align="middle" fullscreen="" width="679" height="994" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.amazon.com/HP-Sprocket-Portable-Photo-Printer/dp/B07GFP7H8C" target="_blank" rel="nofollow" data-dimension112="049f3c3d-d97e-48e4-a1d4-b0bea2a1405f" data-action="Deal Block" data-label="HP Sprocket Photo PrinterOf all the best stocking stuffers, the&nbsp;HP Sprocket Photo Printer&nbsp;is the top choice for people who will love bringing their images to life. This device instantly prints 2x3 sticky-backed images from a compatible smartphone app. In the app, you can edit photos with fun stickers, frames and filters before you print, making the stickers cute accessories for stationary, scrapbooking, phone cases and more. HP Sprocket Photo Printer" data-dimension48="HP Sprocket Photo PrinterOf all the best stocking stuffers, the&nbsp;HP Sprocket Photo Printer&nbsp;is the top choice for people who will love bringing their images to life. This device instantly prints 2x3 sticky-backed images from a compatible smartphone app. In the app, you can edit photos with fun stickers, frames and filters before you print, making the stickers cute accessories for stationary, scrapbooking, phone cases and more. HP Sprocket Photo Printer" data-dimension25=""><strong>HP Sprocket Photo Printer</strong></a><br>Of all the best stocking stuffers, the HP Sprocket Photo Printer is the top choice for people who will love bringing their images to life. This device instantly prints 2x3 sticky-backed images from a compatible smartphone app. In the app, you can edit photos with fun stickers, frames and filters before you print, making the stickers cute accessories for stationary, scrapbooking, phone cases and more. <a class="view-deal button" href="https://www.amazon.com/HP-Sprocket-Portable-Photo-Printer/dp/B07GFP7H8C" target="_blank" rel="nofollow" data-dimension112="049f3c3d-d97e-48e4-a1d4-b0bea2a1405f" data-action="Deal Block" data-label="HP Sprocket Photo PrinterOf all the best stocking stuffers, the&nbsp;HP Sprocket Photo Printer&nbsp;is the top choice for people who will love bringing their images to life. This device instantly prints 2x3 sticky-backed images from a compatible smartphone app. In the app, you can edit photos with fun stickers, frames and filters before you print, making the stickers cute accessories for stationary, scrapbooking, phone cases and more. HP Sprocket Photo Printer" data-dimension48="HP Sprocket Photo PrinterOf all the best stocking stuffers, the&nbsp;HP Sprocket Photo Printer&nbsp;is the top choice for people who will love bringing their images to life. This device instantly prints 2x3 sticky-backed images from a compatible smartphone app. In the app, you can edit photos with fun stickers, frames and filters before you print, making the stickers cute accessories for stationary, scrapbooking, phone cases and more. HP Sprocket Photo Printer" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="8a8eb7cd-bde9-443f-9653-e71a8db71532" data-action="Deal Block" data-label="Rambler Straw MugThe 42 oz Rambler Straw Mug is the perfect stocking stuffer for someone who is always on the go. With its large handle and straw, it's one of the most comfortable Yeti mugs to drink from and it has the capacity to keep you hydrated all day. Rambler Straw Mug" data-dimension48="Rambler Straw MugThe 42 oz Rambler Straw Mug is the perfect stocking stuffer for someone who is always on the go. With its large handle and straw, it's one of the most comfortable Yeti mugs to drink from and it has the capacity to keep you hydrated all day. Rambler Straw Mug" data-dimension25="$" href="https://www.amazon.com/YETI-Rambler-Tumbler-Insulated-Stainless/dp/B0CMJPRZKK?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:220.18%;"><img id="tzPJsaQMZoRrMjoBehVacQ" name="navy yeti" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tzPJsaQMZoRrMjoBehVacQ.jpg" mos="" align="middle" fullscreen="" width="679" height="1495" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.amazon.com/dp/B0CMJPRZKK/" target="_blank" rel="nofollow" data-dimension112="8a8eb7cd-bde9-443f-9653-e71a8db71532" data-action="Deal Block" data-label="Rambler Straw MugThe 42 oz Rambler Straw Mug is the perfect stocking stuffer for someone who is always on the go. With its large handle and straw, it's one of the most comfortable Yeti mugs to drink from and it has the capacity to keep you hydrated all day. Rambler Straw Mug" data-dimension48="Rambler Straw MugThe 42 oz Rambler Straw Mug is the perfect stocking stuffer for someone who is always on the go. With its large handle and straw, it's one of the most comfortable Yeti mugs to drink from and it has the capacity to keep you hydrated all day. Rambler Straw Mug" data-dimension25="$"><strong>Rambler Straw Mug</strong></a><br>The 42 oz Rambler Straw Mug is the perfect stocking stuffer for someone who is always on the go. With its large handle and straw, it's one of the most comfortable Yeti mugs to drink from and it has the capacity to keep you hydrated all day.<a class="view-deal button" href="https://www.amazon.com/YETI-Rambler-Tumbler-Insulated-Stainless/dp/B0CMJPRZKK?" target="_blank" rel="nofollow" data-dimension112="8a8eb7cd-bde9-443f-9653-e71a8db71532" data-action="Deal Block" data-label="Rambler Straw MugThe 42 oz Rambler Straw Mug is the perfect stocking stuffer for someone who is always on the go. With its large handle and straw, it's one of the most comfortable Yeti mugs to drink from and it has the capacity to keep you hydrated all day. Rambler Straw Mug" data-dimension48="Rambler Straw MugThe 42 oz Rambler Straw Mug is the perfect stocking stuffer for someone who is always on the go. With its large handle and straw, it's one of the most comfortable Yeti mugs to drink from and it has the capacity to keep you hydrated all day. Rambler Straw Mug" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="57210d47-a33a-458b-a57d-9776c800ca2e" data-action="Deal Block" data-label="Carhartt Tonal Patch BeanieWarmth is a must during the holiday season. But as the temperatures drop, style doesn't need to suffer. The&nbsp;Carhartt Tonal Patch Beanie&nbsp;is one of the best-looking knit hats you can buy now. Available in a range of colors, this beanie delivers the ultimate dose of monochrome. It's super stretchy, yet fits securely, meaning it should be comfortable for all head shapes and sizes. This is one of the best stocking stuffers that you could give to practically anyone on your list. Carhartt Tonal Patch Beanie" data-dimension48="Carhartt Tonal Patch BeanieWarmth is a must during the holiday season. But as the temperatures drop, style doesn't need to suffer. The&nbsp;Carhartt Tonal Patch Beanie&nbsp;is one of the best-looking knit hats you can buy now. Available in a range of colors, this beanie delivers the ultimate dose of monochrome. It's super stretchy, yet fits securely, meaning it should be comfortable for all head shapes and sizes. This is one of the best stocking stuffers that you could give to practically anyone on your list. Carhartt Tonal Patch Beanie" href="https://www.carhartt.com/product/101070/tonal-patch-beanie?" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:798px;"><p class="vanilla-image-block" style="padding-top:100.25%;"><img id="JpKa6XQFxpiQq4s68P2bdR" name="Carhartt beanie" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/JpKa6XQFxpiQq4s68P2bdR.jpg" mos="" align="middle" fullscreen="" width="798" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.carhartt.com/product/101070/tonal-patch-beanie?" target="_blank" rel="nofollow" data-dimension112="57210d47-a33a-458b-a57d-9776c800ca2e" data-action="Deal Block" data-label="Carhartt Tonal Patch BeanieWarmth is a must during the holiday season. But as the temperatures drop, style doesn't need to suffer. The&nbsp;Carhartt Tonal Patch Beanie&nbsp;is one of the best-looking knit hats you can buy now. Available in a range of colors, this beanie delivers the ultimate dose of monochrome. It's super stretchy, yet fits securely, meaning it should be comfortable for all head shapes and sizes. This is one of the best stocking stuffers that you could give to practically anyone on your list. Carhartt Tonal Patch Beanie" data-dimension48="Carhartt Tonal Patch BeanieWarmth is a must during the holiday season. But as the temperatures drop, style doesn't need to suffer. The&nbsp;Carhartt Tonal Patch Beanie&nbsp;is one of the best-looking knit hats you can buy now. Available in a range of colors, this beanie delivers the ultimate dose of monochrome. It's super stretchy, yet fits securely, meaning it should be comfortable for all head shapes and sizes. This is one of the best stocking stuffers that you could give to practically anyone on your list. Carhartt Tonal Patch Beanie" data-dimension25=""><strong>Carhartt Tonal Patch Beanie</strong></a><br>Warmth is a must during the holiday season. But as the temperatures drop, style doesn't need to suffer. The Carhartt Tonal Patch Beanie is one of the best-looking knit hats you can buy now. Available in a range of colors, this beanie delivers the ultimate dose of monochrome. It's super stretchy, yet fits securely, meaning it should be comfortable for all head shapes and sizes. This is one of the best stocking stuffers that you could give to practically anyone on your list.<a class="view-deal button" href="https://www.carhartt.com/product/101070/tonal-patch-beanie?" target="_blank" rel="nofollow" data-dimension112="57210d47-a33a-458b-a57d-9776c800ca2e" data-action="Deal Block" data-label="Carhartt Tonal Patch BeanieWarmth is a must during the holiday season. But as the temperatures drop, style doesn't need to suffer. The&nbsp;Carhartt Tonal Patch Beanie&nbsp;is one of the best-looking knit hats you can buy now. Available in a range of colors, this beanie delivers the ultimate dose of monochrome. It's super stretchy, yet fits securely, meaning it should be comfortable for all head shapes and sizes. This is one of the best stocking stuffers that you could give to practically anyone on your list. Carhartt Tonal Patch Beanie" data-dimension48="Carhartt Tonal Patch BeanieWarmth is a must during the holiday season. But as the temperatures drop, style doesn't need to suffer. The&nbsp;Carhartt Tonal Patch Beanie&nbsp;is one of the best-looking knit hats you can buy now. Available in a range of colors, this beanie delivers the ultimate dose of monochrome. It's super stretchy, yet fits securely, meaning it should be comfortable for all head shapes and sizes. This is one of the best stocking stuffers that you could give to practically anyone on your list. Carhartt Tonal Patch Beanie" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="0e559725-f6c8-4750-ae2d-ad5cc93e875c" data-action="Deal Block" data-label="Crest 3D WhitestripsIf you have a coffee, tea or red wine drinker on your list, they will certainly appreciate this gift. Get professional-level teeth whitening from the comforts of your own home with these whitening strips. By using the strips for an hour daily, you can remove up to 14 years of teeth stains. Crest claims you'll start seeing results in just three days. Crest 3D Whitestrips" data-dimension48="Crest 3D WhitestripsIf you have a coffee, tea or red wine drinker on your list, they will certainly appreciate this gift. Get professional-level teeth whitening from the comforts of your own home with these whitening strips. By using the strips for an hour daily, you can remove up to 14 years of teeth stains. Crest claims you'll start seeing results in just three days. Crest 3D Whitestrips" data-dimension25="$" href="https://www.amazon.com/Crest-Professional-Whitestrips-Whitening-Treatments/dp/B00AHAWWO0" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:300px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="HDaSRKYnH7fFnT8c596Z4b" name="Crest 3D white strips.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HDaSRKYnH7fFnT8c596Z4b.jpg" mos="" align="middle" fullscreen="" width="300" height="300" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.amazon.com/Crest-Professional-Whitestrips-Whitening-Treatments/dp/B00AHAWWO0" target="_blank" rel="nofollow" data-dimension112="0e559725-f6c8-4750-ae2d-ad5cc93e875c" data-action="Deal Block" data-label="Crest 3D WhitestripsIf you have a coffee, tea or red wine drinker on your list, they will certainly appreciate this gift. Get professional-level teeth whitening from the comforts of your own home with these whitening strips. By using the strips for an hour daily, you can remove up to 14 years of teeth stains. Crest claims you'll start seeing results in just three days. Crest 3D Whitestrips" data-dimension48="Crest 3D WhitestripsIf you have a coffee, tea or red wine drinker on your list, they will certainly appreciate this gift. Get professional-level teeth whitening from the comforts of your own home with these whitening strips. By using the strips for an hour daily, you can remove up to 14 years of teeth stains. Crest claims you'll start seeing results in just three days. Crest 3D Whitestrips" data-dimension25="$"><strong>Crest 3D Whitestrips</strong></a><br>If you have a coffee, tea or red wine drinker on your list, they will certainly appreciate this gift. Get professional-level teeth whitening from the comforts of your own home with these whitening strips. By using the strips for an hour daily, you can remove up to 14 years of teeth stains. Crest claims you'll start seeing results in just three days.<a class="view-deal button" href="https://www.amazon.com/Crest-Professional-Whitestrips-Whitening-Treatments/dp/B00AHAWWO0" target="_blank" rel="nofollow" data-dimension112="0e559725-f6c8-4750-ae2d-ad5cc93e875c" data-action="Deal Block" data-label="Crest 3D WhitestripsIf you have a coffee, tea or red wine drinker on your list, they will certainly appreciate this gift. Get professional-level teeth whitening from the comforts of your own home with these whitening strips. By using the strips for an hour daily, you can remove up to 14 years of teeth stains. Crest claims you'll start seeing results in just three days. Crest 3D Whitestrips" data-dimension48="Crest 3D WhitestripsIf you have a coffee, tea or red wine drinker on your list, they will certainly appreciate this gift. Get professional-level teeth whitening from the comforts of your own home with these whitening strips. By using the strips for an hour daily, you can remove up to 14 years of teeth stains. Crest claims you'll start seeing results in just three days. Crest 3D Whitestrips" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="17185451-515c-4603-b989-a798969c4b9b" data-action="Deal Block" data-label="Mzoo Sleep MaskThe MZOO sleep mask is an Amazon best seller sporting over 73,500 perfect reviews from customers who give it the "night shifter seal of approval," and say it provides 100% darkness while the pressure it puts on the eyes is "just perfect." This sleep mask is perfect for the traveler or jet-setter in your life. Mzoo Sleep Mask" data-dimension48="Mzoo Sleep MaskThe MZOO sleep mask is an Amazon best seller sporting over 73,500 perfect reviews from customers who give it the "night shifter seal of approval," and say it provides 100% darkness while the pressure it puts on the eyes is "just perfect." This sleep mask is perfect for the traveler or jet-setter in your life. Mzoo Sleep Mask" data-dimension25="$" href="https://www.amazon.com/Contoured-Sleeping-Blindfold-Concave-Meditation/dp/B07KC5DWCC" 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="fXbHao5JY334kA2oEoVDNW" name="MZOO sleep mask" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/fXbHao5JY334kA2oEoVDNW.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.amazon.com/Contoured-Sleeping-Blindfold-Concave-Meditation/dp/B07KC5DWCC" target="_blank" rel="nofollow" data-dimension112="17185451-515c-4603-b989-a798969c4b9b" data-action="Deal Block" data-label='Mzoo Sleep MaskThe MZOO sleep mask is an Amazon best seller sporting over 73,500 perfect reviews from customers who give it the "night shifter seal of approval," and say it provides 100% darkness while the pressure it puts on the eyes is "just perfect." This sleep mask is perfect for the traveler or jet-setter in your life. Mzoo Sleep Mask' data-dimension48='Mzoo Sleep MaskThe MZOO sleep mask is an Amazon best seller sporting over 73,500 perfect reviews from customers who give it the "night shifter seal of approval," and say it provides 100% darkness while the pressure it puts on the eyes is "just perfect." This sleep mask is perfect for the traveler or jet-setter in your life. Mzoo Sleep Mask' data-dimension25="$"><strong>Mzoo Sleep Mask</strong></a><br>The MZOO sleep mask is an Amazon best seller sporting over 73,500 perfect reviews from customers who give it the "night shifter seal of approval," and say it provides 100% darkness while the pressure it puts on the eyes is "just perfect." This sleep mask is perfect for the traveler or jet-setter in your life. <a class="view-deal button" href="https://www.amazon.com/Contoured-Sleeping-Blindfold-Concave-Meditation/dp/B07KC5DWCC" target="_blank" rel="nofollow" data-dimension112="17185451-515c-4603-b989-a798969c4b9b" data-action="Deal Block" data-label="Mzoo Sleep MaskThe MZOO sleep mask is an Amazon best seller sporting over 73,500 perfect reviews from customers who give it the "night shifter seal of approval," and say it provides 100% darkness while the pressure it puts on the eyes is "just perfect." This sleep mask is perfect for the traveler or jet-setter in your life. Mzoo Sleep Mask" data-dimension48="Mzoo Sleep MaskThe MZOO sleep mask is an Amazon best seller sporting over 73,500 perfect reviews from customers who give it the "night shifter seal of approval," and say it provides 100% darkness while the pressure it puts on the eyes is "just perfect." This sleep mask is perfect for the traveler or jet-setter in your life. Mzoo Sleep Mask" data-dimension25="$">View Deal</a></p></div><h3 class="article-body__section" id="section-tech"><span>Tech</span></h3><div class="product"><a data-dimension112="8a98c96e-6d69-46cf-99ab-500f25bee778" data-action="Deal Block" data-label="Blink Mini 2" data-dimension48="Blink Mini 2" data-dimension25="$" href="https://www.amazon.com/Blink-Mini-2-Camera-Black/dp/B0BWX39R5W/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1154px;"><p class="vanilla-image-block" style="padding-top:97.75%;"><img id="SyfV8hzWH34Xp3XXDRUUC" name="Screenshot 2024-11-22 at 11.43.03.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SyfV8hzWH34Xp3XXDRUUC.png" mos="" align="middle" fullscreen="" width="1154" height="1128" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Blink-Mini-2-Camera-Black/dp/B0BWX39R5W/" target="_blank" rel="nofollow" data-dimension112="8a98c96e-6d69-46cf-99ab-500f25bee778" data-action="Deal Block" data-label="Blink Mini 2" data-dimension48="Blink Mini 2" data-dimension25="$"><strong>Blink Mini 2</strong></a><br>The <a href="https://www.tomsguide.com/blink-mini-2-review">Blink Mini 2</a> is the 2nd generation of home security cameras that offer Day and Night HD views of your home, alongside two audio and motion detection. On top of that, the Blink Mini 2 offers enhanced motion detection and an LED spotlight.<a class="view-deal button" href="https://www.amazon.com/Blink-Mini-2-Camera-Black/dp/B0BWX39R5W/" target="_blank" rel="nofollow" data-dimension112="8a98c96e-6d69-46cf-99ab-500f25bee778" data-action="Deal Block" data-label="Blink Mini 2" data-dimension48="Blink Mini 2" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="7b477dd4-324d-4b1a-a0fc-dc59a43706a8" data-action="Deal Block" data-label="Amazon Fire TV Stick HD" data-dimension48="Amazon Fire TV Stick HD" data-dimension25="$" href="https://www.amazon.com/amazon-fire-tv-stick-hd/dp/B0CQMRKRV5" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:868px;"><p class="vanilla-image-block" style="padding-top:85.48%;"><img id="rxiqRRctBDbkEYub2v2Jfj" name="51GHEdUznQL._AC_SL1000_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rxiqRRctBDbkEYub2v2Jfj.jpg" mos="" align="middle" fullscreen="" width="868" height="742" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/amazon-fire-tv-stick-hd/dp/B0CQMRKRV5" target="_blank" rel="nofollow" data-dimension112="7b477dd4-324d-4b1a-a0fc-dc59a43706a8" data-action="Deal Block" data-label="Amazon Fire TV Stick HD" data-dimension48="Amazon Fire TV Stick HD" data-dimension25="$"><strong>Amazon Fire TV Stick HD</strong></a><br>The Fire TV Stick HD is a bargain. You get access to all your favorite streaming services and a voice-controlled remote. If you're giftee has a 4K TV, opt for the <a href="https://target.georiot.com/Proxy.ashx?tsid=45724&GR_URL=https%3A%2F%2Famazon.com%2Fall-new-amazon-fire-tv-stick-4k-max%2Fdp%2FB0BP9SNVH9%3Ftag%3Dhawk-future-20%26ascsubtag%3Dtomsguide-us-1305008761592650359-20" target="_blank" rel="nofollow">4K Max model</a> instead, but for those with an HD TV, this is a great choice.<a class="view-deal button" href="https://www.amazon.com/amazon-fire-tv-stick-hd/dp/B0CQMRKRV5" target="_blank" rel="nofollow" data-dimension112="7b477dd4-324d-4b1a-a0fc-dc59a43706a8" data-action="Deal Block" data-label="Amazon Fire TV Stick HD" data-dimension48="Amazon Fire TV Stick HD" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="207cfe34-3844-4f93-92fb-63afce564365" data-action="Deal Block" data-label="Kingheroes Electric Toothbrush Set" data-dimension48="Kingheroes Electric Toothbrush Set" href="https://www.amazon.com/kingheroes-Black-personality-whitening-Toothbrush/dp/B08L78KPWJ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:121.21%;"><img id="PA3U3i2umL7J3bztYdUgDJ" name="Kingheroes Electric Toothbrush Set" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PA3U3i2umL7J3bztYdUgDJ.jpg" mos="" align="middle" fullscreen="" width="679" height="823" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/kingheroes-Black-personality-whitening-Toothbrush/dp/B08L78KPWJ" target="_blank" rel="nofollow" data-dimension112="207cfe34-3844-4f93-92fb-63afce564365" data-action="Deal Block" data-label="Kingheroes Electric Toothbrush Set" data-dimension48="Kingheroes Electric Toothbrush Set" data-dimension25=""><strong>Kingheroes Electric Toothbrush Set</strong></a><br>This electric toothbrush set makes a perfect stocking stuffer with its 8 brush heads — lasting someone ages without frequent replacements. It offers four modes: clean, whiten, soft, and super, making it easy to customize the brushing experience.<a class="view-deal button" href="https://www.amazon.com/kingheroes-Black-personality-whitening-Toothbrush/dp/B08L78KPWJ" target="_blank" rel="nofollow" data-dimension112="207cfe34-3844-4f93-92fb-63afce564365" data-action="Deal Block" data-label="Kingheroes Electric Toothbrush Set" data-dimension48="Kingheroes Electric Toothbrush Set" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="804ee6cc-3ae0-4db2-af09-93a395493e5a" data-action="Deal Block" data-label="Jlab Go Air Pop Plus" data-dimension48="Jlab Go Air Pop Plus" data-dimension25="$" href="https://www.amazon.com/JLab-Wireless-Bluetooth-Earbuds-Charging/dp/B0D878XJX9" 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:97.00%;"><img id="RPsvKiiLafgWQVWAqRFfmY" name="61ltN4DEeoL._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/RPsvKiiLafgWQVWAqRFfmY.jpg" mos="" align="middle" fullscreen="" width="1500" height="1455" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/JLab-Wireless-Bluetooth-Earbuds-Charging/dp/B0D878XJX9" target="_blank" rel="nofollow" data-dimension112="804ee6cc-3ae0-4db2-af09-93a395493e5a" data-action="Deal Block" data-label="Jlab Go Air Pop Plus" data-dimension48="Jlab Go Air Pop Plus" data-dimension25="$"><strong>Jlab Go Air Pop Plus</strong></a><br>Wireless earbuds have come a long way, and now, you can get a solid-sounding pair of buds for under $25. While not all budget earbuds are up to par, the JLab Go Air Pop True Wireless Bluetooth Earbuds are an ace pick. We gave the previous version of these earbuds a 4-star rating in our <a href="https://www.tomsguide.com/reviews/jlab-go-air-pop">JLab Go Air Pop review</a>. The upgraded version brings longer battery life, IPX4 water resistance and Google Fast Pair.<a class="view-deal button" href="https://www.amazon.com/JLab-Wireless-Bluetooth-Earbuds-Charging/dp/B0D878XJX9" target="_blank" rel="nofollow" data-dimension112="804ee6cc-3ae0-4db2-af09-93a395493e5a" data-action="Deal Block" data-label="Jlab Go Air Pop Plus" data-dimension48="Jlab Go Air Pop Plus" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="7b27764d-4831-4914-8f76-8ecf960a70f8" data-action="Deal Block" data-label="Bluetooth Beanie Hat Headphones" data-dimension48="Bluetooth Beanie Hat Headphones" href="https://www.amazon.com/Upgraded-Bluetooth-Headphones-Wireless-Christmas/dp/B07FNM1VM3" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:80.85%;"><img id="Z4HPf24qBoS2AtT5Uh8ota" name="81GnRBXuUEL._AC_SX679_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Z4HPf24qBoS2AtT5Uh8ota.jpg" mos="" align="middle" fullscreen="" width="679" height="549" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Upgraded-Bluetooth-Headphones-Wireless-Christmas/dp/B07FNM1VM3" target="_blank" rel="nofollow" data-dimension112="7b27764d-4831-4914-8f76-8ecf960a70f8" data-action="Deal Block" data-label="Bluetooth Beanie Hat Headphones" data-dimension48="Bluetooth Beanie Hat Headphones" data-dimension25=""><strong>Bluetooth Beanie Hat Headphones</strong></a><br>When the whether is chilly, you shouldn't have to choose between a hat or headphones. Enter this genius beanie with integrated Bluetooth headphones that keep your ears warm <em>and</em> offer up to 20 hours of battery life. <a class="view-deal button" href="https://www.amazon.com/Upgraded-Bluetooth-Headphones-Wireless-Christmas/dp/B07FNM1VM3" target="_blank" rel="nofollow" data-dimension112="7b27764d-4831-4914-8f76-8ecf960a70f8" data-action="Deal Block" data-label="Bluetooth Beanie Hat Headphones" data-dimension48="Bluetooth Beanie Hat Headphones" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="d86e4c13-d25d-4b5d-b504-26da85128876" data-action="Deal Block" data-label="Stainless Steel Mesh Loop Apple Watch Band" data-dimension48="Stainless Steel Mesh Loop Apple Watch Band" href="https://www.amazon.com/Marge-Stainless-Magnetic-Replacement-iWatch/dp/B09V5MFXD5" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1479px;"><p class="vanilla-image-block" style="padding-top:101.42%;"><img id="HPVFgJfpHNstfDarnpgESo" name="81DFxaW59ML._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HPVFgJfpHNstfDarnpgESo.jpg" mos="" align="middle" fullscreen="" width="1479" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Marge-Stainless-Magnetic-Replacement-iWatch/dp/B09V5MFXD5" target="_blank" rel="nofollow" data-dimension112="d86e4c13-d25d-4b5d-b504-26da85128876" data-action="Deal Block" data-label="Stainless Steel Mesh Loop Apple Watch Band" data-dimension48="Stainless Steel Mesh Loop Apple Watch Band" data-dimension25=""><strong>Stainless Steel Mesh Loop Apple Watch Band</strong></a><br>For the Apple Watch user who could use a more fashionable watch band, this premium-looking stainless steel mesh loop is a thoughtful gift. It comes in several metal options, so you can decide which best suits the recipient's style.<a class="view-deal button" href="https://www.amazon.com/Marge-Stainless-Magnetic-Replacement-iWatch/dp/B09V5MFXD5" target="_blank" rel="nofollow" data-dimension112="d86e4c13-d25d-4b5d-b504-26da85128876" data-action="Deal Block" data-label="Stainless Steel Mesh Loop Apple Watch Band" data-dimension48="Stainless Steel Mesh Loop Apple Watch Band" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="ef7e6d17-7390-4a6a-86b2-58b864f8f435" data-action="Deal Block" data-label="WHOOSH! Screen Shine DuoEver wonder how the devices in the Apple Store always have smudge-less screens? The answer is Whoosh Screen Cleaner, a cleaning mist designed specifically for wiping down smartphones, tablets, laptops, e-readers, computer monitors, TVs and more. WHOOSH! Screen Shine Duo" data-dimension48="WHOOSH! Screen Shine DuoEver wonder how the devices in the Apple Store always have smudge-less screens? The answer is Whoosh Screen Cleaner, a cleaning mist designed specifically for wiping down smartphones, tablets, laptops, e-readers, computer monitors, TVs and more. WHOOSH! Screen Shine Duo" href="https://www.amazon.com/WHOOSH-Screen-Cleaner-Kit-Smartphones/dp/B07BVZ4TN7" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:105.15%;"><img id="r3xjQ4sTZWbVBTPk44oNX8" name="Whoosh" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/r3xjQ4sTZWbVBTPk44oNX8.jpg" mos="" align="middle" fullscreen="" width="679" height="714" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.amazon.com/WHOOSH-Screen-Cleaner-Kit-Smartphones/dp/B07BVZ4TN7" target="_blank" rel="nofollow" data-dimension112="ef7e6d17-7390-4a6a-86b2-58b864f8f435" data-action="Deal Block" data-label="WHOOSH! Screen Shine DuoEver wonder how the devices in the Apple Store always have smudge-less screens? The answer is Whoosh Screen Cleaner, a cleaning mist designed specifically for wiping down smartphones, tablets, laptops, e-readers, computer monitors, TVs and more. WHOOSH! Screen Shine Duo" data-dimension48="WHOOSH! Screen Shine DuoEver wonder how the devices in the Apple Store always have smudge-less screens? The answer is Whoosh Screen Cleaner, a cleaning mist designed specifically for wiping down smartphones, tablets, laptops, e-readers, computer monitors, TVs and more. WHOOSH! Screen Shine Duo" data-dimension25=""><strong>WHOOSH! Screen Shine Duo</strong></a><br>Ever wonder how the devices in the Apple Store always have smudge-less screens? The answer is Whoosh Screen Cleaner, a cleaning mist designed specifically for wiping down smartphones, tablets, laptops, e-readers, computer monitors, TVs and more.<a class="view-deal button" href="https://www.amazon.com/WHOOSH-Screen-Cleaner-Kit-Smartphones/dp/B07BVZ4TN7" target="_blank" rel="nofollow" data-dimension112="ef7e6d17-7390-4a6a-86b2-58b864f8f435" data-action="Deal Block" data-label="WHOOSH! Screen Shine DuoEver wonder how the devices in the Apple Store always have smudge-less screens? The answer is Whoosh Screen Cleaner, a cleaning mist designed specifically for wiping down smartphones, tablets, laptops, e-readers, computer monitors, TVs and more. WHOOSH! Screen Shine Duo" data-dimension48="WHOOSH! Screen Shine DuoEver wonder how the devices in the Apple Store always have smudge-less screens? The answer is Whoosh Screen Cleaner, a cleaning mist designed specifically for wiping down smartphones, tablets, laptops, e-readers, computer monitors, TVs and more. WHOOSH! Screen Shine Duo" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-home"><span>Home</span></h3><div class="product"><a data-dimension112="7e155d30-6639-4349-be27-d395ac754541" data-action="Deal Block" data-label="Aerolatte Milk Frother" data-dimension48="Aerolatte Milk Frother" href="https://www.amazon.com/Aerolatte-Original-HandHeld-Frother-Satin/dp/B0002KZUNK" 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:84.20%;"><img id="mKuCkXNWfPeirDRzUJv4Yd" name="aerolatte Milk Frother.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mKuCkXNWfPeirDRzUJv4Yd.jpg" mos="" align="middle" fullscreen="" width="1158" height="975" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Aerolatte-Original-HandHeld-Frother-Satin/dp/B0002KZUNK" target="_blank" rel="nofollow" data-dimension112="7e155d30-6639-4349-be27-d395ac754541" data-action="Deal Block" data-label="Aerolatte Milk Frother" data-dimension48="Aerolatte Milk Frother" data-dimension25=""><strong>Aerolatte Milk Frother</strong></a><br>The Aerolatte Milk Frother can make rich, forthy drinks in less than a minute. It can be used with all types of milk (whole, skim, almond, soy, etc.) and is made of stainless steel and BPA-free plastic. The perfect gift for the cappuccino lover in your life.  <a class="view-deal button" href="https://www.amazon.com/Aerolatte-Original-HandHeld-Frother-Satin/dp/B0002KZUNK" target="_blank" rel="nofollow" data-dimension112="7e155d30-6639-4349-be27-d395ac754541" data-action="Deal Block" data-label="Aerolatte Milk Frother" data-dimension48="Aerolatte Milk Frother" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="22b203d1-50d9-4286-bc79-fdbf05c9c14f" data-action="Deal Block" data-label="Northern Lights Candles Terracotta Tapers" data-dimension48="Northern Lights Candles Terracotta Tapers" data-dimension25="$" href="https://www.amazon.com/Northern-Lights-Candles-Premium-Candle/dp/B00V368ALG" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:279px;"><p class="vanilla-image-block" style="padding-top:667.03%;"><img id="2QuHS8WjjXh5z5X6ZyY7Ah" name="Tapers" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2QuHS8WjjXh5z5X6ZyY7Ah.jpg" mos="" align="middle" fullscreen="" width="279" height="1861" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Northern-Lights-Candles-Premium-Candle/dp/B00V368ALG" target="_blank" rel="nofollow" data-dimension112="22b203d1-50d9-4286-bc79-fdbf05c9c14f" data-action="Deal Block" data-label="Northern Lights Candles Terracotta Tapers" data-dimension48="Northern Lights Candles Terracotta Tapers" data-dimension25="$"><strong>Northern Lights Candles Terracotta Tapers</strong></a><br>You can never have too many taper candles — and this set features a lovely terracotta hue. The set includes two 12 inch tapers that are smokeless, dripless and fragrance free.<a class="view-deal button" href="https://www.amazon.com/Northern-Lights-Candles-Premium-Candle/dp/B00V368ALG" target="_blank" rel="nofollow" data-dimension112="22b203d1-50d9-4286-bc79-fdbf05c9c14f" data-action="Deal Block" data-label="Northern Lights Candles Terracotta Tapers" data-dimension48="Northern Lights Candles Terracotta Tapers" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="3902b59a-5ec0-48a0-b534-0054cd161baa" data-action="Deal Block" data-label="Bedsure Checkered Throw Blanket" data-dimension48="Bedsure Checkered Throw Blanket" data-dimension25="$" href="https://www.amazon.com/Bedsure-Super-Soft-Throw-Blanket/dp/B0C7QCGNJ9" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:96.61%;"><img id="6s6kVUoGqhkv7i4NKtSVjN" name="Bedsure" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6s6kVUoGqhkv7i4NKtSVjN.jpg" mos="" align="middle" fullscreen="" width="679" height="656" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Bedsure-Super-Soft-Throw-Blanket/dp/B0C7QCGNJ9" target="_blank" rel="nofollow" data-dimension112="3902b59a-5ec0-48a0-b534-0054cd161baa" data-action="Deal Block" data-label="Bedsure Checkered Throw Blanket" data-dimension48="Bedsure Checkered Throw Blanket" data-dimension25="$"><strong>Bedsure Checkered Throw Blanket</strong></a><br>Whether you're looking for a decorative throw for your couch or you need an extra layer of warmth for your bed, this fleece blanket is a must-have for cooler temperatures. The shaggy Sherpa blanket features a timeless checkered pattern and the utmost coziness. It comes in two different throw sizes or sizes to fit a twin, queen and king bed. <a class="view-deal button" href="https://www.amazon.com/Bedsure-Super-Soft-Throw-Blanket/dp/B0C7QCGNJ9" target="_blank" rel="nofollow" data-dimension112="3902b59a-5ec0-48a0-b534-0054cd161baa" data-action="Deal Block" data-label="Bedsure Checkered Throw Blanket" data-dimension48="Bedsure Checkered Throw Blanket" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="1b78b834-bf88-4d7a-876d-803f591d9886" data-action="Deal Block" data-label="Retro Record Coasters for Drinks" data-dimension48="Retro Record Coasters for Drinks" href="https://www.amazon.com/Coasters-Conversation-Sayings-Housewarming-Registry/dp/B08R8YVH9G" 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="bmTBSFMwHsSzvfJCRihc3A" name="71VbvCiNEQL._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/bmTBSFMwHsSzvfJCRihc3A.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Coasters-Conversation-Sayings-Housewarming-Registry/dp/B08R8YVH9G" target="_blank" rel="nofollow" data-dimension112="1b78b834-bf88-4d7a-876d-803f591d9886" data-action="Deal Block" data-label="Retro Record Coasters for Drinks" data-dimension48="Retro Record Coasters for Drinks" data-dimension25=""><strong>Retro Record Coasters for Drinks</strong></a><br>Vinyl gifts can be pricey, but vinyl-themed gifts don't have to be. We love these cute record coasters that sit on a miniature record player. This set of six is perfect for the music lover in your life.<a class="view-deal button" href="https://www.amazon.com/Coasters-Conversation-Sayings-Housewarming-Registry/dp/B08R8YVH9G" target="_blank" rel="nofollow" data-dimension112="1b78b834-bf88-4d7a-876d-803f591d9886" data-action="Deal Block" data-label="Retro Record Coasters for Drinks" data-dimension48="Retro Record Coasters for Drinks" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="05e16684-724f-408b-b69b-34997aeb3e0b" data-action="Deal Block" data-label="Decorative Wooden Matches" data-dimension48="Decorative Wooden Matches" href="https://www.amazon.com/Decorative-Matches-Apothecary-Long-Wooden-Black-Matchsticks/dp/B088P86M2C/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:488px;"><p class="vanilla-image-block" style="padding-top:93.24%;"><img id="Wqp4R6vE6pyuW7wRJJ8JvQ" name="Screenshot 2023-12-07 at 12.17.19 PM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Wqp4R6vE6pyuW7wRJJ8JvQ.png" mos="" align="middle" fullscreen="" width="488" height="455" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Decorative-Matches-Apothecary-Long-Wooden-Black-Matchsticks/dp/B088P86M2C/" target="_blank" rel="nofollow" data-dimension112="05e16684-724f-408b-b69b-34997aeb3e0b" data-action="Deal Block" data-label="Decorative Wooden Matches" data-dimension48="Decorative Wooden Matches" data-dimension25=""><strong>Decorative Wooden Matches</strong></a><br>If you're shopping for a gift for a candle lover, get them a premium-looking matchstick set like this one. Electric lighters are fine and all, but how can you beat the satisfaction of striking a match?<a class="view-deal button" href="https://www.amazon.com/Decorative-Matches-Apothecary-Long-Wooden-Black-Matchsticks/dp/B088P86M2C/" target="_blank" rel="nofollow" data-dimension112="05e16684-724f-408b-b69b-34997aeb3e0b" data-action="Deal Block" data-label="Decorative Wooden Matches" data-dimension48="Decorative Wooden Matches" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="d8430799-c0e1-4571-8fcb-3ee6fa7294e5" data-action="Deal Block" data-label="DW Home Vanilla Bean Candle" data-dimension48="DW Home Vanilla Bean Candle" href="https://www.amazon.com/DW-Home-Decoware-Scented-Vanilla/dp/B01M29AIZI" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:539px;"><p class="vanilla-image-block" style="padding-top:97.77%;"><img id="PCnh8JE4tPHdgkZu6ESQBP" name="Screenshot 2023-12-07 at 12.24.12 PM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PCnh8JE4tPHdgkZu6ESQBP.png" mos="" align="middle" fullscreen="" width="539" height="527" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/DW-Home-Decoware-Scented-Vanilla/dp/B01M29AIZI" target="_blank" rel="nofollow" data-dimension112="d8430799-c0e1-4571-8fcb-3ee6fa7294e5" data-action="Deal Block" data-label="DW Home Vanilla Bean Candle" data-dimension48="DW Home Vanilla Bean Candle" data-dimension25=""><strong>DW Home Vanilla Bean Candle</strong></a><br>Of course, you can find good candles to stuff those stockings. Vanilla is a foolproof holiday scent, and having tested other DW Home candles, we're sure this 9.69 oz candle makes a great gift.<a class="view-deal button" href="https://www.amazon.com/DW-Home-Decoware-Scented-Vanilla/dp/B01M29AIZI" target="_blank" rel="nofollow" data-dimension112="d8430799-c0e1-4571-8fcb-3ee6fa7294e5" data-action="Deal Block" data-label="DW Home Vanilla Bean Candle" data-dimension48="DW Home Vanilla Bean Candle" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="eab94e41-b71c-4cde-9345-225d44bff8ab" data-action="Deal Block" data-label="Kitchy Pizza Cutter Wheel" data-dimension48="Kitchy Pizza Cutter Wheel" href="https://www.amazon.com/Kitchy-Pizza-Cutter-Wheel-Protective/dp/B019S3W8AO" 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.73%;"><img id="7oySmbzZwbUqEqH2K9v6sc" name="71Fc0cehdqL._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7oySmbzZwbUqEqH2K9v6sc.jpg" mos="" align="middle" fullscreen="" width="1500" height="1496" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Kitchy-Pizza-Cutter-Wheel-Protective/dp/B019S3W8AO/" target="_blank" rel="nofollow" data-dimension112="eab94e41-b71c-4cde-9345-225d44bff8ab" data-action="Deal Block" data-label="Kitchy Pizza Cutter Wheel" data-dimension48="Kitchy Pizza Cutter Wheel" data-dimension25=""><strong>Kitchy Pizza Cutter Wheel</strong></a><br>One of my most-beloved (and most affordable) kitchen gadgets is this clever pizza cutting wheel. It's a great gift for cutting pizza, breads, quesadillas and much more. It snaps apart for easy cleaning, too. <a class="view-deal button" href="https://www.amazon.com/Kitchy-Pizza-Cutter-Wheel-Protective/dp/B019S3W8AO" target="_blank" rel="nofollow" data-dimension112="eab94e41-b71c-4cde-9345-225d44bff8ab" data-action="Deal Block" data-label="Kitchy Pizza Cutter Wheel" data-dimension48="Kitchy Pizza Cutter Wheel" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="682db21a-4903-4c56-917d-ab215f446445" data-action="Deal Block" data-label="Bedsure Satin Pillowcase" data-dimension48="Bedsure Satin Pillowcase" href="https://www.amazon.com/Bedsure-Satin-Pillowcase-Hair-2-Pack/dp/B0725WFLMB" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:482px;"><p class="vanilla-image-block" style="padding-top:91.91%;"><img id="LEk2tPGcwJgFvxStKdDQaN" name="Screenshot 2023-12-07 at 12.52.41 PM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/LEk2tPGcwJgFvxStKdDQaN.png" mos="" align="middle" fullscreen="" width="482" height="443" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Bedsure-Satin-Pillowcase-Hair-2-Pack/dp/B0725WFLMB" target="_blank" rel="nofollow" data-dimension112="682db21a-4903-4c56-917d-ab215f446445" data-action="Deal Block" data-label="Bedsure Satin Pillowcase" data-dimension48="Bedsure Satin Pillowcase" data-dimension25=""><strong>Bedsure Satin Pillowcase</strong></a><br>This satin pillowcase is an affordable upgrade for a better night's sleep. They're soft on hair and preferred for sensitive skin, but feel luxurious even if those aren't concerns for your recipient.<a class="view-deal button" href="https://www.amazon.com/Bedsure-Satin-Pillowcase-Hair-2-Pack/dp/B0725WFLMB" target="_blank" rel="nofollow" data-dimension112="682db21a-4903-4c56-917d-ab215f446445" data-action="Deal Block" data-label="Bedsure Satin Pillowcase" data-dimension48="Bedsure Satin Pillowcase" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-fitness"><span>Fitness</span></h3><div class="product"><a data-dimension112="122a46e9-e3ad-4e3d-8aaf-1f791fc91e66" data-action="Deal Block" data-label="Bala BanglesFitness gifts make great stocking stuffers. One of our favorites are&nbsp;Bala Bangles, a pair of 1-pound wrist weights that are perfect for elevating all kinds of activities. Whether your recipient loves to walk, weight train, do pilates or other kinds of training, wrist/ankle weights are the ultimate accessory. We particularly like Bala Bangles because they stay secure on our wrists and ankles while moving around. Bala Bangles" data-dimension48="Bala BanglesFitness gifts make great stocking stuffers. One of our favorites are&nbsp;Bala Bangles, a pair of 1-pound wrist weights that are perfect for elevating all kinds of activities. Whether your recipient loves to walk, weight train, do pilates or other kinds of training, wrist/ankle weights are the ultimate accessory. We particularly like Bala Bangles because they stay secure on our wrists and ankles while moving around. Bala Bangles" href="https://www.amazon.com/dp/B09SNTB8DF" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:102.21%;"><img id="cFYmj4SkP6HM8TuwYadC3k" name="Bala Bangles" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/cFYmj4SkP6HM8TuwYadC3k.jpg" mos="" align="middle" fullscreen="" width="679" height="694" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.amazon.com/dp/B09SNTB8DF" target="_blank" rel="nofollow" data-dimension112="122a46e9-e3ad-4e3d-8aaf-1f791fc91e66" data-action="Deal Block" data-label="Bala BanglesFitness gifts make great stocking stuffers. One of our favorites are&nbsp;Bala Bangles, a pair of 1-pound wrist weights that are perfect for elevating all kinds of activities. Whether your recipient loves to walk, weight train, do pilates or other kinds of training, wrist/ankle weights are the ultimate accessory. We particularly like Bala Bangles because they stay secure on our wrists and ankles while moving around. Bala Bangles" data-dimension48="Bala BanglesFitness gifts make great stocking stuffers. One of our favorites are&nbsp;Bala Bangles, a pair of 1-pound wrist weights that are perfect for elevating all kinds of activities. Whether your recipient loves to walk, weight train, do pilates or other kinds of training, wrist/ankle weights are the ultimate accessory. We particularly like Bala Bangles because they stay secure on our wrists and ankles while moving around. Bala Bangles" data-dimension25=""><strong>Bala Bangles</strong></a><br>Fitness gifts make great stocking stuffers. One of our favorites are Bala Bangles, a pair of 1-pound wrist weights that are perfect for elevating all kinds of activities. Whether your recipient loves to walk, weight train, do pilates or other kinds of training, wrist/ankle weights are the ultimate accessory. We particularly like Bala Bangles because they stay secure on our wrists and ankles while moving around.<a class="view-deal button" href="https://www.amazon.com/dp/B09SNTB8DF" target="_blank" rel="nofollow" data-dimension112="122a46e9-e3ad-4e3d-8aaf-1f791fc91e66" data-action="Deal Block" data-label="Bala BanglesFitness gifts make great stocking stuffers. One of our favorites are&nbsp;Bala Bangles, a pair of 1-pound wrist weights that are perfect for elevating all kinds of activities. Whether your recipient loves to walk, weight train, do pilates or other kinds of training, wrist/ankle weights are the ultimate accessory. We particularly like Bala Bangles because they stay secure on our wrists and ankles while moving around. Bala Bangles" data-dimension48="Bala BanglesFitness gifts make great stocking stuffers. One of our favorites are&nbsp;Bala Bangles, a pair of 1-pound wrist weights that are perfect for elevating all kinds of activities. Whether your recipient loves to walk, weight train, do pilates or other kinds of training, wrist/ankle weights are the ultimate accessory. We particularly like Bala Bangles because they stay secure on our wrists and ankles while moving around. Bala Bangles" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="519d0fec-4a96-4f50-b815-ef24ea685f20" data-action="Deal Block" data-label="UV Sun Protection Arm Sleeves" data-dimension48="UV Sun Protection Arm Sleeves" href="https://www.amazon.com/Sun-Protection-Arm-Sleeves-Compression/dp/B07S2TFK24/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1409px;"><p class="vanilla-image-block" style="padding-top:106.46%;"><img id="97CDRksseXMuyFqdqFQMig" name="71+bggqjfGL._AC_SL1500_ (1).jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/97CDRksseXMuyFqdqFQMig.jpg" mos="" align="middle" fullscreen="" width="1409" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Sun-Protection-Arm-Sleeves-Compression/dp/B07S2TFK24/" target="_blank" rel="nofollow" data-dimension112="519d0fec-4a96-4f50-b815-ef24ea685f20" data-action="Deal Block" data-label="UV Sun Protection Arm Sleeves" data-dimension48="UV Sun Protection Arm Sleeves" data-dimension25=""><strong>UV Sun Protection Arm Sleeves</strong></a><br>Runners and athletes may spend hours out in the sun, but they might not think to protect their arms from UV rays. These handy compression arm sleeves are comfortable <em>and</em> protective, making them a functional gift to stuff in those stockings. <a class="view-deal button" href="https://www.amazon.com/Sun-Protection-Arm-Sleeves-Compression/dp/B07S2TFK24/" target="_blank" rel="nofollow" data-dimension112="519d0fec-4a96-4f50-b815-ef24ea685f20" data-action="Deal Block" data-label="UV Sun Protection Arm Sleeves" data-dimension48="UV Sun Protection Arm Sleeves" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="cc2b8856-4190-4fc2-8ea7-234cbfdd1476" data-action="Deal Block" data-label="BlenderBottle Classic Shaker Bottle" data-dimension48="BlenderBottle Classic Shaker Bottle" href="https://www.amazon.com/BlenderBottle-Classic-Shaker-Bottle-28-Ounce/dp/B01LZQ8OYE" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:498px;"><p class="vanilla-image-block" style="padding-top:93.57%;"><img id="PM2yyeFJ3RBR2gC9bFWk8W" name="Screenshot 2023-12-07 at 2.27.00 PM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PM2yyeFJ3RBR2gC9bFWk8W.png" mos="" align="middle" fullscreen="" width="498" height="466" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/BlenderBottle-Classic-Shaker-Bottle-28-Ounce/dp/B01LZQ8OYE" target="_blank" rel="nofollow" data-dimension112="cc2b8856-4190-4fc2-8ea7-234cbfdd1476" data-action="Deal Block" data-label="BlenderBottle Classic Shaker Bottle" data-dimension48="BlenderBottle Classic Shaker Bottle" data-dimension25=""><strong>BlenderBottle Classic Shaker Bottle</strong></a><br>We're guessing you know someone who could use a fresh shaker bottle for their pre-workout and protein shakes. This tried-and-true BlenderBottle is great for taking on the go.<a class="view-deal button" href="https://www.amazon.com/BlenderBottle-Classic-Shaker-Bottle-28-Ounce/dp/B01LZQ8OYE" target="_blank" rel="nofollow" data-dimension112="cc2b8856-4190-4fc2-8ea7-234cbfdd1476" data-action="Deal Block" data-label="BlenderBottle Classic Shaker Bottle" data-dimension48="BlenderBottle Classic Shaker Bottle" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="4c0ebd49-b0d6-4bed-965c-be92345530e8" data-action="Deal Block" data-label="Foot Massage Roller" data-dimension48="Foot Massage Roller" href="https://www.amazon.com/BESKAR-Fasciitis-Reflexology-Relieving-Myofascial/dp/B0CF5HJDV1/ref=sr_1_53" 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.20%;"><img id="swc6PXFGzWaQY6nYLQKwyb" name="61WeFcPWVLL._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/swc6PXFGzWaQY6nYLQKwyb.jpg" mos="" align="middle" fullscreen="" width="1500" height="1398" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/BESKAR-Fasciitis-Reflexology-Relieving-Myofascial/dp/B0CF5HJDV1/ref=sr_1_53" target="_blank" rel="nofollow" data-dimension112="4c0ebd49-b0d6-4bed-965c-be92345530e8" data-action="Deal Block" data-label="Foot Massage Roller" data-dimension48="Foot Massage Roller" data-dimension25=""><strong>Foot Massage Roller</strong></a><br>Another handy little stocking filler for the runner in your life, this little massage tool can help ease aches and pains from miles on his or her feet. The deep tissue massager can be used to relieve tension in the arch of the foot, and we guarantee it'll be one of their favorite gifts this holiday!<a class="view-deal button" href="https://www.amazon.com/BESKAR-Fasciitis-Reflexology-Relieving-Myofascial/dp/B0CF5HJDV1/ref=sr_1_53" target="_blank" rel="nofollow" data-dimension112="4c0ebd49-b0d6-4bed-965c-be92345530e8" data-action="Deal Block" data-label="Foot Massage Roller" data-dimension48="Foot Massage Roller" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="08aba56f-280f-4a76-990f-1f47de4e7ebf" data-action="Deal Block" data-label="Fit Simplify Resistance Loop Exercise Bands" data-dimension48="Fit Simplify Resistance Loop Exercise Bands" href="https://www.amazon.com/Fit-Simplify-Resistance-Exercise-Instruction/dp/B01AVDVHTI" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1413px;"><p class="vanilla-image-block" style="padding-top:106.16%;"><img id="eps6kRnqWTWawpAqQeiLM" name="81ARh719W9L._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/eps6kRnqWTWawpAqQeiLM.jpg" mos="" align="middle" fullscreen="" width="1413" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Fit-Simplify-Resistance-Exercise-Instruction/dp/B01AVDVHTI" target="_blank" rel="nofollow" data-dimension112="08aba56f-280f-4a76-990f-1f47de4e7ebf" data-action="Deal Block" data-label="Fit Simplify Resistance Loop Exercise Bands" data-dimension48="Fit Simplify Resistance Loop Exercise Bands" data-dimension25=""><strong>Fit Simplify Resistance Loop Exercise Bands</strong></a><br>This set of five resistance bands is an awesome gift for fitness lovers. With bands like these, you can get an effective workout in, even if you travel often. They even come with a carry bag for portability.<a class="view-deal button" href="https://www.amazon.com/Fit-Simplify-Resistance-Exercise-Instruction/dp/B01AVDVHTI" target="_blank" rel="nofollow" data-dimension112="08aba56f-280f-4a76-990f-1f47de4e7ebf" data-action="Deal Block" data-label="Fit Simplify Resistance Loop Exercise Bands" data-dimension48="Fit Simplify Resistance Loop Exercise Bands" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-food"><span>Food</span></h3><div class="product"><a data-dimension112="9f266690-bc66-414e-9ebd-5db73ebfe73f" data-action="Deal Block" data-label="Illy Ground Coffee" data-dimension48="Illy Ground Coffee" data-dimension25="$" href="https://www.amazon.com/stores/page/5908A73A-E580-4F21-9137-517B89076D97" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1440px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="FtPtMxdL5cexHqYQJMrN4i" name="illy Arabica Selections Brasile" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FtPtMxdL5cexHqYQJMrN4i.jpg" mos="" align="middle" fullscreen="" width="1440" height="1440" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/stores/page/5908A73A-E580-4F21-9137-517B89076D97" target="_blank" rel="nofollow" data-dimension112="9f266690-bc66-414e-9ebd-5db73ebfe73f" data-action="Deal Block" data-label="Illy Ground Coffee" data-dimension48="Illy Ground Coffee" data-dimension25="$"><strong>Illy Ground Coffee</strong></a><br>Illy has select ground coffee canisters on sale from $9. The sale includes classic roast, bold, decaffeinated, and more. <a href="https://www.amazon.com/stores/page/5B387E07-9AB9-4956-962A-DAC3B90F3120" target="_blank" rel="nofollow">Whole beans are also on sale from $13</a> as are a small number of <a href="https://www.amazon.com/stores/page/EA780372-C4BF-4659-9B9B-29270F2BFF79" target="_blank" rel="nofollow">K Cups when you opt for subscribe and save</a>.<a class="view-deal button" href="https://www.amazon.com/stores/page/5908A73A-E580-4F21-9137-517B89076D97" target="_blank" rel="nofollow" data-dimension112="9f266690-bc66-414e-9ebd-5db73ebfe73f" data-action="Deal Block" data-label="Illy Ground Coffee" data-dimension48="Illy Ground Coffee" data-dimension25="$">View Deal</a></p></div><div class="product"><a data-dimension112="073ab602-c5f0-422d-8b20-89cd679a369c" data-action="Deal Block" data-label="Tony's Chocolonely Chocolate Bar Pack" data-dimension48="Tony's Chocolonely Chocolate Bar Pack" href="https://www.amazon.com/Tonys-Chocolonely-Chocolate-Bar-Pack/dp/B08PX2V7S8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:596px;"><p class="vanilla-image-block" style="padding-top:94.30%;"><img id="RLxJERSFZbeMWWEZnfZBCH" name="tony's.JPG" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/RLxJERSFZbeMWWEZnfZBCH.jpg" mos="" align="middle" fullscreen="" width="596" height="562" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Tonys-Chocolonely-Chocolate-Bar-Pack/dp/B08PX2V7S8" target="_blank" rel="nofollow" data-dimension112="073ab602-c5f0-422d-8b20-89cd679a369c" data-action="Deal Block" data-label="Tony's Chocolonely Chocolate Bar Pack" data-dimension48="Tony's Chocolonely Chocolate Bar Pack" data-dimension25=""><strong>Tony's Chocolonely Chocolate Bar Pack</strong></a><br>Got someone really tricky to buy for? This Tony's gift box contains a six-pack of the wonderful Tony's Chocolonely chocolate bars. Show your loved one they deserve to treat themselves this holiday season. <a class="view-deal button" href="https://www.amazon.com/Tonys-Chocolonely-Chocolate-Bar-Pack/dp/B08PX2V7S8" target="_blank" rel="nofollow" data-dimension112="073ab602-c5f0-422d-8b20-89cd679a369c" data-action="Deal Block" data-label="Tony's Chocolonely Chocolate Bar Pack" data-dimension48="Tony's Chocolonely Chocolate Bar Pack" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="81d7c13e-d803-4e1e-98c9-30acb96a775e" data-action="Deal Block" data-label="The Cocktail Box Co. Old Fashioned Cocktail Kit" data-dimension48="The Cocktail Box Co. Old Fashioned Cocktail Kit" href="https://www.amazon.com/Cocktail-Kit-Fashioned-Premium-Cocktails/dp/B07C6PT36R" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:130.04%;"><img id="qNWySCaZhWnTyqgG2wmPVb" name="Old Fashioned" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qNWySCaZhWnTyqgG2wmPVb.jpg" mos="" align="middle" fullscreen="" width="679" height="883" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Cocktail-Kit-Fashioned-Premium-Cocktails/dp/B07C6PT36R" target="_blank" rel="nofollow" data-dimension112="81d7c13e-d803-4e1e-98c9-30acb96a775e" data-action="Deal Block" data-label="The Cocktail Box Co. Old Fashioned Cocktail Kit" data-dimension48="The Cocktail Box Co. Old Fashioned Cocktail Kit" data-dimension25=""><strong>The Cocktail Box Co. Old Fashioned Cocktail Kit</strong></a><br>It's not technically food, but your recipient is sure to appreciate this yummy cocktail kit. It comes with everything they need to become a mixologist. It turns making their favorite drink into a fun activity.<a class="view-deal button" href="https://www.amazon.com/Cocktail-Kit-Fashioned-Premium-Cocktails/dp/B07C6PT36R" target="_blank" rel="nofollow" data-dimension112="81d7c13e-d803-4e1e-98c9-30acb96a775e" data-action="Deal Block" data-label="The Cocktail Box Co. Old Fashioned Cocktail Kit" data-dimension48="The Cocktail Box Co. Old Fashioned Cocktail Kit" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="d41f83d9-db58-4e89-b85c-303c757ab1c2" data-action="Deal Block" data-label="Mike's Hot Honey Original &amp; Extra Hot Combo" data-dimension48="Mike's Hot Honey Original &amp; Extra Hot Combo" href="https://www.amazon.com/Mikes-Hot-Honey-Original-Paleo-Friendly-Honey/dp/B08B115651" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1199px;"><p class="vanilla-image-block" style="padding-top:125.10%;"><img id="WFbngn6GhPPbDLuJxJevH6" name="71Bbpy4x6aL._SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WFbngn6GhPPbDLuJxJevH6.jpg" mos="" align="middle" fullscreen="" width="1199" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Mikes-Hot-Honey-Original-Paleo-Friendly-Honey/dp/B08B115651" target="_blank" rel="nofollow" data-dimension112="d41f83d9-db58-4e89-b85c-303c757ab1c2" data-action="Deal Block" data-label="Mike's Hot Honey Original &amp; Extra Hot Combo" data-dimension48="Mike's Hot Honey Original &amp; Extra Hot Combo" data-dimension25=""><strong>Mike's Hot Honey Original & Extra Hot Combo</strong></a><br>Hot honey is the best condiment to put on pretty much anything. Mike's Hot offers the perfect combination of sweet and heat, making this two-pack a delectable holiday gift. <a class="view-deal button" href="https://www.amazon.com/Mikes-Hot-Honey-Original-Paleo-Friendly-Honey/dp/B08B115651" target="_blank" rel="nofollow" data-dimension112="d41f83d9-db58-4e89-b85c-303c757ab1c2" data-action="Deal Block" data-label="Mike's Hot Honey Original &amp; Extra Hot Combo" data-dimension48="Mike's Hot Honey Original &amp; Extra Hot Combo" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="eb728c38-b369-4a41-838b-b0c6fab1460f" data-action="Deal Block" data-label="Infused Sea Salt Sampler Set" data-dimension48="Infused Sea Salt Sampler Set" href="https://www.amazon.com/Finishing-Seasoning-Gourmet-Occasions-Flavored/dp/B00478UGRI" 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="KquNBD3LPQ4LAHXB2Gf7PP" name="91qJFwplgoL._SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KquNBD3LPQ4LAHXB2Gf7PP.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Finishing-Seasoning-Gourmet-Occasions-Flavored/dp/B00478UGRI" target="_blank" rel="nofollow" data-dimension112="eb728c38-b369-4a41-838b-b0c6fab1460f" data-action="Deal Block" data-label="Infused Sea Salt Sampler Set" data-dimension48="Infused Sea Salt Sampler Set" data-dimension25=""><strong>Infused Sea Salt Sampler Set</strong></a><br>Have you ever tried Hawaiian Bamboo Jade salt? Neither have I, but I want to after seeing it this infused sea salt sampler set. There are six different salts in this kit to cook with.</p></div><h3 class="article-body__section" id="section-toys-and-games"><span>Toys and Games</span></h3><div class="product"><a data-dimension112="69ca287a-7e5c-48f8-aa20-82f763c84b95" data-action="Deal Block" data-label="Ridley’s Movie Buff Trivia Card Game" data-dimension48="Ridley’s Movie Buff Trivia Card Game" href="https://www.amazon.com/Ridleys-Games-Second-Guessing-Adults/dp/B01MQI1JUB" 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="KSW5UMXpfie6AD6QbBF5EF" name="91AXyfTWmFL._SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KSW5UMXpfie6AD6QbBF5EF.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Ridleys-Games-Second-Guessing-Adults/dp/B01MQI1JUB" target="_blank" rel="nofollow" data-dimension112="69ca287a-7e5c-48f8-aa20-82f763c84b95" data-action="Deal Block" data-label="Ridley’s Movie Buff Trivia Card Game" data-dimension48="Ridley’s Movie Buff Trivia Card Game" data-dimension25=""><strong>Ridley’s Movie Buff Trivia Card Game</strong></a><br>If there's a movie buff in your life, you need to get them this card-based trivia to challenge their knowledge of the big screen. It comes with 140 question cards, making it a fun game to play with friends and family,<a class="view-deal button" href="https://www.amazon.com/Ridleys-Games-Second-Guessing-Adults/dp/B01MQI1JUB" target="_blank" rel="nofollow" data-dimension112="69ca287a-7e5c-48f8-aa20-82f763c84b95" data-action="Deal Block" data-label="Ridley’s Movie Buff Trivia Card Game" data-dimension48="Ridley’s Movie Buff Trivia Card Game" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="bba0cfc4-93b0-4875-8fd6-04d85b9b22cc" data-action="Deal Block" data-label="TamagotchiA&nbsp;Tamogatchi&nbsp;is a perfect stocking stuffer for adults and kids alike. Adults will love the nostalgia factor of feeding a Tamogatchi pet, while kids can learn lessons about caring for their digital creature. Not much has changed for the original Tamogatchi over the years, and that&rsquo;s what makes it so great: it&rsquo;s simple yet endlessly enjoyable. These days there are licensed Tamogatchi variations as well the more sophisticated Tamogatchi Pix. But when it comes to stocking stuffers, the original Tamogatchi is the one to get. Tamagotchi" data-dimension48="TamagotchiA&nbsp;Tamogatchi&nbsp;is a perfect stocking stuffer for adults and kids alike. Adults will love the nostalgia factor of feeding a Tamogatchi pet, while kids can learn lessons about caring for their digital creature. Not much has changed for the original Tamogatchi over the years, and that&rsquo;s what makes it so great: it&rsquo;s simple yet endlessly enjoyable. These days there are licensed Tamogatchi variations as well the more sophisticated Tamogatchi Pix. But when it comes to stocking stuffers, the original Tamogatchi is the one to get. Tamagotchi" href="https://www.amazon.com/Tamagotchi-42879-Original-Candy-Swirl/dp/B08XWKD1FP" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:131.37%;"><img id="Vx9ww7bqd9SDWFDfkUUv6Z" name="Tamagotchi" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Vx9ww7bqd9SDWFDfkUUv6Z.jpg" mos="" align="middle" fullscreen="" width="679" height="892" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.amazon.com/Tamagotchi-42879-Original-Candy-Swirl/dp/B08XWKD1FP" target="_blank" rel="nofollow" data-dimension112="bba0cfc4-93b0-4875-8fd6-04d85b9b22cc" data-action="Deal Block" data-label="TamagotchiA&nbsp;Tamogatchi&nbsp;is a perfect stocking stuffer for adults and kids alike. Adults will love the nostalgia factor of feeding a Tamogatchi pet, while kids can learn lessons about caring for their digital creature. Not much has changed for the original Tamogatchi over the years, and that&rsquo;s what makes it so great: it&rsquo;s simple yet endlessly enjoyable. These days there are licensed Tamogatchi variations as well the more sophisticated Tamogatchi Pix. But when it comes to stocking stuffers, the original Tamogatchi is the one to get. Tamagotchi" data-dimension48="TamagotchiA&nbsp;Tamogatchi&nbsp;is a perfect stocking stuffer for adults and kids alike. Adults will love the nostalgia factor of feeding a Tamogatchi pet, while kids can learn lessons about caring for their digital creature. Not much has changed for the original Tamogatchi over the years, and that&rsquo;s what makes it so great: it&rsquo;s simple yet endlessly enjoyable. These days there are licensed Tamogatchi variations as well the more sophisticated Tamogatchi Pix. But when it comes to stocking stuffers, the original Tamogatchi is the one to get. Tamagotchi" data-dimension25=""><strong>Tamagotchi</strong></a><br>A Tamogatchi is a perfect stocking stuffer for adults and kids alike. Adults will love the nostalgia factor of feeding a Tamogatchi pet, while kids can learn lessons about caring for their digital creature. Not much has changed for the original Tamogatchi over the years, and that’s what makes it so great: it’s simple yet endlessly enjoyable. These days there are licensed Tamogatchi variations as well the more sophisticated Tamogatchi Pix. But when it comes to stocking stuffers, the original Tamogatchi is the one to get.<a class="view-deal button" href="https://www.amazon.com/Tamagotchi-42879-Original-Candy-Swirl/dp/B08XWKD1FP" target="_blank" rel="nofollow" data-dimension112="bba0cfc4-93b0-4875-8fd6-04d85b9b22cc" data-action="Deal Block" data-label="TamagotchiA&nbsp;Tamogatchi&nbsp;is a perfect stocking stuffer for adults and kids alike. Adults will love the nostalgia factor of feeding a Tamogatchi pet, while kids can learn lessons about caring for their digital creature. Not much has changed for the original Tamogatchi over the years, and that&rsquo;s what makes it so great: it&rsquo;s simple yet endlessly enjoyable. These days there are licensed Tamogatchi variations as well the more sophisticated Tamogatchi Pix. But when it comes to stocking stuffers, the original Tamogatchi is the one to get. Tamagotchi" data-dimension48="TamagotchiA&nbsp;Tamogatchi&nbsp;is a perfect stocking stuffer for adults and kids alike. Adults will love the nostalgia factor of feeding a Tamogatchi pet, while kids can learn lessons about caring for their digital creature. Not much has changed for the original Tamogatchi over the years, and that&rsquo;s what makes it so great: it&rsquo;s simple yet endlessly enjoyable. These days there are licensed Tamogatchi variations as well the more sophisticated Tamogatchi Pix. But when it comes to stocking stuffers, the original Tamogatchi is the one to get. Tamagotchi" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="400e55d6-ba1d-4c4c-beb2-1dad3153f87b" data-action="Deal Block" data-label="LEGO Christmas TreeLEGOs aren't just for the kiddos! Inspire some creativity amongst the adults by bringing this holiday set to the white elephant exchange. It features two building options &mdash; choose between a larger Christmas tree display model or two mini Christmas tree models. LEGO Christmas Tree" data-dimension48="LEGO Christmas TreeLEGOs aren't just for the kiddos! Inspire some creativity amongst the adults by bringing this holiday set to the white elephant exchange. It features two building options &mdash; choose between a larger Christmas tree display model or two mini Christmas tree models. LEGO Christmas Tree" href="https://www.amazon.com/Christmas-40573-Building-Decoration-Holiday/dp/B0BH1NP1TL/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:117.38%;"><img id="2pS2fVMmuiS8Cs7S9zz7F8" name="Lego Christmas" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2pS2fVMmuiS8Cs7S9zz7F8.jpg" mos="" align="middle" fullscreen="" width="679" height="797" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong></strong><a href="https://www.amazon.com/Christmas-40573-Building-Decoration-Holiday/dp/B0BH1NP1TL/" data-dimension112="400e55d6-ba1d-4c4c-beb2-1dad3153f87b" data-action="Deal Block" data-label="LEGO Christmas TreeLEGOs aren't just for the kiddos! Inspire some creativity amongst the adults by bringing this holiday set to the white elephant exchange. It features two building options &mdash; choose between a larger Christmas tree display model or two mini Christmas tree models. LEGO Christmas Tree" data-dimension48="LEGO Christmas TreeLEGOs aren't just for the kiddos! Inspire some creativity amongst the adults by bringing this holiday set to the white elephant exchange. It features two building options &mdash; choose between a larger Christmas tree display model or two mini Christmas tree models. LEGO Christmas Tree" data-dimension25=""><strong>LEGO Christmas Tree</strong></a><br>LEGOs aren't just for the kiddos! Inspire some creativity amongst the adults by bringing this holiday set to the white elephant exchange. It features two building options — choose between a larger Christmas tree display model or two mini Christmas tree models.<a class="view-deal button" href="https://www.amazon.com/Christmas-40573-Building-Decoration-Holiday/dp/B0BH1NP1TL/" target="_blank" rel="nofollow" data-dimension112="400e55d6-ba1d-4c4c-beb2-1dad3153f87b" data-action="Deal Block" data-label="LEGO Christmas TreeLEGOs aren't just for the kiddos! Inspire some creativity amongst the adults by bringing this holiday set to the white elephant exchange. It features two building options &mdash; choose between a larger Christmas tree display model or two mini Christmas tree models. LEGO Christmas Tree" data-dimension48="LEGO Christmas TreeLEGOs aren't just for the kiddos! Inspire some creativity amongst the adults by bringing this holiday set to the white elephant exchange. It features two building options &mdash; choose between a larger Christmas tree display model or two mini Christmas tree models. LEGO Christmas Tree" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="f606a0e3-ed61-4c72-8955-796ff13597ce" data-action="Deal Block" data-label="Ring Toss Game" data-dimension48="Ring Toss Game" href="https://www.amazon.com/Adults-Family-Friendly-Indoor-Holiday-Outdoor/dp/B0B4DX7ZM3/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:95.58%;"><img id="uLufpuNbWXwm5NiB7C3Xhe" name="Ring toss Game" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/uLufpuNbWXwm5NiB7C3Xhe.jpg" mos="" align="middle" fullscreen="" width="679" height="649" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://www.amazon.com/Adults-Family-Friendly-Indoor-Holiday-Outdoor/dp/B0B4DX7ZM3/" target="_blank" rel="nofollow" data-dimension112="f606a0e3-ed61-4c72-8955-796ff13597ce" data-action="Deal Block" data-label="Ring Toss Game" data-dimension48="Ring Toss Game" data-dimension25=""><strong>Ring Toss Game</strong></a><br>The ring toss game is a fantastic stocking stuffer and a guaranteed hit for family gatherings. I’ve played it countless times with friends and family — it’s fun, easy to set up and brings out everyone’s competitive side.<a class="view-deal button" href="https://www.amazon.com/Adults-Family-Friendly-Indoor-Holiday-Outdoor/dp/B0B4DX7ZM3/" target="_blank" rel="nofollow" data-dimension112="f606a0e3-ed61-4c72-8955-796ff13597ce" data-action="Deal Block" data-label="Ring Toss Game" data-dimension48="Ring Toss Game" data-dimension25="">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Membership Competition Terms ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/membership-competition-terms</link>
                                                                            <description>
                            <![CDATA[ Membership Competition Terms ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">bofk2otuT3rvwkfCBzMJuV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/yg9J3Mk8jD8R3LUEpiBiue-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Tue, 04 Nov 2025 10:10:55 +0000</pubDate>                                                                                                                                <updated>Mon, 10 Nov 2025 13:34:35 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tom&#039;s Guide ]]></dc:creator>                                                                                                        <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/yg9J3Mk8jD8R3LUEpiBiue-1280-80.png">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Power On To Win]]></media:description>                                                            <media:text><![CDATA[Power On To Win]]></media:text>
                                <media:title type="plain"><![CDATA[Power On To Win]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/yg9J3Mk8jD8R3LUEpiBiue-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>US competition can be <a href="https://www.tomsguide.com/tech/membership-competition">found here</a><br>UK competition can be <a href="https://www.tomsguide.com/uk/tech/membership-competition-uk">found here</a><br><br><br>The prize draw is organised and run by Future Publishing Ltd of Quay House, The Ambury, Bath, BA1 1UA, United Kingdom.</p><p>No purchase is required to enter.</p><p>The prize draw opens at 00:01 GMT on 04/11/25 and closes at 23:59 GMT on 02/12/25. Late or incomplete entries will not be accepted.</p><p>This draw is open to entrants who are over the age of 18 and who are residents in the UK or the US (excluding those in Rhode Island, Guam, Puerto Rico, the U.S. Virgin Islands, U.S. military installations in foreign countries, or any other U.S. territory where prohibited or restricted by law).</p><p>Employees of Future Plc and its group of companies ("Future") may not enter.</p><p>To enter, participants must sign up for membership. Upon registration, entrants will gain access to the competition. Each entrant will have one opportunity to click on a virtual device. If the device powers on, the entrant wins an instant prize. If it does not, they have not won. Only one attempt is permitted per person.</p><p>There will be a total of 23 winners in the UK and 23 winners in the US. The prizes are as follows:</p><p>UK Prizes:<br>Tier 1 – £100.00 Amazon Gift Card (1 winner)  <br>Tier 2 – £50.00 Amazon Gift Card (4 winners)  <br>Tier 3 – £25.00 Amazon Gift Card (8 winners)  <br>Tier 4 – £10.00 Amazon Gift Card (10 winners)  <br>Total UK value: £600.00<br><br>US Prizes:<br>Tier 1 – $100.00 Amazon Gift Card (1 winner)  <br>Tier 2 – $50.00 Amazon Gift Card (4 winners)  <br>Tier 3 – $25.00 Amazon Gift Card (8 winners)  <br>Tier 4 – $10.00 Amazon Gift Card (10 winners)  <br>Total US value: $600.00 (approx. £450.00)</p><p>Total prize value: £1,050.00</p><p>Winners will be instantly notified if they have won. Future will send a confirmatory email within 3 days, which will contain redemption arrangements for any digital prizes. Winners must claim their prize within <strong>7 days</strong> of being notified. If a prize is not claimed within this period, the organiser reserves the right to withdraw the prize and select an alternative winner or redistribute it as appropriate.</p><p>Future reserves the right to substitute any prize with an alternative of equivalent value.</p><p>The prize is non-transferable and non-refundable, with no cash alternative available.</p><p>Any person winning $600 or more in prizes within a calendar year will receive an Internal Revenue Service (IRS) Form 1099 after the year's end, and a copy will be filed with the IRS. Prize values may be taxable as income, and each winner is solely responsible for all applicable federal, state, and local taxes.</p><p>Future accepts no responsibility for entries not completed due to a technical fault (technical malfunction, computer hardware or software failure, satellite, network or server failure) of any kind OR if, for any reason, a technical interruption, fault, or site failure occurs when participating.</p><p>By participating in this prize draw, you agree to these terms and conditions, the competition rules at www.futureplc.com/competition-rules/, and the collection of personal data in accordance with Future’s privacy policy at https://www.futureplc.com/privacy-policy/.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Tom's Guide Membership Competition ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/membership-competition</link>
                                                                            <description>
                            <![CDATA[ Your chance to win ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">XQMYCZn9RniQ8syE3DRncQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/V59xQHnTruNr3fUCRgEWYB-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Tue, 04 Nov 2025 10:10:50 +0000</pubDate>                                                                                                                                <updated>Thu, 13 Nov 2025 15:10:53 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tom&#039;s Guide ]]></dc:creator>                                                                                                        <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/V59xQHnTruNr3fUCRgEWYB-1280-80.png">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[power on to win]]></media:description>                                                            <media:text><![CDATA[power on to win]]></media:text>
                                <media:title type="plain"><![CDATA[power on to win]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/V59xQHnTruNr3fUCRgEWYB-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OdqdJX"></div>                            </div>                            <script src="https://kwizly.com/embed/OdqdJX.js" async></script>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Membership Competition UK ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/membership-competition-uk</link>
                                                                            <description>
                            <![CDATA[ Membership Competition UK ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">YZAX7th2g5MgVwEXQrMPNk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MfXPY57HKzXVTHxLoEuCxc-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Tue, 04 Nov 2025 10:10:47 +0000</pubDate>                                                                                                                                <updated>Thu, 13 Nov 2025 15:10:53 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tom&#039;s Guide ]]></dc:creator>                                                                                                        <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/MfXPY57HKzXVTHxLoEuCxc-1280-80.png">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Membership Page Comp Banner]]></media:description>                                                            <media:text><![CDATA[Membership Page Comp Banner]]></media:text>
                                <media:title type="plain"><![CDATA[Membership Page Comp Banner]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MfXPY57HKzXVTHxLoEuCxc-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W02BNX"></div>                            </div>                            <script src="https://kwizly.com/embed/W02BNX.js" async></script>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Out of print soon: Save on select HP printers and PCs with the HP Tech Event at Staples, ends 11/01 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/out-of-print-soon-save-on-select-hp-printers-and-pcs-with-the-hp-tech-event-at-staples-ends-11-01</link>
                                                                            <description>
                            <![CDATA[ Don't miss big savings on HP's AI-powered PCs and printers ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">AozD8XPbrtjm3Wti3JkLsH</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/29DfmbfmZMJnjcQ2C6mB4W-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 30 Oct 2025 16:44:08 +0000</pubDate>                                                                                                                                <updated>Wed, 05 Nov 2025 10:58:49 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Benjamin Newman ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/pZ5sUP9JdBqbihXV75CARd.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/29DfmbfmZMJnjcQ2C6mB4W-1280-80.png">
                                                            <media:credit><![CDATA[Staples]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Staples promo photo]]></media:description>                                                            <media:text><![CDATA[Staples promo photo]]></media:text>
                                <media:title type="plain"><![CDATA[Staples promo photo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/29DfmbfmZMJnjcQ2C6mB4W-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>You can never go wrong with trusty Staples, and if you're currently looking for a new printer or AI-powered PC, then you definitely can't go wrong with them! For a limited time, get up to 35% off HP printers and up to 40% off AI-powered PCs exclusively at Staples. </p><p>Staples is currently hosting what it's calling the HP Tech Event, which, in your language, means unmissable savings on HP goodies. Tap into big savings on frustration-free printers and AI-powered PCs to bring your work or play to the next level. </p><p>With Black Friday around the corner, Staples has decided to start the celebrations early, and there are some unmissable deals on offer. But you need to be quick - these discounts are out of print soon, and you only have until 11/01 to get what you need. </p><h2 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h2><div class="product"><a data-dimension112="30d04ae6-2b1f-41c2-9d2a-8a67f210ea96" data-action="Deal Block" data-label="HP's OmniDesk Desktop is your value choice, with plenty of power for daily tasks, from streaming your favorite TV shows and films to just catching up on those daily tasks. Plenty of memory, reliable Wi-Fi tech, and a PC that screams "job done"." data-dimension48="HP's OmniDesk Desktop is your value choice, with plenty of power for daily tasks, from streaming your favorite TV shows and films to just catching up on those daily tasks. Plenty of memory, reliable Wi-Fi tech, and a PC that screams "job done"." data-dimension25="$499.99" href="https://www.staples.com/hp-omnidesk-desktop-computer-intel-core-i5-14400-16gb-ram-512gb-ssd-windows-11-home-mouse-keyboard-included/product_24635487?clickref=1100lBDZ9sV9&cid=AFF:Coupon%2FVoucher:markcomediamvc12&utm_medium=affiliate&utm_source=markcomediamvc12" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:512px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="CjLfu7zEG9sbrgXousdb5L" name="1000 x 1000 (14)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CjLfu7zEG9sbrgXousdb5L.png" mos="" align="middle" fullscreen="" width="512" height="512" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>HP's OmniDesk Desktop is your value choice, with plenty of power for daily tasks, from streaming your favorite TV shows and films to just catching up on those daily tasks. Plenty of memory, reliable Wi-Fi tech, and a PC that screams "job done". <a class="view-deal button" href="https://www.staples.com/hp-omnidesk-desktop-computer-intel-core-i5-14400-16gb-ram-512gb-ssd-windows-11-home-mouse-keyboard-included/product_24635487?clickref=1100lBDZ9sV9&cid=AFF:Coupon%2FVoucher:markcomediamvc12&utm_medium=affiliate&utm_source=markcomediamvc12" target="_blank" rel="nofollow" data-dimension112="30d04ae6-2b1f-41c2-9d2a-8a67f210ea96" data-action="Deal Block" data-label="HP's OmniDesk Desktop is your value choice, with plenty of power for daily tasks, from streaming your favorite TV shows and films to just catching up on those daily tasks. Plenty of memory, reliable Wi-Fi tech, and a PC that screams "job done"." data-dimension48="HP's OmniDesk Desktop is your value choice, with plenty of power for daily tasks, from streaming your favorite TV shows and films to just catching up on those daily tasks. Plenty of memory, reliable Wi-Fi tech, and a PC that screams "job done"." data-dimension25="$499.99">View Deal</a></p></div><div class="product"><a data-dimension112="621641aa-14ff-415a-bce2-368e05077c97" data-action="Deal Block" data-label="The HP OfficeJet Pro is a productivity powerhouse, with a 250-page input tray, a design that's built on team efficiency and easy integration with cloud storage services like Google Drive or OneDrive. With this deal, you don't just save on price; you save on time. You can also get 50% back in Easy Reward points when you checkout." data-dimension48="The HP OfficeJet Pro is a productivity powerhouse, with a 250-page input tray, a design that's built on team efficiency and easy integration with cloud storage services like Google Drive or OneDrive. With this deal, you don't just save on price; you save on time. You can also get 50% back in Easy Reward points when you checkout." data-dimension25="$159.99" href="https://www.staples.com/hp-officejet-pro-8135e-inkjet-printer-all-in-one-print-copy-scan-fax-40q35a-b1h/product_24583383?clickref=1100lBDZ9tVR&cid=AFF:Coupon%2FVoucher:markcomediamvc12&utm_medium=affiliate&utm_source=markcomediamvc12" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:512px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="u3NmVXwvRSjDHdKeYGFKwm" name="1000 x 1000 (15)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/u3NmVXwvRSjDHdKeYGFKwm.png" mos="" align="middle" fullscreen="" width="512" height="512" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The HP OfficeJet Pro is a productivity powerhouse, with a 250-page input tray, a design that's built on team efficiency and easy integration with cloud storage services like Google Drive or OneDrive. With this deal, you don't just save on price; you save on time. You can also get 50% back in Easy Reward points when you checkout.<a class="view-deal button" href="https://www.staples.com/hp-officejet-pro-8135e-inkjet-printer-all-in-one-print-copy-scan-fax-40q35a-b1h/product_24583383?clickref=1100lBDZ9tVR&cid=AFF:Coupon%2FVoucher:markcomediamvc12&utm_medium=affiliate&utm_source=markcomediamvc12" target="_blank" rel="nofollow" data-dimension112="621641aa-14ff-415a-bce2-368e05077c97" data-action="Deal Block" data-label="The HP OfficeJet Pro is a productivity powerhouse, with a 250-page input tray, a design that's built on team efficiency and easy integration with cloud storage services like Google Drive or OneDrive. With this deal, you don't just save on price; you save on time. You can also get 50% back in Easy Reward points when you checkout." data-dimension48="The HP OfficeJet Pro is a productivity powerhouse, with a 250-page input tray, a design that's built on team efficiency and easy integration with cloud storage services like Google Drive or OneDrive. With this deal, you don't just save on price; you save on time. You can also get 50% back in Easy Reward points when you checkout." data-dimension25="$159.99">View Deal</a></p></div><div class="product"><a data-dimension112="41eddb6b-f5d3-4498-84d9-f758afe72cbd" data-action="Deal Block" data-label="The HP OmniBook 5 is powered by the excellent AMD Ryzen™ AI 300 Series Processor, meaning you can multitask and stay efficient wherever you are. It's your new laptop if you want something that matches your well-organized energy." data-dimension48="The HP OmniBook 5 is powered by the excellent AMD Ryzen™ AI 300 Series Processor, meaning you can multitask and stay efficient wherever you are. It's your new laptop if you want something that matches your well-organized energy." data-dimension25="$549.99" href="https://www.staples.com/hp-omnibook-5-16-2k-laptop-copilot-pc-intel-core-ultra-7-255u-16gb-ram-1tb-ssd-19-25-hours-battery-windows-11-home/product_24631636?clickref=1101lBS7XA5f&cid=AFF:Coupon%2FVoucher:markcomediamvc12&utm_medium=affiliate&utm_source=markcomediamvc12" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:512px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="2GUhhrs8VfsDHSp8yPUAH5" name="1000 x 1000 (16)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2GUhhrs8VfsDHSp8yPUAH5.png" mos="" align="middle" fullscreen="" width="512" height="512" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The HP OmniBook 5 is powered by the excellent AMD Ryzen™ AI 300 Series Processor, meaning you can multitask and stay efficient wherever you are. It's your new laptop if you want something that matches your well-organized energy. <a class="view-deal button" href="https://www.staples.com/hp-omnibook-5-16-2k-laptop-copilot-pc-intel-core-ultra-7-255u-16gb-ram-1tb-ssd-19-25-hours-battery-windows-11-home/product_24631636?clickref=1101lBS7XA5f&cid=AFF:Coupon%2FVoucher:markcomediamvc12&utm_medium=affiliate&utm_source=markcomediamvc12" target="_blank" rel="nofollow" data-dimension112="41eddb6b-f5d3-4498-84d9-f758afe72cbd" data-action="Deal Block" data-label="The HP OmniBook 5 is powered by the excellent AMD Ryzen™ AI 300 Series Processor, meaning you can multitask and stay efficient wherever you are. It's your new laptop if you want something that matches your well-organized energy." data-dimension48="The HP OmniBook 5 is powered by the excellent AMD Ryzen™ AI 300 Series Processor, meaning you can multitask and stay efficient wherever you are. It's your new laptop if you want something that matches your well-organized energy." data-dimension25="$549.99">View Deal</a></p></div><div class="product"><a data-dimension112="3a02b70a-bda0-43e2-a043-7fa73efbe103" data-action="Deal Block" data-label="You may think flip laptops are flimsy, but the HP OmniBook 7 Flip has endured military-grade standard testing to deliver an all-in-one package that's built to last while consistently upgrading your performance and efficiency." data-dimension48="You may think flip laptops are flimsy, but the HP OmniBook 7 Flip has endured military-grade standard testing to deliver an all-in-one package that's built to last while consistently upgrading your performance and efficiency." data-dimension25="$549.99" href="https://www.staples.com/hp-omnibook-7-flip-16-led-2-in-1-ai-laptop-copilot-pc-intel-core-ultra-5-4-5-ghz-16gb-ram-512gb-ssd-windows-11/product_24632150?clickref=1100lBDZ9utH&cid=AFF:Coupon%2FVoucher:markcomediamvc12&utm_medium=affiliate&utm_source=markcomediamvc12" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:512px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="7KCEqPEuzsJZkMhbs4iaKC" name="1000 x 1000 (17)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7KCEqPEuzsJZkMhbs4iaKC.png" mos="" align="middle" fullscreen="" width="512" height="512" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>You may think flip laptops are flimsy, but the HP OmniBook 7 Flip has endured military-grade standard testing to deliver an all-in-one package that's built to last while consistently upgrading your performance and efficiency. <a class="view-deal button" href="https://www.staples.com/hp-omnibook-7-flip-16-led-2-in-1-ai-laptop-copilot-pc-intel-core-ultra-5-4-5-ghz-16gb-ram-512gb-ssd-windows-11/product_24632150?clickref=1100lBDZ9utH&cid=AFF:Coupon%2FVoucher:markcomediamvc12&utm_medium=affiliate&utm_source=markcomediamvc12" target="_blank" rel="nofollow" data-dimension112="3a02b70a-bda0-43e2-a043-7fa73efbe103" data-action="Deal Block" data-label="You may think flip laptops are flimsy, but the HP OmniBook 7 Flip has endured military-grade standard testing to deliver an all-in-one package that's built to last while consistently upgrading your performance and efficiency." data-dimension48="You may think flip laptops are flimsy, but the HP OmniBook 7 Flip has endured military-grade standard testing to deliver an all-in-one package that's built to last while consistently upgrading your performance and efficiency." data-dimension25="$549.99">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Chipolo Pop review: A great Android alternative to Apple's AirTag ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/chipolo-pop-review</link>
                                                                            <description>
                            <![CDATA[ The Chipolo Pop brings a loud alarm and support for the find networks offered to both iPhone and Android devices. Through in some colorful options and an easy-to-attach design, and this is a good choice if you want a reliable key finder. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">eCZED9WsWUyYyYBheAWGP5</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/cSX9NMu4uNCYEH6xiCmF4m-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 28 Oct 2025 15:46:02 +0000</pubDate>                                                                                                                                <updated>Thu, 04 Jun 2026 12:51:34 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/cSX9NMu4uNCYEH6xiCmF4m-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[chipolo pop and Apple airtag in front of garden background]]></media:description>                                                            <media:text><![CDATA[chipolo pop and Apple airtag in front of garden background]]></media:text>
                                <media:title type="plain"><![CDATA[chipolo pop and Apple airtag in front of garden background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/cSX9NMu4uNCYEH6xiCmF4m-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When you're on the hunt for the <a href="https://www.tomsguide.com/us/best-key-finders,review-2657.html">best key finders</a>, don't<a href="https://www.tomsguide.com/us/best-key-finders,review-2657.html"> </a>overlook Chipolo, especially if you've got an Android phone. Chipolo's trackers like the Chipolo Pop that I use can connect to Google's Find Hub, so that other nearby Android phones can help find any tagged item you've lost.</p><div  class="fancy-box"><div class="fancy_box-title">Chipolo Pop Specs</div><div class="fancy_box_body"><p class="fancy-box__body-text">• <strong>Size: </strong>1.53 inches in diameter<br>•<strong> Listed range:</strong> 300 feet<br>• <strong>Tested range: </strong>35 feet<br>• <strong>Water resistance:</strong> IP55<br>• <strong>Battery:</strong> Replaceable CR2032<br>• <strong>Colors:</strong> 6 options</p></div></div><p>The Chipolo Pop offers more than just added coverage for Android users. This tracker works with Apple's Find My feature, too, so it's just as valuable to iPhone owners. Other appealing features include helpful out-of-range alerts, a loud alarm and some eye-catching colors that will make your key finder stand out.</p><p>My Chipolo Pop review takes a closer look at why this Bluetooth tracking devices belongs on the end of your keychain.</p><h3 class="article-body__section" id="section-chipolo-pop-review-price-and-availability"><span>Chipolo Pop review: Price and availability</span></h3><p>The Chipolo Pop costs $29, which is a few dollars more than the <a href="https://www.tomsguide.com/tech/tile-mate-2024-review">Tile Mate</a>, our top pick among key finders, but $6 cheaper than the more fully featured <a href="https://www.tomsguide.com/tech/tile-pro-2024-review">Tile Pro</a>. </p><p>Apple also charges $29 for its <a href="https://www.tomsguide.com/reviews/apple-airtags">AirTag</a> key finder, though that device only works with iPhones. The Chipolo Pop is compatible with both the iPhone and Android devices. </p><p>The AirTag and Tile Pro feature just one color option, while Chipolo recognizes that variety is the spice of life. You can pick between six different colors — blue, yellow, red, green, white and black — and you can buy Chipolo Pops in packs of four and six at a slight discount.</p><h3 class="article-body__section" id="section-chipolo-pop-review-design-and-features"><span>Chipolo Pop review: Design and features</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2151px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Gtq5SWgWqURH4uPprhjnjm" name="PXL_20250811_104353313" alt="chipolo pop and Apple airtag in front of garden background" src="https://cdn.mos.cms.futurecdn.net/Gtq5SWgWqURH4uPprhjnjm.jpg" mos="" align="middle" fullscreen="" width="2151" height="1210" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Chipolo has long been in the tracking fob business, comparing well to trackers from Tile, Apple and Samsung. The Pop continues that tradition.</p><p>It's a circular fob, 1.53 inches in diameter and roughly a quarter-inch thick. That makes it a little bit larger than the 1.26-inch AirTag, though Apple's tracker is marginally thicker than the Chipolo Pop.</p><p>The bottom line is that the Chipolo Pop doesn't add unnecessary bulk to your key chain. I also appreciate that it comes with a keyring hole, which made it easy to attach to my keys.</p><p>For the most part, the Pop acts much like any other key finder. If you lost it, or you need to make sure it is where you think it is, you simply head into your finder app and hunt it down — and force it to play a sound if you still don't know where it is. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:59.79%;"><img id="zazJpV6ptPdMeAYWnksGW8" name="chipolo-screens" alt="Chipolo pop software with Google Find Hub" src="https://cdn.mos.cms.futurecdn.net/zazJpV6ptPdMeAYWnksGW8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1148" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Chipolo offers its own app (<a href="https://play.google.com/store/apps/details?id=chipolo.net.v3&hl=en_US" target="_blank" rel="nofollow">Android</a>, <a href="https://apps.apple.com/us/app/chipolo/id651447811" target="_blank" rel="nofollow">iOS</a>), and you can also connect to Google's Find Hub or Apple's Find My, though not at the same time. Nevertheless, from your phone, you're able to tap a button to make the Chipolo Pop sound an alarm to help you find your lost item.</p><p>And take it from me — you're definitely going to hear that alarm. Chipolo says it's rated at 120 decibels, making it among the loudest key finders we've tested. I certainly have no problem hearing the alert over any background noise.</p><p>The Chipolo Pop runs on the same CR2032 coin battery as the AirTag, which is supposed to last around a year before it needs replacing. And, like Apple, it alerts you when you leave it behind — <a href="https://www.tomsguide.com/reviews/tile-pro-key-finder">a feature Tile prefers to charge you for</a>.</p><h3 class="article-body__section" id="section-chipolo-pop-review-peformance"><span>Chipolo Pop review: Peformance</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2170px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="yx2ymQuRBQ3LY8DXXYiDkm" name="PXL_20250811_104239678" alt="chipolo pop and Apple airtag in front of garden background" src="https://cdn.mos.cms.futurecdn.net/yx2ymQuRBQ3LY8DXXYiDkm.jpg" mos="" align="middle" fullscreen="" width="2170" height="1221" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Chipolo Pop lacks something you'll find on trackers like the AirTag and Samsung's <a href="https://www.tomsguide.com/tech/samsung-galaxy-smarttag-2-review">Galaxy SmartTag 2</a> — Ultra Wideband support. That feature offers more precise location tracking, so if that's a must-have for you, you'll want to consider alternatives to the Chipolo Pop.</p><p>Instead, the Pop uses its Bluetooth connection and loud alarm to help you find lost items. Chipolo says range is around 300 feet, though in my test, 35 feet was a more common range. That difference between promised and actual range is not uncommon for key trackers, incidentally — the Tile Mate lists a range of 350 feet that was closer to 65 feet in our testing. Still, the Chipolo Pop's performance was on the shorter end of devices we've tested.</p><p>I do think the alerts the Chipolo Pop sends to your phone when you go out of range are helpful, and if you double-press the Pop, you can sound an alarm on your phone for nifty two-way find capabilities. The Chipolo Pop can also double as a remote shutter button for your phone's camera, too, though only via the Chipolo app and not the phone's main camera app.</p><h3 class="article-body__section" id="section-chipolo-pop-review-verdict"><span>Chipolo Pop review: Verdict</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nwDkMJxDAQL8bTGtaSkSh8" name="chipolo-pop-in-hand" alt="Chipolo Pop on keychain in hand" src="https://cdn.mos.cms.futurecdn.net/nwDkMJxDAQL8bTGtaSkSh8.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>There are a lot of options if you're looking for some kind of tracker for your stuff. They all have their respective pros and cons, like special features or the ability to loop into Google and Apple's own tracking networks.</p><p>Naturally as someone who primarily uses Android phones, an AirTag has limited value for me. Having an Android friendly option is considerably more convenient, especially if it means not <a href="https://www.tomsguide.com/tech/the-airtag-in-my-suitcase-failed-me-when-i-needed-it-most-but-it-was-entirely-my-fault">keeping it hidden in my suitcase 90% of the time.</a></p><p>The Chipolo Pop may not be the most advanced key finder out there, but it does what it needs to do, and with a few extra features rolled in to sweeten the deal.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Buttonless iPhone on the horizon, massive Amazon layoffs and more: today's Tech News LIVE ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/news/live/tech-news-today-live-updates-10-28-2025</link>
                                                                            <description>
                            <![CDATA[ The tech world moves fast, and we're following it closely to bring you the biggest stories as they happen. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">MyhAUSJC4Wpjsad35bLuoH</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/PuHCN8Pt2yPDfQcsrPYcKZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 28 Oct 2025 13:29:50 +0000</pubDate>                                                                                                                                <updated>Tue, 28 Oct 2025 16:56:45 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></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 Senior 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/PuHCN8Pt2yPDfQcsrPYcKZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Samsung / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Images of products]]></media:description>                                                            <media:text><![CDATA[Images of products]]></media:text>
                                <media:title type="plain"><![CDATA[Images of products]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/PuHCN8Pt2yPDfQcsrPYcKZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>In the battle of AI vs humans, humans just lost another round. Amazon has announced that it's laying off a whopping 14,000 corporate workers as it accelerates its AI push. </p><p>And that's just one of the biggest tech headlines we're following today here at Tom's Guide.</p><p>We may have just gotten our first look at the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-tri-fold-7-biggest-rumors-so-far">Samsung Galaxy Tri-Fold</a>, which has already been tipped to launch this year. Meanwhile, OpenAI is being attacked on multiple fronts from both Anthropic and Google Gemini. And we're tracking the best early Black Friday tech deals, including 50% off sales at Amazon and Walmart.</p><p>Here's the biggest tech news you need to know right now, with updates all day as new stories break.</p><h3 class="article-body__section" id="section-today-s-tech-news-live-updates-as-they-happen"><span>Today's tech news — Live updates as they happen</span></h3><h2 id="samsung-tri-fold-leaks-in-full">Samsung Tri-fold leaks in full</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:47.13%;"><img id="pdvvBtDoLWFPqvdrA7iLoj" name="ezgif-5076454e9b93db" alt="samsung galaxy tri-fold folding design gif" src="https://cdn.mos.cms.futurecdn.net/pdvvBtDoLWFPqvdrA7iLoj.gif" mos="" align="middle" fullscreen="" width="800" height="377" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Weibo)</span></figcaption></figure><p>Samsung hasn't done the best job keeping its tri-fold smartphone under wraps. It seems like once a week, something significant comes out, telling us more about the device. It's almost like the company could be drip-feeding information to build anticipation. Or it just has a leaker putting information out to the world.</p><p>The latest leak provides a full first look at the Samsung Galaxy Tri-Fold. Noted leaker Ice Universe shared the latest images, which show off Samsung's worst-kept secret: the full-triple-screen display and the folded version of the phone. </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:1795px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="naZV87bNhYYiruPuMWHC4h" name="Screenshot 2025-10-28 104908" alt="Samsung Galaxy tri-fold ice universe" src="https://cdn.mos.cms.futurecdn.net/naZV87bNhYYiruPuMWHC4h.png" mos="" align="middle" fullscreen="" width="1795" height="1010" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Ice Universe)</span></figcaption></figure><p>And it's not just one leak. Korean news outlet <a href="https://www.dailian.co.kr/news/view/1564963/" target="_blank">Dailian</a> also published what appear to be images of the same large-screen device, while <a href="https://www.androidauthority.com/samsung-galaxy-tri-fold-leak-3610686/" target="_blank">Android Authority</a> found a video of the same display that has a watermark from an unknown Weibo account. Three leaks in one day for the same device is quite impressive and might be the most I've ever seen — and it's still early in the morning in the U.S. </p><p>In the video, we can see the device unfold from the middle panel and fold back in on itself. It's a design I wasn't quite expecting, but it's interesting nevertheless. </p><p>We'll have to wait for Samsung to officially announce the device to know for sure if what we're seeing here is real, but for the time being, it all looks legitimate enough, especially with reliable sources like IceUniverse and Android Authority providing the leaks.</p><p><strong></strong><a href="https://www.tomsguide.com/phones/samsung-phones/heres-our-first-look-at-the-samsung-galaxy-tri-fold-and-everything-we-can-figure-out-from-it" target="_blank"><strong>Read More</strong></a></p><h2 id="could-openai-lose-the-ai-race">Could OpenAI lose the AI race?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4080px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JJRERgoMoG89VPQroNSv3h" name="shutterstock_2443144493-2" alt="Claude on phone with Anthropic logo in the background" src="https://cdn.mos.cms.futurecdn.net/JJRERgoMoG89VPQroNSv3h.jpg" mos="" align="middle" fullscreen="" width="4080" height="2295" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>As unlikely as it seems, OpenAI appears to be losing the AI race to Anthropic, as the underdog appears to be on the rise. Anthropic and its Claude chatbot may keep a lower profile than OpenAI's ChatGPT, but don't let that fool you — it's a serious contender in the space.</p><p>Instead of image generation and videos, Anthropic focuses on like <a href="https://www.tomsguide.com/ai/i-write-about-ai-for-a-living-and-vibe-coding-is-going-to-change-everything-heres-why">vibe coding</a> (writing code with AI prompts), logical reasoning, and helping to perfect academic writing. They're very different use cases, but it seems to be helping Anthropic move ahead in some big ways.</p><p>What really separates the two companies is where their income comes from — OpenAI gets as much as 70% of its revenue from consumers. Anthropic, on the other hand, has stated that roughly 80% of its revenue comes from corporate partners. Those are very different business models. </p><p>And with those business models, Anthropic has a run rate of $7 billion, compared to OpenAI’s $9 billion by the end of this year. Even though Anthropic is smaller, it's making massive profits with its business partnerships.</p><p>Because OpenAI relies on a more fickle public, it needs to develop new tools, features, and add-ons. Compared to Anthropic, the company consistently releases new features for ChatGPT while Claude sees a much slower rollout.</p><p>It might not be a flashy approach, or one that draws the same attention as OpenAI, but Anthropic might have the answer many companies are looking for: how do you make money in the world of AI? The answer could be business-to-business.</p><p><a href="https://www.tomsguide.com/ai/anthropic-is-leading-the-ai-race-and-its-all-thanks-to-this-one-problem-openai-cant-solve" target="_blank"><strong>Read More</strong></a></p><h2 id="ai-is-taking-jobs-at-amazon">AI is taking jobs at 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vC9P2bqda3PziJheWYNmd" name="Amazon.shutterstock_1538930117" alt="Amazon logo on a building" src="https://cdn.mos.cms.futurecdn.net/vC9P2bqda3PziJheWYNmd.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Amazon is set to make 14,000 humans redundant as it "innovates much faster" thanks to AI. That's a lot of jobs lost to AI, which is a fear many people have expressed as AI becomes smarter and more useful.</p><p>These cuts are believed to be focused on Amazon's corporate roles rather than on warehouse or delivery staff, and they take hold as the company looks to streamline its operations through the power of AI.</p><p>A memo to Amazon staff from Beth Galetti, Senior Vice President of People Experience and Technology at Amazon, shared the bad news. </p><p>"Some may ask why we’re reducing roles when the company is performing well," she wrote.</p><p>"What we need to remember is that the world is changing quickly. This generation of AI is the most transformative technology we’ve seen since the Internet, and it's enabling companies to innovate much faster than ever before (in existing market segments and altogether new ones)," the memo continued.</p><p>"We’re convicted that we need to be organized more leanly, with fewer layers and more ownership, to move as quickly as possible for our customers and business."</p><p>As nice as it sounds to "remember that the world is changing," that doesn't help the 14,000 people who are or will be jobless in the near future. On the bright side, the company says it will give affected employees 90 days to find a new role, and those unable to do so will receive severance pay, outplacement services, and health insurance benefits. While this will soften the blow compared to some layoffs where no extra time is given, it's still going to put a strain the job market and cause tremendous stress for the affected individuals.</p><p><a href="https://www.tomsguide.com/ai/amazon-set-to-make-up-to-14-000-humans-redundant-as-it-innovates-much-faster-with-ai" target="_blank"><strong>Read More</strong></a></p><h2 id="iphone-18-a-reason-to-go-pro">iPhone 18 — a reason to go pro</h2><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="3AtKai2daxEQnsyYJVZpdi" name="iPhone 17 Pro and Max-17" alt="iPhone 17 Pro and Pro Max" src="https://cdn.mos.cms.futurecdn.net/3AtKai2daxEQnsyYJVZpdi.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>We're only a month into the iPhone 17's life, but that hasn't stopped leakers from already releasing information about the iPhone 18. According to leaker Digital Chat Station, a variable aperture camera could be coming to the iPhone 18 Pro Max. However, the game-changing camera feature may not be available on the iPhone 18 Pro as rumors previously suggested.</p><p>Generally, Apple keeps the differences between the Pro and Pro Max pretty subtle, focusing more on size than features (this isn't always the case, but in recent models it has been). For such a huge camera feature to be left behind would be surprising. Of course, we're almost a year away from the phones launching, so anything could change between now and then.</p><p><a href="https://www.tomsguide.com/phones/iphones/apple-iphone-18-rumored-to-get-variable-aperture-lens-on-main-camera-why-that-matters">Variable aperture</a> means the user can adjust the amount of light entering the camera lens, which can be a big upgrade for photographs.</p><p><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-camera-may-get-this-major-upgrade-but-why-isnt-iphone-18-pro-getting-it-too" target="_blank"><strong>Read More</strong></a></p><h2 id="new-fitbit-on-the-way">New Fitbit on the way</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3790px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="n5FKTsawUjSGD8VyN8SHVg" name="BestFitibit-25-26" alt="Close-up of the Pixel Watch 4, Fitbit Charge 6 and Gamin Vivoactive 6" src="https://cdn.mos.cms.futurecdn.net/n5FKTsawUjSGD8VyN8SHVg.jpg" mos="" align="middle" fullscreen="" width="3790" height="2132" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Google has said that Fitbit is working on new hardware with a 2026 release window. Additionally, the Fitbit app is getting a massive AI overhaul, which should come as no surprise.</p><p>When Google says new Fitbit hardware is coming, does that mean an update to an existing Fitbit model, or an entirely new Fitbit form factor? Time will tell, but it's likely an update of an existing model.</p><p>The app update sounds promising, seamlessly integrating a Gemini-powered AI wellness coach into a more visually appealing platform with friendlier graphs, more intelligently organized data, and enhanced user customization. </p><p><a href="https://www.tomsguide.com/wellness/fitness-trackers/google-says-new-fitbit-hardware-is-coming-in-2026" target="_blank"><strong>Read More</strong></a></p><h2 id="nvidia-live-news">Nvidia live news</h2><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="zRkHt66BqQZ82PNnXPcapC" name="Nvidia GeForce RTX 4070 chip" alt="Nvidia GeForce RTX 4070 chip on black background" src="https://cdn.mos.cms.futurecdn.net/zRkHt66BqQZ82PNnXPcapC.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nvidia)</span></figcaption></figure><p>If you can't get enough live news, we're also covering the Nvidia GTC event live. The Nvidia CEO Jensen Huang will share what’s next for AI, robotics and GPUs, so exciting things are ahead.</p><p>Specifics of GTC announcements are kept pretty secret until Jensen takes the stage. But as we've learnt from the past three keynotes, it's worth paying attention to where the $4 trillion is right now — both in product development and (specifically) the location where the keynote is being held.</p><p><a href="https://www.tomsguide.com/computing/live/nvidia-gtc-october-2025-live" target="_blank"><strong>Follow along live</strong></a></p><h2 id="no-more-buttons-on-iphone">No more buttons on iPhone?! </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HpQhszZX6MChtZcTeed92J" name="iPhone 17 vs iPhone Air-3" alt="iPhone 17 and iPhone Air thickness compared" src="https://cdn.mos.cms.futurecdn.net/HpQhszZX6MChtZcTeed92J.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is a bit of news I didn't expect to see, but according to a new report from leaker Instant Digital, Apple might ditch the button on the 20th-anniversary iPhone. The company will instead use haptics to perform the same functions that buttons would. </p><p>The leak says that Apple's solid-state button design has completed functional verification. The update would replace the Side button, volume buttons, Action button, and Camera Control button with haptic feedback.</p><p>If this rumor is correct, the current design will integrate buttons directly into the device frame with zero physical movement when pressed. However, the report also says that Apple wants to make these buttons feel like real buttons, using the back panel or frame to produce audio, combined with an AI-based sound compensation algorithm. </p><p>It sounds interesting, and it could open the door to a wraparound display. It could also be annoying for those used to real buttons, depending on how well Apple makes it feel authentic. </p><h2 id="gemini-also-catching-chatgpt">Gemini also catching ChatGPT</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wDUATUTpPSFY8y4n9UB4De" name="gemini.shutterstock_2570446691" alt="Gemini logo on smartphone with the Google logo behind" src="https://cdn.mos.cms.futurecdn.net/wDUATUTpPSFY8y4n9UB4De.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Google has made significant improvements to Gemini recently. As such, the chatbot is rapidly becoming more popular. In fact, Google's Gemini domain, gemini.google.com, has more than doubled over the past year, according to new data from data aggregation company <a href="https://x.com/Similarweb/status/1979863740670480674?utm_source=superhuman&utm_medium=newsletter&utm_campaign=chatgpt-for-doctors-hits-6b-valuation&_bhlid=8a5477cec0b0f023fc6a017f6a2c42f225b246c7" target="_blank">Similarweb</a>.</p><p>In total, the Gemini webpage now makes 12.9% of total web traffic to generative AI tools. That's bumped from 6.4% in 2024. </p><p>And as good as that sounds, ChatGPT makes 74% of total chatbot web traffic, absolutely dwarfing Google and all of the other big players in the space. But doubling the views is nothing to scoff at, and it shows that at least some users are willing to migrate if they don't like ChatGPT's results.</p><p>Traffic to xAI's Grok has dropped from 3.1% to 2%. While it's a small amount, when the service was already so low in total traffic to begin with, it's almost certainly noticeable for the Musk-backed AI tool. Microsoft Copilot hasn't changed much, currently accounting for 1.2% of total generative AI traffic according to Similarweb's data..</p><h2 id="pro-ipad-apps">Pro iPad apps</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gg3FL9fcAZKMxSt47aMixC" name="iPad Pro M5--05" alt="iPad Pro M5" src="https://cdn.mos.cms.futurecdn.net/gg3FL9fcAZKMxSt47aMixC.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The iPad looks to be receiving some new apps in the near future, as a rumor has emerged suggesting that Apple plans to release four new apps targeted at pro users.</p><p>According to a report from MacRumors, four apps have "new App Store IDs," which is usually a sign that they're on the way. </p><p>Here are the apps: </p><ul><li>Compressor: A tool for media encoding and delivery used to customize how media is exported in Final Cut</li><li>Motion: A motion graphics tool for creating titles, transitions, and visual effects that work with Final Cut</li><li>MainStage: A companion app for Logic Pro used for live performances and customizable on-stage instrument and vocal setups</li><li>Pixelmator Pro: An upgrade to the free Pixelmator iPad app with features more like the Mac version.</li></ul><p>While the clues are there for the app names and functions, there's no rumored date for these apps to hit iPad but we'll keep an eye out for you.</p><h2 id="biggest-story-so-far">Biggest story so far?</h2><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-e4b74O"></div>                            </div>                            <script src="https://kwizly.com/embed/e4b74O.js" async></script><h2 id="galaxy-z-fold8-details-potentially-emerge">Galaxy Z Fold8 details potentially emerge</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mMrDpLDhYeu5yW3kUfwXHT" name="Z fold 7 Gemini" alt="Galaxy Z Fold 7 gemini" src="https://cdn.mos.cms.futurecdn.net/mMrDpLDhYeu5yW3kUfwXHT.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you're looking forward to Samsung's next round of foldable phones, you have a bit of waiting left to do. But if you're starved for details, the latest leak provides specs on the screen and battery capacity, both critical to the phone's performance.</p><p>The leak (via <a href="https://www.gsmarena.com/galaxy_z_fold8_display_and_battery_details_leaked-news-70055.php" target="_blank">GSM Arena</a>) suggests that Samsung will use a new ‘laser-drilling metal plate technology’ for the Galaxy Z Fold8's hinge, which could reduce the crease, one of the things holding many back from adopting the foldable lifestyle.</p><p>The rumor claims the battery will be more than 5,000 mAh, a significant bump from the Galaxy Z Fold7's 4,400 mAh cell. </p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How the AWS outage happened — and why it's broke the internet  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/how-the-aws-outage-happened-and-why-its-breaking-the-internet</link>
                                                                            <description>
                            <![CDATA[ A massive AWS outage took down parts of the internet today — from Alexa and Snapchat to Fortnite and banking apps. Here’s what really happened, and why one small glitch caused such big chaos. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">MyprN6R5RUMcjZHcp348FA</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/SYq8hTpCqCrXJvtHE4wzxN-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 20 Oct 2025 18:06:57 +0000</pubDate>                                                                                                                                <updated>Tue, 21 Oct 2025 13:49:19 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></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/bpYbd7AokUKfGGbNp8LHka.png ]]></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/SYq8hTpCqCrXJvtHE4wzxN-1280-80.jpg">
                                                            <media:credit><![CDATA[Sundry Photography | Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close up of AWS sign at their offices in SOMA district]]></media:description>                                                            <media:text><![CDATA[Close up of AWS sign at their offices in SOMA district]]></media:text>
                                <media:title type="plain"><![CDATA[Close up of AWS sign at their offices in SOMA district]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/SYq8hTpCqCrXJvtHE4wzxN-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Early Monday morning, October 20, 2025, millions of users woke up to broken apps, frozen devices and websites that simply wouldn’t load as a result of an <a href="https://www.tomsguide.com/news/live/amazon-outage-october-2025">AWS outage we're tracking live</a>. Services like <a href="https://www.tomsguide.com/news/live/snapchat-outage-live-october-20">Snapchat</a>, Ring, Alexa, Fortnite and even some online banking services went dark for several hours — all because of one cloud region in Northern Virginia.</p><p>AWS says the culprit was a DNS issue inside its DynamoDB service, which caused a chain reaction that rippled across the web. In simpler terms: one of the internet’s core address books temporarily lost track of where critical servers lived. Here’s how it happened — and why the effects were so massive.</p><h2 id="a-small-failure-in-a-big-place">A small failure in a big place</h2><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="RUWx2p9pXDJg8i4FegKFuB" name="connections in a data center.jpg" alt="Connections plugged into a server in a data center" src="https://cdn.mos.cms.futurecdn.net/RUWx2p9pXDJg8i4FegKFuB.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>Around 3:10 a.m. ET, engineers at AWS’s us-east-1 data center (its busiest region) started seeing errors pile up. DynamoDB, a key database service used by thousands of apps, suddenly couldn’t be reached because its DNS records weren’t resolving.<br><br>If DNS is like the contact list of the internet, then this was a case of missing every number at once. Apps couldn’t find their databases. Websites couldn’t reach their login systems. Smart home devices couldn’t even phone home.</p><p>AWS said the problem was fully mitigated by 5:24 a.m. ET, but not before millions of requests failed, backups formed and connected services began to buckle under retries.</p><h2 id="the-domino-effect-of-a-cloud-collapse">The domino effect of a cloud collapse</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hcGNtkdcTb7hJSkxmfLfV8" name="cloud-service-hero---Shutterstock.jpg" alt="Best Cloud Backup Services 2019" src="https://cdn.mos.cms.futurecdn.net/hcGNtkdcTb7hJSkxmfLfV8.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Although AWS is Amazon’s own cloud computing backbone, it powers far more than Amazon itself. Companies across the world rely on its servers, storage and databases to stay online — including many services you probably use every day.</p><p>When DynamoDB went down, so did the services built on top of it. That included streaming apps, online games, and even smart devices like Alexa speakers and Ring doorbells.</p><p>And because AWS’s Northern Virginia region also handles core management tasks for the platform, the failure spread quickly. Even companies hosting data in other AWS regions still depend on us-east-1 for certain background operations. So, when it hiccups, everyone feels it.</p><p>Put simply, this wasn’t one company going down. It was part of the internet’s backbone falling out from under it.</p><h2 id="why-dns-problems-hit-harder-than-most">Why DNS problems hit harder than most</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="29dmR5MpipRsceh3WVc54H" name="aws outage edit 2" alt="Venmo, Amazon and AWS logos" src="https://cdn.mos.cms.futurecdn.net/29dmR5MpipRsceh3WVc54H.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>DNS (Domain Name System) is what turns a readable name — like <a href="http://amazon.com/" target="_blank">amazon.com</a> — into a numeric address computers use to talk to each other. When it fails, the internet stops working.</p><p>Most cloud services have backups and failover plans, but DNS issues are notoriously sneaky. They can make systems look healthy on the surface while silently blocking connections underneath. So when DynamoDB’s address stopped resolving, many apps didn’t even know where to send their data.</p><p>It’s like losing GPS for every delivery truck on the road — everything stalls, even if the trucks still work.</p><h2 id="what-amazon-says-now">What Amazon says now</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:559px;"><p class="vanilla-image-block" style="padding-top:109.12%;"><img id="jN89qmc8GB4MzmehnLnVGo" name="Screenshot 2025-10-20 at 1.33.43 PM" alt="Down Detector reports" src="https://cdn.mos.cms.futurecdn.net/jN89qmc8GB4MzmehnLnVGo.png" mos="" align="middle" fullscreen="" width="559" height="610" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Down Detector)</span></figcaption></figure><p>By late morning, AWS said that “most service operations are succeeding normally” and that the DNS problem was fully resolved. Still, some companies saw lingering slowdowns and needed to manually reboot parts of their systems.</p><p>AWS confirmed that no cyberattack was involved, and early signs point to a configuration or propagation error inside the DNS layer for DynamoDB. The company is still preparing a full post-incident report.</p><h2 id="the-bottom-line">The bottom line</h2><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/7-prompts-i-use-for-every-ai-chatbot-and-they-work-for-just-about-everything"><strong>7 prompts I use for every AI chatbot — and they work for just about everything</strong></a></li><li><a href="https://www.tomsguide.com/ai/youre-probably-not-using-this-chatgpt-feature-but-it-can-make-you-way-more-productive"><strong>You’re probably not using this ChatGPT feature — but it can make you way more productive</strong></a></li><li><a href="https://www.tomsguide.com/ai/napster-is-back-and-it-just-launched-a-usd99-holographic-ai-display"><strong>Napster is back — and it just launched a $99 holographic AI display</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I never travel without this one accessory — and it's just $10 for Amazon Prime Day ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/i-never-travel-without-this-one-accessory-and-its-just-usd10-for-amazon-prime-day</link>
                                                                            <description>
                            <![CDATA[ The Glocusent USB Rechargeable Book Light is a must-have travel accessory, and right now it's just $10 for Amazon Prime Day. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Heguf3DDdzSgT5NUzdTApB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/u4fYeQDB9D8yqyd9XJWmgN-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 07 Oct 2025 18:05:57 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></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/u4fYeQDB9D8yqyd9XJWmgN-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Glocusent USB Rechargeable Book Light on top of a book with a Prime Day deal badge signifying a sale price]]></media:description>                                                            <media:text><![CDATA[Glocusent USB Rechargeable Book Light on top of a book with a Prime Day deal badge signifying a sale price]]></media:text>
                                <media:title type="plain"><![CDATA[Glocusent USB Rechargeable Book Light on top of a book with a Prime Day deal badge signifying a sale price]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/u4fYeQDB9D8yqyd9XJWmgN-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When you think of the best <a href="https://www.tomsguide.com/live/news/best-prime-big-deal-days-october-2025">Amazon Prime Day deals</a>, you think of incredible <a href="https://www.tomsguide.com/tvs/4k-tvs/forget-black-friday-get-this-tcl-mini-led-tv-for-under-usd500-right-now-for-prime-day">4K TVs for less than $500</a> and <a href="https://www.tomsguide.com/computing/ipads/prime-day-just-knocked-ipad-11-down-to-its-lowest-price-ever-and-its-the-only-ipad-anyone-could-really-need">deals on iPads</a>. You don't typically think of a $15 reading light. But trust me when I tell you that this $15 reading light is a must-have for travelers, and it's the one thing I'd recommend to just about everyone this Prime Day, especially now that it's just $10.</p><p>Yes, that's right. You can score the <a href="https://www.amazon.com/Glocusent-Rechargeable-Portable-Brightness-Dimmable/dp/B09PR1BTM7/" target="_blank" rel="nofollow"><strong>Glocusent USB Rechargeable Book Light at Amazon right now for just $10</strong></a>, a whopping 31% off of its $15.99 list price. I literally <em>never</em> travel without it, and buying it on a whim is one of the most satisfying purchases I've ever made.</p><div class="product"><a data-dimension112="698876ec-a740-4af3-be3f-74349675a133" data-action="Deal Block" data-label="The Glocusent USB Rechargeable Book Light may not seem like much, but it's a travel accessory I never leave at home. If I'm on the go, I'm bringing this little USB light with me to read, or in a pinch, to serve as a portable flashlight." data-dimension48="The Glocusent USB Rechargeable Book Light may not seem like much, but it's a travel accessory I never leave at home. If I'm on the go, I'm bringing this little USB light with me to read, or in a pinch, to serve as a portable flashlight." data-dimension25="$10" href="https://www.amazon.com/Glocusent-Rechargeable-Portable-Brightness-Dimmable/dp/B09PR1BTM7/" 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.33%;"><img id="hZ2aTHFDdw4mxv662aQekM" name="Glocusent USB Rechargeable Book Light_deal-block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hZ2aTHFDdw4mxv662aQekM.jpg" mos="" align="middle" fullscreen="" width="1500" height="1415" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Glocusent USB Rechargeable Book Light may not seem like much, but it's a travel accessory I never leave at home. If I'm on the go, I'm bringing this little USB light with me to read, or in a pinch, to serve as a portable flashlight.<a class="view-deal button" href="https://www.amazon.com/Glocusent-Rechargeable-Portable-Brightness-Dimmable/dp/B09PR1BTM7/" target="_blank" rel="nofollow" data-dimension112="698876ec-a740-4af3-be3f-74349675a133" data-action="Deal Block" data-label="The Glocusent USB Rechargeable Book Light may not seem like much, but it's a travel accessory I never leave at home. If I'm on the go, I'm bringing this little USB light with me to read, or in a pinch, to serve as a portable flashlight." data-dimension48="The Glocusent USB Rechargeable Book Light may not seem like much, but it's a travel accessory I never leave at home. If I'm on the go, I'm bringing this little USB light with me to read, or in a pinch, to serve as a portable flashlight." data-dimension25="$10">View Deal</a></p></div><p>Now, you might be asking yourself, what's so great about this light? Well, for starters, it's very convenient to carry around. It's basically the size of a bookmark, and at just 41 grams, you're not going to worry about it making your bag too heavy for the money-hungry airlines. And thanks to its USB-A charging port, you can plug it into a portable charging brick or many USB-A wall outlet phone chargers to recharge the light when you're not using it.</p><p>It's also versatile. Because of its clip design, you can clip it directly to your book for reading late at night or in a dark airplane cabin, but you can also stand it up on a nightstand or desk as a mini lamp. In a pinch, I've even used it as a portable flashlight.</p><p>The reason I can use it in all these ways, though, is the most important reason to get it: it's a good light. With three different light colors and five brightness levels, it's easy to find the right light for your needs. Did I mention that you only need to spend $10 to buy it?</p><p>So seriously, if you're someone who travels at all or loves to read late at night, the Glocusent USB Rechargeable Book Light is a must-have. It's my favorite deal I've seen this Prime Day, so get it now for just $10 before it's gone.</p><p><em>For more great discounts, be sure to check out our </em><a href="https://www.tomsguide.com/live/news/best-prime-big-deal-days-october-2025" target="_blank"><em>Amazon Prime Day deals live blog</em></a><em> right now.</em></p><h3 class="article-body__section" id="section-today-s-best-prime-day-deals"><span>Today's best Prime Day deals</span></h3><ul><li><a href="https://www.amazon.com/deals" target="_blank" rel="nofollow"><strong>Shop all Amazon deals</strong></a></li><li><strong>Amazon devices: </strong><a href="https://www.amazon.com/events/devicedeals" target="_blank" rel="nofollow"><strong>from $17</strong></a></li><li><strong>Skechers: </strong><a href="https://www.amazon.com/stores/page/37AAEB46-A955-4D92-957D-28A4B4B3FDE2" target="_blank" rel="nofollow"><strong>apparel/sneakers from $27</strong></a></li><li><strong>YETI sale: </strong><a href="https://www.amazon.com/stores/page/1E4D4A1D-181B-4581-8F59-B69FD597FEBD?" target="_blank" rel="nofollow"><strong>deals from $10</strong></a></li><li><strong>TV sale: </strong><a href="https://www.amazon.com/tvs/b/?ie=UTF8&node=172659" target="_blank" rel="nofollow"><strong>from $69</strong></a></li><li><strong>Crocs: </strong><a href="https://www.amazon.com/stores/page/F59A3785-B2C8-4B9E-BD0A-1E2517EC63FF" target="_blank" rel="nofollow"><strong>footwear from $20</strong></a></li><li><strong>Roku: </strong><a href="https://www.amazon.com/stores/page/88F1E6C1-6F66-4EFD-B484-CC8EFF82874A" target="_blank" rel="nofollow"><strong>devices from $24/TVs from $139</strong></a><strong></strong></li><li><strong>Adidas: </strong><a href="https://www.amazon.com/stores/page/C5074E24-BE81-4DB7-BBCA-F4ADD5B745D0" target="_blank" rel="nofollow"><strong>deals from $9</strong></a></li><li><strong>Lego sale: </strong><a href="https://www.amazon.com/stores/page/9608963C-8BD1-4CD8-B9ED-06926DAA233E" target="_blank" rel="nofollow"><strong>deals from $8</strong></a></li><li><strong>Columbia: </strong><a href="http://amazon.com/stores/page/E21F2281-2F97-4BDA-B5DC-8F83EA77C1F0/deals" target="_blank" rel="nofollow"><strong>deals from $15</strong></a><strong></strong></li><li><strong>Blink: </strong><a href="https://www.amazon.com/stores/page/F4788D22-6EE3-4CC2-89F6-A50CC920C7A0" target="_blank" rel="nofollow"><strong>deals from $19</strong></a><strong></strong></li><li><strong>Sony headphones: </strong><a href="https://www.amazon.com/stores/page/AA9307AA-7562-44A3-B47D-B70C0499F91A" target="_blank" rel="nofollow"><strong>from $9</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Prime Day skeptic? Me too, but here's 9 tech deals I'd actually buy ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/im-usually-a-prime-day-skeptic-but-here-are-7-tech-deals-id-genuinely-buy-myself</link>
                                                                            <description>
                            <![CDATA[ I'm usually pretty skeptical about all this Prime Day malarkey, but here are some of the deals I've spotted that I heartily recommend. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">L8UgiyFEDMucbfCFQ2KmWG</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/WvA8ZDAsVZvPNT6K4TC8Qb-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 06 Oct 2025 14:54:05 +0000</pubDate>                                                                                                                                <updated>Tue, 07 Oct 2025 18:38:28 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&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/WvA8ZDAsVZvPNT6K4TC8Qb-1280-80.jpg">
                                                            <media:credit><![CDATA[Future / DJI / Ring / TP-Link / EarFun / Keen / Ninja]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A group of products on a pink background with a Tom&#039;s Guide deal badge in the center]]></media:description>                                                            <media:text><![CDATA[A group of products on a pink background with a Tom&#039;s Guide deal badge in the center]]></media:text>
                                <media:title type="plain"><![CDATA[A group of products on a pink background with a Tom&#039;s Guide deal badge in the center]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/WvA8ZDAsVZvPNT6K4TC8Qb-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I've covered many <a href="https://www.tomsguide.com/sales-events/october-prime-big-deal-days-2025">Prime Days </a>now — every one for the last four years. Sometimes, the offers and discounts are super hot, sometimes they're super... not. </p><p>In fairness, I've seen some pretty good deals about today — the first of Amazon's two day trading event. However, I'm always a bit of a skeptic about these events by default.</p><p>You'll know as well as me that many vendors massage their deals to look better than they are through somewhat nefarious means. Sound familiar? That's because it's true. We have price tracking tools and can see when a seller has hiked prices for 30 days before the event only to slash them to what they once were to make something <em>look</em> like a great deal. </p><p>Luckily, it's my job to cut through the BS and find the decent deals to help save you money.</p><p>So, skeptic as I may be, that's what I've been doing. And thankfully I've found some actual deals! My absolute favorite is the <a href="https://www.amazon.com/gp/aw/d/B0DS2DF5S5" target="_blank" rel="nofollow">DJI Osmo Action 5 Pro, our top action camera, which is $70 off right now at Amazon</a>. </p><p>But that's not all! Here are my favorites so far.</p><h2 class="article-body__section" id="section-quick-links"><span>Quick links</span></h2><ul><li><strong>Lemokey X1: </strong><a href="https://www.amazon.com/LEMOKEY-Mechanical-Programmable-North-facing-Compatible/dp/B0CTJRKBX9" target="_blank" rel="nofollow"><strong>was $36 now $20 @ Amazon</strong></a></li><li><strong>Ring Doorbell: </strong><a href="https://www.amazon.com/dp/B0BZWRSRWV" target="_blank" rel="nofollow"><strong>was $99 now $49 @ Amazon</strong></a></li><li><strong>Gamakay LK75: </strong><a href="https://www.amazon.com/GK-GAMAKAY-LK75-Mechanical-Black-Phoenix/dp/B0CF2JVGS4" target="_blank" rel="nofollow"><strong>was $74 now $62 @ Amazon</strong></a></li><li><strong>EarFun Air Pro 4: </strong><a href="https://www.amazon.com/EarFun-Canceling-Snapdragon-Bluetooth-Detection/dp/B0D5M9SH1X" target="_blank" rel="nofollow"><strong>was $79 now $62 @ Amazon</strong></a></li><li><strong>Keen Hightrail Mids hiking boots: </strong><a href="https://www.amazon.com/KEEN-Hightrail-Lightweight-Breathable-Waterproof/dp/B0D2FF9LYW" target="_blank" rel="nofollow"><strong>from $96 @ Amazon</strong></a></li><li><strong>Deco BE25 Wi-Fi 7 mesh Wi-Fi system: </strong><a href="https://www.amazon.com/TP-Link-Deco-BE25-AI-Roaming-2-Pack/dp/B0DKVDMPT9" target="_blank" rel="nofollow"><strong>was $229 now $149 @ Amazon</strong></a></li><li><strong>Ninja DZ302 Dual Basket 10QT air fryer: </strong><a href="https://www.amazon.com/Ninja-DZ302-DualZone-Independent-Dehydrate/dp/B0CL12QNNK" target="_blank" rel="nofollow"><strong>was $229 now $179 @ Amazon</strong></a></li><li><strong>Dreame Z30 Cordless Vacuum: </strong><a href="https://www.amazon.com/DREAME-Z30-Cordless-Multi-Surface-Deshedding/dp/B0DFXS37KW" target="_blank" rel="nofollow"><strong>was $499 now $249 @ Amazon</strong></a></li><li><strong>DJI Osmo Action 5 Pro: </strong><a href="https://www.amazon.com/gp/aw/d/B0DS2DF5S5" target="_blank" rel="nofollow"><strong>$339 now $269 @ Amazon</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-7-deals-this-prime-day-skeptic-recommends"><span>7 deals this Prime Day skeptic recommends</span></h3><div class="product"><a data-dimension112="8b644e4e-951b-412c-8131-c720c03e9156" data-action="Deal Block" data-label="DJI Osmo Action 5 Pro" data-dimension48="DJI Osmo Action 5 Pro" data-dimension25="$269" href="https://www.amazon.com/gp/aw/d/B0DS2DF5S5" 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:84.00%;"><img id="ZjbfZ45E3afFQJCzAjxoiM" name="DJI OA5P QUICK LIST" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ZjbfZ45E3afFQJCzAjxoiM.jpg" mos="" align="middle" fullscreen="" width="500" height="420" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-5-pro-review" data-dimension112="8b644e4e-951b-412c-8131-c720c03e9156" data-action="Deal Block" data-label="DJI Osmo Action 5 Pro" data-dimension48="DJI Osmo Action 5 Pro" data-dimension25="$269">DJI Osmo Action 5 Pro</a> is the top pick in my roundup of the <a href="https://www.tomsguide.com/us/best-action-cameras,review-3046.html">best action cameras. </a>I've tested and used this camera extensively and it was already a steal at its MSRP! At $269 this is the lowest I've ever seen this camera go and, quite frankly, it's stupidly cheap. We've heard rumours of an upcoming successors to the OA5 Pro, which may explain the price slash. Still, I don't think this one is going any lower this week. The OA5 Pro packs 4K/60fps video, D-Log, HLG, 10-bit color, 65-foot waterproofing and seamless integration with the rest of the DJI ecosystem.<a class="view-deal button" href="https://www.amazon.com/gp/aw/d/B0DS2DF5S5" target="_blank" rel="nofollow" data-dimension112="8b644e4e-951b-412c-8131-c720c03e9156" data-action="Deal Block" data-label="DJI Osmo Action 5 Pro" data-dimension48="DJI Osmo Action 5 Pro" data-dimension25="$269">View Deal</a></p></div><div class="product"><a data-dimension112="3db902b1-baf1-4a25-b951-3a5937736715" data-action="Deal Block" data-label="OK, so here's one of those "cutting through the BS moments" — the Z30 rarely retails at a full $499, usually sitting at $299. However, with a $50 voucher, it's at its joint lowest price of $249 right now! And man, I love this thing. I've been testing the Z30 for about a month now and I don't regret not buying a Dyson (I was about to before the Z30 landed on my desk). It's super powerful — more powerful than pretty much any Dyson out there and comes with a wide array of accessories, plus a handy green light for showing up dirt, which works wonders. At $249, this vacuum is a major steal." data-dimension48="OK, so here's one of those "cutting through the BS moments" — the Z30 rarely retails at a full $499, usually sitting at $299. However, with a $50 voucher, it's at its joint lowest price of $249 right now! And man, I love this thing. I've been testing the Z30 for about a month now and I don't regret not buying a Dyson (I was about to before the Z30 landed on my desk). It's super powerful — more powerful than pretty much any Dyson out there and comes with a wide array of accessories, plus a handy green light for showing up dirt, which works wonders. At $249, this vacuum is a major steal." data-dimension25="$249" href="https://www.amazon.com/DREAME-Z30-Cordless-Multi-Surface-Deshedding/dp/B0DFXS37KW" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1456px;"><p class="vanilla-image-block" style="padding-top:103.02%;"><img id="CofmKPCf5sSTi2TyNveU35" name="Dreame Z30" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CofmKPCf5sSTi2TyNveU35.jpg" mos="" align="middle" fullscreen="" width="1456" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>OK, so here's one of those "cutting through the BS moments" — the Z30 rarely retails at a full $499, usually sitting at $299. However, with a $50 voucher, it's at its joint lowest price of $249 right now! And man, I love this thing. I've been testing the Z30 for about a month now and I don't regret not buying a Dyson (I was about to before the Z30 landed on my desk). It's super powerful — more powerful than pretty much any Dyson out there and comes with a wide array of accessories, plus a handy green light for showing up dirt, which works wonders. At $249, this vacuum is a major steal.<a class="view-deal button" href="https://www.amazon.com/DREAME-Z30-Cordless-Multi-Surface-Deshedding/dp/B0DFXS37KW" target="_blank" rel="nofollow" data-dimension112="3db902b1-baf1-4a25-b951-3a5937736715" data-action="Deal Block" data-label="OK, so here's one of those "cutting through the BS moments" — the Z30 rarely retails at a full $499, usually sitting at $299. However, with a $50 voucher, it's at its joint lowest price of $249 right now! And man, I love this thing. I've been testing the Z30 for about a month now and I don't regret not buying a Dyson (I was about to before the Z30 landed on my desk). It's super powerful — more powerful than pretty much any Dyson out there and comes with a wide array of accessories, plus a handy green light for showing up dirt, which works wonders. At $249, this vacuum is a major steal." data-dimension48="OK, so here's one of those "cutting through the BS moments" — the Z30 rarely retails at a full $499, usually sitting at $299. However, with a $50 voucher, it's at its joint lowest price of $249 right now! And man, I love this thing. I've been testing the Z30 for about a month now and I don't regret not buying a Dyson (I was about to before the Z30 landed on my desk). It's super powerful — more powerful than pretty much any Dyson out there and comes with a wide array of accessories, plus a handy green light for showing up dirt, which works wonders. At $249, this vacuum is a major steal." data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="31338091-e0d1-48ce-b1ec-49ad4cc3d55e" data-action="Deal Block" data-label="I own this air fryer, so I'm happy to recommend it regardless. It's a dual basket, which means my wife (a vegetarian) and I (not a vegetarian) can co-exist peacefully in the kitchen. It's a fantastic air fryer in general, though, with powerful air frying and broiling modes, plus baking and roasting modes for gentler cooking. $179 is about $30 short of the cheapest ever price we've seen, but this fryer tends to hover at around the $210-$220 mark, so this is still a solid deal." data-dimension48="I own this air fryer, so I'm happy to recommend it regardless. It's a dual basket, which means my wife (a vegetarian) and I (not a vegetarian) can co-exist peacefully in the kitchen. It's a fantastic air fryer in general, though, with powerful air frying and broiling modes, plus baking and roasting modes for gentler cooking. $179 is about $30 short of the cheapest ever price we've seen, but this fryer tends to hover at around the $210-$220 mark, so this is still a solid deal." data-dimension25="$179" href="https://www.amazon.com/Ninja-DZ302-DualZone-Independent-Dehydrate/dp/B0CL12QNNK" 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:70.13%;"><img id="tP5CFhZjBzH6nfFx6CVke9" name="Ninja DZ302" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tP5CFhZjBzH6nfFx6CVke9.jpg" mos="" align="middle" fullscreen="" width="1500" height="1052" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>I own this air fryer, so I'm happy to recommend it regardless. It's a dual basket, which means my wife (a vegetarian) and I (not a vegetarian) can co-exist peacefully in the kitchen. It's a fantastic air fryer in general, though, with powerful air frying and broiling modes, plus baking and roasting modes for gentler cooking. $179 is about $30 short of the cheapest ever price we've seen, but this fryer tends to hover at around the $210-$220 mark, so this is still a solid deal.<a class="view-deal button" href="https://www.amazon.com/Ninja-DZ302-DualZone-Independent-Dehydrate/dp/B0CL12QNNK" target="_blank" rel="nofollow" data-dimension112="31338091-e0d1-48ce-b1ec-49ad4cc3d55e" data-action="Deal Block" data-label="I own this air fryer, so I'm happy to recommend it regardless. It's a dual basket, which means my wife (a vegetarian) and I (not a vegetarian) can co-exist peacefully in the kitchen. It's a fantastic air fryer in general, though, with powerful air frying and broiling modes, plus baking and roasting modes for gentler cooking. $179 is about $30 short of the cheapest ever price we've seen, but this fryer tends to hover at around the $210-$220 mark, so this is still a solid deal." data-dimension48="I own this air fryer, so I'm happy to recommend it regardless. It's a dual basket, which means my wife (a vegetarian) and I (not a vegetarian) can co-exist peacefully in the kitchen. It's a fantastic air fryer in general, though, with powerful air frying and broiling modes, plus baking and roasting modes for gentler cooking. $179 is about $30 short of the cheapest ever price we've seen, but this fryer tends to hover at around the $210-$220 mark, so this is still a solid deal." data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="433eb612-614f-4cca-a636-ed39bc4ed520" data-action="Deal Block" data-label="Keen Hightrail Mids" data-dimension48="Keen Hightrail Mids" data-dimension25="$96" href="https://www.amazon.com/KEEN-Hightrail-Lightweight-Breathable-Waterproof/dp/B0D2FF9LYW" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:884px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="CUZvBXFpMCtrf72VAfpsWM" name="Keen Hightrail Mid Men's" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CUZvBXFpMCtrf72VAfpsWM.jpg" mos="" align="middle" fullscreen="" width="884" height="884" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/wellness/keen-hightrail-mid-review" data-dimension112="433eb612-614f-4cca-a636-ed39bc4ed520" data-action="Deal Block" data-label="Keen Hightrail Mids" data-dimension48="Keen Hightrail Mids" data-dimension25="$96">Keen Hightrail Mids</a> are excellent lightweight trail boots, that I've been using for around 6 months now. They're ideal for summer and spring thanks to their lightweight design, but are fully waterproofed, so you can also use them in fall (although I'd recommend some thicker socks if you get cold feet). As we approach the colder months, though, the Hightrails are seeing large discounts on certain sizes, starting at $96. That's a $58 price cut. I'd recommend picking up a pair now, even if you're saving them for spring.<a class="view-deal button" href="https://www.amazon.com/KEEN-Hightrail-Lightweight-Breathable-Waterproof/dp/B0D2FF9LYW" target="_blank" rel="nofollow" data-dimension112="433eb612-614f-4cca-a636-ed39bc4ed520" data-action="Deal Block" data-label="Keen Hightrail Mids" data-dimension48="Keen Hightrail Mids" data-dimension25="$96">View Deal</a></p></div><div class="product"><a data-dimension112="eb8d8d29-aa9d-434f-8e49-038bdaf41a64" data-action="Deal Block" data-label="EarFun Air Pro 4 review" data-dimension48="EarFun Air Pro 4 review" data-dimension25="$62" href="https://www.amazon.com/EarFun-Canceling-Snapdragon-Bluetooth-Detection/dp/B0D5M9SH1X" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:373px;"><p class="vanilla-image-block" style="padding-top:95.17%;"><img id="mb99NUzvES8wPHurrq9EE4" name="EarFun Air Pro 4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mb99NUzvES8wPHurrq9EE4.jpg" mos="" align="middle" fullscreen="" width="373" height="355" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These earbuds punch way above their price tag. In fact, my colleague Nikita gave them a 4.5* score in her <a href="https://www.tomsguide.com/audio-headphones/earbuds/earfun-air-pro-4-review" data-dimension112="eb8d8d29-aa9d-434f-8e49-038bdaf41a64" data-action="Deal Block" data-label="EarFun Air Pro 4 review" data-dimension48="EarFun Air Pro 4 review" data-dimension25="$62">EarFun Air Pro 4 review</a>, calling them "budget earbuds for audiophiles". They're so good that after she finished testing, I stole them and haven't given them back since (don't worry, she's always testing some of the <a href="https://www.tomsguide.com/us/best-wireless-earbuds,review-6160.html">best earbuds</a> around, so isn't short of replacements). I love the Air Pro 4s, especially their powerful bass and strong ANC. $62 is about $7 off their cheapest ever price, so while it isn't the best deal we've seen on these, it's still a good'n!<a class="view-deal button" href="https://www.amazon.com/EarFun-Canceling-Snapdragon-Bluetooth-Detection/dp/B0D5M9SH1X" target="_blank" rel="nofollow" data-dimension112="eb8d8d29-aa9d-434f-8e49-038bdaf41a64" data-action="Deal Block" data-label="EarFun Air Pro 4 review" data-dimension48="EarFun Air Pro 4 review" data-dimension25="$62">View Deal</a></p></div><div class="product"><a data-dimension112="660e09f9-5c1b-4d7c-8ecf-cc9eeb1c9503" data-action="Deal Block" data-label="Ring Doorbell" data-dimension48="Ring Doorbell" data-dimension25="$49" href="https://www.amazon.com/dp/B0BZWRSRWV" 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="hKnHNZDuKCQF6uFbaihPbW" name="Ring doorbell - Amazon.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hKnHNZDuKCQF6uFbaihPbW.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>We love the battery-powered <a href="https://www.tomsguide.com/home/smart-home/ring-battery-doorbell-pro-review-the-video-doorbell-ive-been-waiting-for" data-dimension112="660e09f9-5c1b-4d7c-8ecf-cc9eeb1c9503" data-action="Deal Block" data-label="Ring Doorbell" data-dimension48="Ring Doorbell" data-dimension25="$49">Ring Doorbell</a>, awarding five stars in our review. These things are pretty ubiquitous now, and they have become more than just doorbells, now being key home security features. This deal is on the latest Ring doorbell batter-powered model and represent $50 off, which is the cheapest we've ever seen.<a class="view-deal button" href="https://www.amazon.com/dp/B0BZWRSRWV" target="_blank" rel="nofollow" data-dimension112="660e09f9-5c1b-4d7c-8ecf-cc9eeb1c9503" data-action="Deal Block" data-label="Ring Doorbell" data-dimension48="Ring Doorbell" data-dimension25="$49">View Deal</a></p></div><div class="product"><a data-dimension112="1a6f8799-7f4d-4740-8e23-7e9d40a686c4" data-action="Deal Block" data-label="As with the Ring Doorbell above, mesh systems have effectively become a basic part of many households. Ive been using Deco mesh systems for a few years now, and they're super easy to set up and use, with a user-friendly app. The TP-Link Deco BE25 is an unobtrusive, dual-band Wi-Fi 7 mesh kit that's ideal for boosting your Wi-Fi signal around the house. It's an affordable unit, so you don't get tri-band connectivity and access to the 6 GHz Wi-Fi band. However, it comes with many other Wi-Fi 7 benefits, including Multi-Link Operation. At $80 it's also at its lowest ever price for Prime Day!" data-dimension48="As with the Ring Doorbell above, mesh systems have effectively become a basic part of many households. Ive been using Deco mesh systems for a few years now, and they're super easy to set up and use, with a user-friendly app. The TP-Link Deco BE25 is an unobtrusive, dual-band Wi-Fi 7 mesh kit that's ideal for boosting your Wi-Fi signal around the house. It's an affordable unit, so you don't get tri-band connectivity and access to the 6 GHz Wi-Fi band. However, it comes with many other Wi-Fi 7 benefits, including Multi-Link Operation. At $80 it's also at its lowest ever price for Prime Day!" data-dimension25="$149" href="https://www.amazon.com/TP-Link-Deco-BE25-AI-Roaming-2-Pack/dp/B0DKVDMPT9" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1295px;"><p class="vanilla-image-block" style="padding-top:62.24%;"><img id="Rh5r4L7wY22u8tyHgoPwbb" name="Deco BE25" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Rh5r4L7wY22u8tyHgoPwbb.jpg" mos="" align="middle" fullscreen="" width="1295" height="806" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>As with the Ring Doorbell above, mesh systems have effectively become a basic part of many households. Ive been using Deco mesh systems for a few years now, and they're super easy to set up and use, with a user-friendly app. The TP-Link Deco BE25 is an unobtrusive, dual-band Wi-Fi 7 mesh kit that's ideal for boosting your Wi-Fi signal around the house. It's an affordable unit, so you don't get tri-band connectivity and access to the 6 GHz Wi-Fi band. However, it comes with many other Wi-Fi 7 benefits, including Multi-Link Operation. At $80 it's also at its lowest ever price for Prime Day!<a class="view-deal button" href="https://www.amazon.com/TP-Link-Deco-BE25-AI-Roaming-2-Pack/dp/B0DKVDMPT9" target="_blank" rel="nofollow" data-dimension112="1a6f8799-7f4d-4740-8e23-7e9d40a686c4" data-action="Deal Block" data-label="As with the Ring Doorbell above, mesh systems have effectively become a basic part of many households. Ive been using Deco mesh systems for a few years now, and they're super easy to set up and use, with a user-friendly app. The TP-Link Deco BE25 is an unobtrusive, dual-band Wi-Fi 7 mesh kit that's ideal for boosting your Wi-Fi signal around the house. It's an affordable unit, so you don't get tri-band connectivity and access to the 6 GHz Wi-Fi band. However, it comes with many other Wi-Fi 7 benefits, including Multi-Link Operation. At $80 it's also at its lowest ever price for Prime Day!" data-dimension48="As with the Ring Doorbell above, mesh systems have effectively become a basic part of many households. Ive been using Deco mesh systems for a few years now, and they're super easy to set up and use, with a user-friendly app. The TP-Link Deco BE25 is an unobtrusive, dual-band Wi-Fi 7 mesh kit that's ideal for boosting your Wi-Fi signal around the house. It's an affordable unit, so you don't get tri-band connectivity and access to the 6 GHz Wi-Fi band. However, it comes with many other Wi-Fi 7 benefits, including Multi-Link Operation. At $80 it's also at its lowest ever price for Prime Day!" data-dimension25="$149">View Deal</a></p></div><div class="product"><a data-dimension112="c80b2abb-7530-469b-8abe-1e74c6755098" data-action="Deal Block" data-label="Gamakay LK75" data-dimension48="Gamakay LK75" data-dimension25="$62" href="https://www.amazon.com/GK-GAMAKAY-LK75-Mechanical-Black-Phoenix/dp/B0CF2JVGS4" 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:40.00%;"><img id="j5vmAZ6zFRYrB6rkq6LbCD" name="Gamakay LK75.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/j5vmAZ6zFRYrB6rkq6LbCD.jpg" mos="" align="middle" fullscreen="" width="1500" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/computing/peripherals/gamakay-lk75-review" data-dimension112="c80b2abb-7530-469b-8abe-1e74c6755098" data-action="Deal Block" data-label="Gamakay LK75" data-dimension48="Gamakay LK75" data-dimension25="$62">Gamakay LK75</a> earned a well-deserved 4.5 stars in our review. Although I didn't review this one (my colleague Nikita did), I also own this keyboard. It's a beautiful, soft and utterly silent keyboard to type on when specced with the silent switches. It also features a customizable display which you can load your favorite GIF onto.<a class="view-deal button" href="https://www.amazon.com/GK-GAMAKAY-LK75-Mechanical-Black-Phoenix/dp/B0CF2JVGS4" target="_blank" rel="nofollow" data-dimension112="c80b2abb-7530-469b-8abe-1e74c6755098" data-action="Deal Block" data-label="Gamakay LK75" data-dimension48="Gamakay LK75" data-dimension25="$62">View Deal</a></p></div><div class="product"><a data-dimension112="0d2d9ab5-f03b-475c-b274-4192f606fd91" data-action="Deal Block" data-label="Lemokey X1" data-dimension48="Lemokey X1" data-dimension25="$20" href="https://www.amazon.com/LEMOKEY-Mechanical-Programmable-North-facing-Compatible/dp/B0CTJRKBX9" 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.13%;"><img id="NqQ8ca5babUecf4X2uiHeS" name="Lemokey X1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NqQ8ca5babUecf4X2uiHeS.jpg" mos="" align="middle" fullscreen="" width="1500" height="1082" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you need a solid gaming keyboard on a very, very strict budget, the <a href="https://www.tomsguide.com/computing/peripherals/lemokey-x1-review" data-dimension112="0d2d9ab5-f03b-475c-b274-4192f606fd91" data-action="Deal Block" data-label="Lemokey X1" data-dimension48="Lemokey X1" data-dimension25="$20">Lemokey X1</a> is an ideal solution. We awarded this keyboard 4 stars in our review, thanks to its great gaming and typing performance, and its solid build quality (which is even more impressive given the low price). This is one of the best budget keyboards you can buy when it <em>isn't</em> on offer, so it's even better value for money now.<a class="view-deal button" href="https://www.amazon.com/LEMOKEY-Mechanical-Programmable-North-facing-Compatible/dp/B0CTJRKBX9" target="_blank" rel="nofollow" data-dimension112="0d2d9ab5-f03b-475c-b274-4192f606fd91" data-action="Deal Block" data-label="Lemokey X1" data-dimension48="Lemokey X1" data-dimension25="$20">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Amazon ends Prime free shipping sharing and lower sign-ups are reportedly to blame ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/amazon-ends-prime-free-shipping-sharing-and-lower-sign-ups-are-reportedly-to-blame</link>
                                                                            <description>
                            <![CDATA[ Amazon has ended its Prime Invitee program which allowed subscribers to share their free shipping perk with others. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">DNjMP87vAUtFeBtFT4RhSc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/PHNuMXh6G2wz5e3q2KL4Wb-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 03 Sep 2025 17:54:52 +0000</pubDate>                                                                                                                                <updated>Wed, 03 Sep 2025 19:42:09 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></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/PHNuMXh6G2wz5e3q2KL4Wb-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Amazon Prime]]></media:description>                                                            <media:text><![CDATA[Amazon Prime]]></media:text>
                                <media:title type="plain"><![CDATA[Amazon Prime]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/PHNuMXh6G2wz5e3q2KL4Wb-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Amazon is ending its Prime Invitee Program which let Prime members share free shipping benefits with people outside of their homes. The program officially ends on October 1.</p><p>A <a href="https://www.cnbc.com/2025/09/02/amazon-eliminates-prime-share-shipping.html" target="_blank">CNBC report </a>claims that Amazon has begun notifying customers about its plans to end the program. Previously invited "guests" should receive notifications by September 5.</p><p>“We are writing to inform you that the Prime Invitee Program, which allowed sharing Prime’s fast, free delivery with others, will end on October 1, 2025,” the notice reportedly states.</p><p>Up until now, the program let Prime members share free, two-day shipping with another adult in their household, even if they had a different address. Amazon will now prompt the guest users to start their own Amazon Prime accounts at a discounted $14.99 for the first year, and a standard $14.99 a month afterwards. </p><div><blockquote><p>The Invitee program, which enabled sharing of the Prime shipping benefit only, is being phased out.</p><p>Amazon statement</p></blockquote></div><p>We were informed that Amazon stopped accepting new invitees in 2015 — only six years after the program launched in 2009.</p><p>With that the company is encouraging customers to sign up for Amazon Family at no extra cost instead which allows Prime benefits to be shared across multiple people in the same house. However, it's currently limited to two adults and up to four children. </p><p>Teenagers can be included if they were added before April 7, 2025. Benefits include free shipping, Prime Video, Music and more.</p><p>"The Invitee program, which enabled sharing of the Prime shipping benefit only, is being phased out, and Prime members can instead share a broad range of Prime benefits with Amazon Family," an Amazon spokesperson told Tom's Guide in a statement.</p><h2 id="sharing-crackdown">Sharing crackdown</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NduuGQSaD4okS4kXbWoByS" name="netflix-password-sharing-crackdown-notification-2.jpg" alt="A TV with the Netflix error message "This TV isn't part of your Netflix household"" src="https://cdn.mos.cms.futurecdn.net/NduuGQSaD4okS4kXbWoByS.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It's not clear how Amazon will limit account sharing under the new policy as the company has not provided any specifics. But it's not alone in cracking down on account sharing.</p><p>This year alone, <a href="https://www.tomsguide.com/entertainment/hbo-max/max-cracks-down-on-password-sharing-heres-how-much-extra-members-cost">both HBO Max</a> and <a href="https://www.tomsguide.com/entertainment/streaming/youtube-follows-netflix-and-quietly-rolls-out-account-sharing-restrictions-heres-what-we-know">YouTube Premium </a>introduced measures to eliminate password sharing. It follows similar moves from <a href="https://www.tomsguide.com/entertainment/disney-plus/disney-plus-password-sharing-crackdown-is-here-heres-what-the-paid-sharing-program-costs">Disney Plus</a> late last year as streaming services attempted to follow <a href="https://www.tomsguide.com/opinion/netflixs-password-sharing-crackdown-got-me-heres-what-happened">Netflix's model</a> for reducing account sharing.</p><p>As subscription services sign-ups plateaued in recent years, streamers and others are trying to claw back some revenue by forcing people to sign up for accounts as opposed to just sharing them with others.</p><h2 id="slower-prime-subscriptions-to-blame">Slower Prime subscriptions to blame?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Kgpcz6aok5VuP4ow5oYfTQ" name="Prime Day" alt="Prime Day 2025" src="https://cdn.mos.cms.futurecdn.net/Kgpcz6aok5VuP4ow5oYfTQ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Amazon)</span></figcaption></figure><p>This crackdown on account sharing comes as <a href="https://www.reuters.com/business/retail-consumer/amazon-us-prime-sign-ups-slow-despite-expanded-prime-day-push-data-shows-2025-09-02/" target="_blank">Reuters reports</a> that Amazon fell short of its goals for Prime sign-ups in the United States. This occurred despite the extended four-day Prime Day event this summer. Signups apparently failed to meet last year's total and the company's own internal targets.</p><p>According to Reuters, the company registered 5.4 million sign-ups in the month leading up to this year's Prime Day. This is about 116,000 less than last year and 106,000 below the company's goals.</p><p>"Prime membership continues to show strong growth and customer engagement in the U.S. and internationally," a spokesperson told Reuters. The company added that it had earned "record-breaking" sign-ups without providing specifics.</p><p>A spokesperson told Tom's Guide that there is no relationship between the ending of the program and the company's recent Prime Day numbers.</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/us/what-is-amazon-prime,news-18041.html">What is Amazon Prime? Everything you need to know</a></li><li><a href="https://www.tomsguide.com/sales-events/amazons-labor-day-sale-is-massive-but-these-are-the-only-deals-id-shop">Massive Amazon Labor Day sale — 75+ deals you can still get</a></li><li><a href="https://www.tomsguide.com/best-picks/amazon-prime-best-movies">35 best movies on Amazon Prime Video to stream right now</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 7 best last minute back-to-school finds — our top picks on a budget ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/7-best-last-minute-back-to-school-finds-our-top-picks-on-a-budget</link>
                                                                            <description>
                            <![CDATA[ Check out our top recommendations for back-to-school tech — make your life easier for the next school year! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">HsFAQUnWywqMDwrkvD9j6a</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/gSNdYMZcDdQ8L4qkJwrs5A-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 21 Aug 2025 13:18:27 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Mark has a passion for covering all things mobile, having reviewed dozens of smartphones and other gadgets. He enjoys testing the top mobile devices and putting them up against each other in our in-depth face-offs. He also works hand in hand with our editors and testing team to continually improve how we evaluate products.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Having led Tom&#039;s Guide since 2013, Mark has focused on growing the core tech coverage of the site while also expanding into new areas, such as entertainment, fitness and home, recruiting talented writers and editors to help our readers figure out what to buy and how to get the most out of the products and services they use every day.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Mark has spoken at key industry events and appears regularly on TV to discuss the latest trends, including &lt;a href=&quot;https://cheddar.com/media/pixel-watch-gets-a-release-date-at-google-i-o-2022&quot;&gt;Cheddar&lt;/a&gt;, Fox 5, &lt;a href=&quot;https://www.foxbusiness.com/technology/apple-march-event-5g-iphone&quot;&gt;Fox Business&lt;/a&gt; and other outlets. Mark was previously editor in chief of Laptop Mag, and his work has appeared in Wired, Popular Science and Inc. Follow him on Twitter at @mspoonauer.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/gSNdYMZcDdQ8L4qkJwrs5A-1280-80.jpg">
                                                            <media:credit><![CDATA[Scosche, Apple, Jlab, Tribit]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Compilation showing Jlab headphones, Tribit speaker, Scosche flask, MacBook Air M4.]]></media:description>                                                            <media:text><![CDATA[Compilation showing Jlab headphones, Tribit speaker, Scosche flask, MacBook Air M4.]]></media:text>
                                <media:title type="plain"><![CDATA[Compilation showing Jlab headphones, Tribit speaker, Scosche flask, MacBook Air M4.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/gSNdYMZcDdQ8L4qkJwrs5A-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It's crunch time if you're looking to get your back-to-school shopping in. But the good news is that we've rounded up great gadgets that will help you get ahead — and have more fun — at school this year without busting your budget.</p><p>I've just featured these devices on Fox 5's Good Day New York show, highlighting my top picks. My favorite back-to-school deals include the <a href="https://www.amazon.com/Apple-2025-MacBook-13-inch-Laptop/dp/B0DZD9S5GC" target="_blank" rel="nofollow">MacBook Air M4 for $200 off</a>, an amazing pair of noise-cancelling headphones for under $80 and a water bottle that has a built-in mount for your phone.</p><p>Have trouble getting up in the morning? The Nintendo Alarmo is for you (you have to get up to turn it off). And the Plaud NotePin will be your best new friend on campus, as it can transcribe and summarize your class notes via AI on the fly.</p><p>Check out all these top finds now.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong>Tribit StormBox Mini Plus: </strong><a href="https://www.amazon.com/dp/B0DSPCW5M5" target="_blank" rel="nofollow"><strong>was $39 now $33 @ Amazon</strong></a></li><li><strong>Scosche MagicMount Flask: </strong><a href="https://www.scosche.com/mfms-magic-mount-flask-insulated-water-bottle-with-magsafe-phone-mount" target="_blank" rel="nofollow"><strong>was $54 now $39 @ Scosche</strong></a></li><li><strong>Anker Nano Power Bank 10,000mAh: </strong><a href="https://www.amazon.com/dp/B0DGKWTQQC" target="_blank" rel="nofollow"><strong>now $59 @ Amazon</strong></a></li><li><strong>Jlab JBuds Lux ANC: </strong><a href="https://www.amazon.com/JLab-Headphones-Cancelling-Customizable-Compatible/dp/B0CRM4Q1W1" target="_blank" rel="nofollow"><strong>was $79 now $59 @ Amazon</strong></a></li><li><strong>Nintendo Alarmo: </strong><a href="https://www.nintendo.com/us/store/products/nintendo-sound-clock-alarmo-121311/" target="_blank" rel="nofollow"><strong>now $109 @ Nintendo</strong></a></li><li><strong>Plaud NotePin: </strong><a href="https://www.amazon.com/PLAUD-Notetaker-Transcribe-Summarize-Languages/dp/B0DZWQ9WWJ" target="_blank" rel="nofollow"><strong>now $159 @ Amazon</strong></a></li><li><strong>MacBook Air 13" (M4/256GB): </strong><a href="https://www.amazon.com/Apple-2025-MacBook-13-inch-Laptop/dp/B0DZD9S5GC" target="_blank" rel="nofollow"><strong>was $999 now $799 @ Amazon</strong></a></li></ul><h3 class="article-body__section" id="section-best-back-to-school-finds"><span>Best back to school finds</span></h3><div class="product"><a data-dimension112="dc060d76-0674-44ec-ba3f-49e21e644a31" data-action="Deal Block" data-label="Studying will be much more enjoyable if you can do it while listening to your favorite tunes. Retailing for just $33, this speaker boasts fantastic and powerful bass response, plus detailed vocals. It also sports reactive LED lighting that’s fun to watch, and IPX7 waterproofing which means it can be used poolside or in the shower." data-dimension48="Studying will be much more enjoyable if you can do it while listening to your favorite tunes. Retailing for just $33, this speaker boasts fantastic and powerful bass response, plus detailed vocals. It also sports reactive LED lighting that’s fun to watch, and IPX7 waterproofing which means it can be used poolside or in the shower." data-dimension25="$33" href="https://www.amazon.com/dp/B0DSPCW5M5" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1480px;"><p class="vanilla-image-block" style="padding-top:101.35%;"><img id="iRvkqAH3YBcTTf4zRa7AdC" name="Tribit-StormBox-Mini-Plus-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/iRvkqAH3YBcTTf4zRa7AdC.jpg" mos="" align="middle" fullscreen="" width="1480" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Studying will be much more enjoyable if you can do it while listening to your favorite tunes. Retailing for just $33, this speaker boasts fantastic and powerful bass response, plus detailed vocals. It also sports reactive LED lighting that’s fun to watch, and IPX7 waterproofing which means it can be used poolside or in the shower.<a class="view-deal button" href="https://www.amazon.com/dp/B0DSPCW5M5" target="_blank" rel="nofollow" data-dimension112="dc060d76-0674-44ec-ba3f-49e21e644a31" data-action="Deal Block" data-label="Studying will be much more enjoyable if you can do it while listening to your favorite tunes. Retailing for just $33, this speaker boasts fantastic and powerful bass response, plus detailed vocals. It also sports reactive LED lighting that’s fun to watch, and IPX7 waterproofing which means it can be used poolside or in the shower." data-dimension48="Studying will be much more enjoyable if you can do it while listening to your favorite tunes. Retailing for just $33, this speaker boasts fantastic and powerful bass response, plus detailed vocals. It also sports reactive LED lighting that’s fun to watch, and IPX7 waterproofing which means it can be used poolside or in the shower." data-dimension25="$33">View Deal</a></p></div><div class="product"><a data-dimension112="681044c4-2535-4fe3-88db-27227303d4c7" data-action="Deal Block" data-label="This insulated water bottle will keep your drinks cold for 24 hours, and hot beverages warm for 12 hours. Plus, you can use it as a stand to hold your phone while listening to music, making FaceTime calls or watching videos." data-dimension48="This insulated water bottle will keep your drinks cold for 24 hours, and hot beverages warm for 12 hours. Plus, you can use it as a stand to hold your phone while listening to music, making FaceTime calls or watching videos." data-dimension25="$39" href="https://www.scosche.com/mfms-magic-mount-flask-insulated-water-bottle-with-magsafe-phone-mount" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:666px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="fB697WKAJR9ELxZ8JeTh4k" name="scosche magimount flask" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/fB697WKAJR9ELxZ8JeTh4k.png" mos="" align="middle" fullscreen="" width="666" height="666" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This insulated water bottle will keep your drinks cold for 24 hours, and hot beverages warm for 12 hours. Plus, you can use it as a stand to hold your phone while listening to music, making FaceTime calls or watching videos.<a class="view-deal button" href="https://www.scosche.com/mfms-magic-mount-flask-insulated-water-bottle-with-magsafe-phone-mount" target="_blank" rel="nofollow" data-dimension112="681044c4-2535-4fe3-88db-27227303d4c7" data-action="Deal Block" data-label="This insulated water bottle will keep your drinks cold for 24 hours, and hot beverages warm for 12 hours. Plus, you can use it as a stand to hold your phone while listening to music, making FaceTime calls or watching videos." data-dimension48="This insulated water bottle will keep your drinks cold for 24 hours, and hot beverages warm for 12 hours. Plus, you can use it as a stand to hold your phone while listening to music, making FaceTime calls or watching videos." data-dimension25="$39">View Deal</a></p></div><div class="product"><a data-dimension112="fb56cc7b-483d-425d-88d1-794f96ee0603" data-action="Deal Block" data-label="best streaming stick" data-dimension48="best streaming stick" data-dimension25="$39" href="https://www.amazon.com/all-new-amazon-fire-tv-stick-4k-max/dp/B0BP9SNVH9/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:80.27%;"><img id="6hNpFHy4WGTcVoHtXFtF5k" name="Amazon Fire TV Stick 4K Max" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6hNpFHy4WGTcVoHtXFtF5k.jpg" mos="" align="middle" fullscreen="" width="679" height="545" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>You don't need to miss out on watching your favorite shows when you head back to school. This compact streaming stick offers smooth 4K HDR playback with Dolby Vision, a powerful quad-core processor, and next‑gen Wi‑Fi 6E support. Plus, you'll get access to all the streaming services you could want. We rank it as the <a href="https://www.tomsguide.com/us/best-streaming-players,review-2140.html" data-dimension112="fb56cc7b-483d-425d-88d1-794f96ee0603" data-action="Deal Block" data-label="best streaming stick" data-dimension48="best streaming stick" data-dimension25="$39">best streaming stick</a> made by Amazon.<a class="view-deal button" href="https://www.amazon.com/all-new-amazon-fire-tv-stick-4k-max/dp/B0BP9SNVH9/" target="_blank" rel="nofollow" data-dimension112="fb56cc7b-483d-425d-88d1-794f96ee0603" data-action="Deal Block" data-label="best streaming stick" data-dimension48="best streaming stick" data-dimension25="$39">View Deal</a></p></div><div class="product"><a data-dimension112="4dac22f4-e08a-41ba-af09-cdae804abf5e" data-action="Deal Block" data-label="This 10,000mAh portable charger is the perfect accessory for charging up your phone quickly between classes. We also like how it has a battery status display, so you always know how much juice it has left." data-dimension48="This 10,000mAh portable charger is the perfect accessory for charging up your phone quickly between classes. We also like how it has a battery status display, so you always know how much juice it has left." data-dimension25="$59" href="https://www.amazon.com/dp/B0DGKWTQQC" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1091px;"><p class="vanilla-image-block" style="padding-top:137.49%;"><img id="8MXRGYB4SKTd55z8YnWMsb" name="61bQ4MUZCRL._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/8MXRGYB4SKTd55z8YnWMsb.jpg" mos="" align="middle" fullscreen="" width="1091" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This 10,000mAh portable charger is the perfect accessory for charging up your phone quickly between classes. We also like how it has a battery status display, so you always know how much juice it has left.<a class="view-deal button" href="https://www.amazon.com/dp/B0DGKWTQQC" target="_blank" rel="nofollow" data-dimension112="4dac22f4-e08a-41ba-af09-cdae804abf5e" data-action="Deal Block" data-label="This 10,000mAh portable charger is the perfect accessory for charging up your phone quickly between classes. We also like how it has a battery status display, so you always know how much juice it has left." data-dimension48="This 10,000mAh portable charger is the perfect accessory for charging up your phone quickly between classes. We also like how it has a battery status display, so you always know how much juice it has left." data-dimension25="$59">View Deal</a></p></div><div class="product"><a data-dimension112="b716ae6e-5ff8-4025-9b40-3546d331b174" data-action="Deal Block" data-label="These affordable headphones offer effective noise cancellation for under $100, a comfy fit and up to 40 hours of battery life. And there’s an aware mode so you can still listen to tunes while hearing the world around you." data-dimension48="These affordable headphones offer effective noise cancellation for under $100, a comfy fit and up to 40 hours of battery life. And there’s an aware mode so you can still listen to tunes while hearing the world around you." data-dimension25="$59" href="https://www.amazon.com/JLab-Headphones-Cancelling-Customizable-Compatible/dp/B0CRM4Q1W1" 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="Ma3BZza59fUJ2isHLpzvSo" name="JLab JBuds Lux ANC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Ma3BZza59fUJ2isHLpzvSo.jpg" mos="" align="middle" fullscreen="" width="1000" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These affordable headphones offer effective noise cancellation for under $100, a comfy fit and up to 40 hours of battery life. And there’s an aware mode so you can still listen to tunes while hearing the world around you.<a class="view-deal button" href="https://www.amazon.com/JLab-Headphones-Cancelling-Customizable-Compatible/dp/B0CRM4Q1W1" target="_blank" rel="nofollow" data-dimension112="b716ae6e-5ff8-4025-9b40-3546d331b174" data-action="Deal Block" data-label="These affordable headphones offer effective noise cancellation for under $100, a comfy fit and up to 40 hours of battery life. And there’s an aware mode so you can still listen to tunes while hearing the world around you." data-dimension48="These affordable headphones offer effective noise cancellation for under $100, a comfy fit and up to 40 hours of battery life. And there’s an aware mode so you can still listen to tunes while hearing the world around you." data-dimension25="$59">View Deal</a></p></div><div class="product"><a data-dimension112="be358a4b-8583-4597-82a7-7d5df63e91be" data-action="Deal Block" data-label="This is a fun alarm clock from Nintendo. You’ll wake up to sounds and animations from your favorite games! You can snooze the alarm with gestures, and you can set it up so that you need to fully get out of bed to turn it off — thanks to the built-in motion sensor." data-dimension48="This is a fun alarm clock from Nintendo. You’ll wake up to sounds and animations from your favorite games! You can snooze the alarm with gestures, and you can set it up so that you need to fully get out of bed to turn it off — thanks to the built-in motion sensor." data-dimension25="$109" href="https://www.nintendo.com/us/store/products/nintendo-sound-clock-alarmo-121311/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1062px;"><p class="vanilla-image-block" style="padding-top:117.70%;"><img id="fkRLc4ivZhAez4RL7NMGGM" name="Nintendo_alarmo_deal_block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/fkRLc4ivZhAez4RL7NMGGM.jpg" mos="" align="middle" fullscreen="" width="1062" height="1250" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is a fun alarm clock from Nintendo. You’ll wake up to sounds and animations from your favorite games! You can snooze the alarm with gestures, and you can set it up so that you need to fully get out of bed to turn it off — thanks to the built-in motion sensor. <a class="view-deal button" href="https://www.nintendo.com/us/store/products/nintendo-sound-clock-alarmo-121311/" target="_blank" rel="nofollow" data-dimension112="be358a4b-8583-4597-82a7-7d5df63e91be" data-action="Deal Block" data-label="This is a fun alarm clock from Nintendo. You’ll wake up to sounds and animations from your favorite games! You can snooze the alarm with gestures, and you can set it up so that you need to fully get out of bed to turn it off — thanks to the built-in motion sensor." data-dimension48="This is a fun alarm clock from Nintendo. You’ll wake up to sounds and animations from your favorite games! You can snooze the alarm with gestures, and you can set it up so that you need to fully get out of bed to turn it off — thanks to the built-in motion sensor." data-dimension25="$109">View Deal</a></p></div><div class="product"><a data-dimension112="93e04df8-1eef-4f58-b08a-8fc59e95f6db" data-action="Deal Block" data-label="This wearable AI device offers automatic transcription and summarization of your class lectures, which is especially useful for students with special needs or those who may have trouble taking notes. It offers 20 hours of battery life." data-dimension48="This wearable AI device offers automatic transcription and summarization of your class lectures, which is especially useful for students with special needs or those who may have trouble taking notes. It offers 20 hours of battery life." data-dimension25="$159" href="https://www.amazon.com/PLAUD-Notetaker-Transcribe-Summarize-Languages/dp/B0DZWQ9WWJ" target="_blank" rel="nofollow sponsored"><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="2rzBhFJD9RFuAy7KdbU853" name="plaud deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2rzBhFJD9RFuAy7KdbU853.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This wearable AI device offers automatic transcription and summarization of your class lectures, which is especially useful for students with special needs or those who may have trouble taking notes. It offers 20 hours of battery life.<a class="view-deal button" href="https://www.amazon.com/PLAUD-Notetaker-Transcribe-Summarize-Languages/dp/B0DZWQ9WWJ" target="_blank" rel="nofollow sponsored" data-dimension112="93e04df8-1eef-4f58-b08a-8fc59e95f6db" data-action="Deal Block" data-label="This wearable AI device offers automatic transcription and summarization of your class lectures, which is especially useful for students with special needs or those who may have trouble taking notes. It offers 20 hours of battery life." data-dimension48="This wearable AI device offers automatic transcription and summarization of your class lectures, which is especially useful for students with special needs or those who may have trouble taking notes. It offers 20 hours of battery life." data-dimension25="$159">View Deal</a></p></div><div class="product"><a data-dimension112="4883b967-a2c1-4ef4-a14d-ff915884fe59" data-action="Deal Block" data-label="The MacBook Air M4 is a great thin-and-light laptop to bring to college with a powerful M4 chip, 15 hours of battery life and helpful new Apple Intelligence features. This includes a supercharged Spotlight feature that lets you take quick actions without even opening apps." data-dimension48="The MacBook Air M4 is a great thin-and-light laptop to bring to college with a powerful M4 chip, 15 hours of battery life and helpful new Apple Intelligence features. This includes a supercharged Spotlight feature that lets you take quick actions without even opening apps." data-dimension25="$799" href="https://www.amazon.com/Apple-2025-MacBook-13-inch-Laptop/dp/B0DZD9S5GC" 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="jaozhA6DUqwVKiykJv3KGG" name="macbook air m4  13inch" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/jaozhA6DUqwVKiykJv3KGG.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The MacBook Air M4 is a great thin-and-light laptop to bring to college with a powerful M4 chip, 15 hours of battery life and helpful new Apple Intelligence features. This includes a supercharged Spotlight feature that lets you take quick actions without even opening apps. <a class="view-deal button" href="https://www.amazon.com/Apple-2025-MacBook-13-inch-Laptop/dp/B0DZD9S5GC" target="_blank" rel="nofollow" data-dimension112="4883b967-a2c1-4ef4-a14d-ff915884fe59" data-action="Deal Block" data-label="The MacBook Air M4 is a great thin-and-light laptop to bring to college with a powerful M4 chip, 15 hours of battery life and helpful new Apple Intelligence features. This includes a supercharged Spotlight feature that lets you take quick actions without even opening apps." data-dimension48="The MacBook Air M4 is a great thin-and-light laptop to bring to college with a powerful M4 chip, 15 hours of battery life and helpful new Apple Intelligence features. This includes a supercharged Spotlight feature that lets you take quick actions without even opening apps." data-dimension25="$799">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Back to school season is here — I've picked 9 must-have essentials for your dorm from $17 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/ive-picked-the-weekends-best-back-to-school-deals-for-your-dorm-from-usd17</link>
                                                                            <description>
                            <![CDATA[ It's time to get ready for college and these dorm room essentials at spectacular prices will make sure you're comfortable as soon as you get there! Here's the 9 deals I'd recommend buying right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">knDGABBCH9hFpb99u4Hk5L</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ocnJgX25RNntUSanYQvyGE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 17 Aug 2025 07:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Grace Dean ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oxXqkks7wgxZkPiyYY2n6H.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/ocnJgX25RNntUSanYQvyGE-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Back to school dorm room tech]]></media:description>                                                            <media:text><![CDATA[Back to school dorm room tech]]></media:text>
                                <media:title type="plain"><![CDATA[Back to school dorm room tech]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ocnJgX25RNntUSanYQvyGE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Moving to college is a huge deal and bringing the essentials to your dorm room will make that transition a whole lot easier. Fortunately, in the lead up to college season, huge retailers like Amazon, Best Buy, Walmart and more are happy to offer some excellent deals to help with the move.</p><p>But, with a mega offering of deals to sift through, it can be a little overwhelming to firstly pick what you want/need for your dorm room and then find the best deals. That's where I've put in the hard work for you.</p><p>When I moved to college, I armed myself with some curated items (mainly with the lack of space in mind) and I've looked through all the deals to find the 9 deals I'd absolutely recommend buying right now from the <a href="https://www.target.com/p/keurig-k-mini-mate-single-serve-k-cup-pod-coffee-maker/-/A-94469594" target="_blank" rel="nofollow">Keurig K-Mini Mate for just $49 at Target</a> to the <a href="https://www.amazon.com/Sony-WF-C710N-Wireless-Noise-Canceling-Lightweight/dp/B0DWHPBK42" target="_blank" rel="nofollow">Sony WF-C710N<strong> </strong>wireless buds for $88 at Amazon</a>. </p><p>Because what you'll really appreciate is decent active noise-cancellation to help relax or focus and slimline kit to fit into your new space. So, get yourself settled fast with these amazing deals and save yourself some money for books (psst, nights out) now.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong>INIU Portable Power Bank: </strong><a href="https://www.amazon.com/INIU-High-Speed-Flashlight-Powerbank-Compatible/dp/B07CZDXDG8" target="_blank" rel="nofollow"><strong>was $21 now $17 @ Amazon</strong></a></li><li><strong>Lepro LED Desk Lamp: </strong><a href="https://www.amazon.com/Lepro-Dimmable-Control-Brightness-Diffused/dp/B08LMPCX3D" target="_blank" rel="nofollow"><strong>was $29 now $18 @ Amazon</strong></a></li><li><strong>Roku Streaming Stick Plus: </strong><a href="https://www.amazon.com/Roku-Streaming-Stick-Plus-2025/dp/B0DXY833HV/" target="_blank" rel="nofollow"><strong>was $39 now $29 @ Amazon</strong></a></li><li><strong>Keurig K-Mini Mate: </strong><a href="https://www.target.com/p/keurig-k-mini-mate-single-serve-k-cup-pod-coffee-maker/-/A-94469594" target="_blank" rel="nofollow"><strong>was $79 now $49 @ Target</strong></a></li><li><strong>Ultimate Ears Miniroll Speaker: </strong><a href="https://www.bestbuy.com/site/ultimate-ears-miniroll-ultra-portable-waterproof-bluetooth-speaker-with-131-ft-range-gentle-black/6599166.p?skuId=6599166" target="_blank" rel="nofollow"><strong>was $79 now $49 @ Best Buy</strong></a></li><li><strong>Frigidaire Retro Mini Fridge: </strong><a href="https://www.walmart.com/ip/Frigidaire-Retro-10L-15-Can-Mini-Personal-Fridge-Cooler-EFMIS183-Stainless-Steel/126311211" target="_blank" rel="nofollow"><strong>was $62 now $54 @ Walmart</strong></a></li><li><strong>Sony WF-C710N Wireless Earbuds: </strong><a href="https://www.amazon.com/Sony-WF-C710N-Wireless-Noise-Canceling-Lightweight/dp/B0DWHPBK42" target="_blank" rel="nofollow"><strong>was $129 now $88 @ Amazon</strong></a></li><li><strong>Beats Pill Wireless Speaker: </strong><a href="https://www.target.com/p/beats-pill-wireless-bluetooth-speaker/-/A-92595737?preselect=92268973" target="_blank" rel="nofollow"><strong>was $149 now $99 @ Target</strong></a><strong></strong></li><li><strong>Siena 10" Memory Foam Mattress: </strong><a href="https://www.sienasleep.com/mattress" target="_blank" rel="nofollow"><strong>was $453 now $179 @ Siena</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-best-dorm-room-essentials-deals"><span>Best dorm room essentials deals</span></h3><div class="product"><a data-dimension112="eb56e098-e5b2-4ea8-a1be-26406e66423d" data-action="Deal Block" data-label="Socket space might be hard to come by in your dorm room and when you don't fancy a battle, you can turn to a trusty portable charging bank. Plus, it's great for on-the-go, too. It's super thin and super fast with enough power to charge your essentials from smartphones to tablets. Avoid running out of battery by packing up this lightweight piece of kit, just 6.9oz." data-dimension48="Socket space might be hard to come by in your dorm room and when you don't fancy a battle, you can turn to a trusty portable charging bank. Plus, it's great for on-the-go, too. It's super thin and super fast with enough power to charge your essentials from smartphones to tablets. Avoid running out of battery by packing up this lightweight piece of kit, just 6.9oz." data-dimension25="$17" href="https://www.amazon.com/INIU-High-Speed-Flashlight-Powerbank-Compatible/dp/B07CZDXDG8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1100px;"><p class="vanilla-image-block" style="padding-top:93.82%;"><img id="r8WyuMNQexkuKmDFKvkHMi" name="INIU Portable Power Bank" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/r8WyuMNQexkuKmDFKvkHMi.png" mos="" align="middle" fullscreen="" width="1100" height="1032" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Socket space might be hard to come by in your dorm room and when you don't fancy a battle, you can turn to a trusty portable charging bank. Plus, it's great for on-the-go, too. It's super thin and super fast with enough power to charge your essentials from smartphones to tablets. Avoid running out of battery by packing up this lightweight piece of kit, just 6.9oz.<a class="view-deal button" href="https://www.amazon.com/INIU-High-Speed-Flashlight-Powerbank-Compatible/dp/B07CZDXDG8" target="_blank" rel="nofollow" data-dimension112="eb56e098-e5b2-4ea8-a1be-26406e66423d" data-action="Deal Block" data-label="Socket space might be hard to come by in your dorm room and when you don't fancy a battle, you can turn to a trusty portable charging bank. Plus, it's great for on-the-go, too. It's super thin and super fast with enough power to charge your essentials from smartphones to tablets. Avoid running out of battery by packing up this lightweight piece of kit, just 6.9oz." data-dimension48="Socket space might be hard to come by in your dorm room and when you don't fancy a battle, you can turn to a trusty portable charging bank. Plus, it's great for on-the-go, too. It's super thin and super fast with enough power to charge your essentials from smartphones to tablets. Avoid running out of battery by packing up this lightweight piece of kit, just 6.9oz." data-dimension25="$17">View Deal</a></p></div><div class="product"><a data-dimension112="0ebd2c3d-764b-4695-b233-fa94a4569be1" data-action="Deal Block" data-label="When an overhead light is too anti-social but you've still got papers to write and books to read, this LED desk lamp is the perfect slimline solution and right now, it's $11 off. With five lighting modes and five brightness levels, you can adjust it to match your needs without taking up too much space. If you fancy it in Black though, you'll need to pay one dollar more." data-dimension48="When an overhead light is too anti-social but you've still got papers to write and books to read, this LED desk lamp is the perfect slimline solution and right now, it's $11 off. With five lighting modes and five brightness levels, you can adjust it to match your needs without taking up too much space. If you fancy it in Black though, you'll need to pay one dollar more." data-dimension25="$18" href="https://www.amazon.com/Lepro-Dimmable-Control-Brightness-Diffused/dp/B08LMPCX3D" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1028px;"><p class="vanilla-image-block" style="padding-top:96.69%;"><img id="uySZm6myjuZQA5SNEbhyPh" name="Lepro LED Desk Lamp" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/uySZm6myjuZQA5SNEbhyPh.png" mos="" align="middle" fullscreen="" width="1028" height="994" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>When an overhead light is too anti-social but you've still got papers to write and books to read, this LED desk lamp is the perfect slimline solution and right now, it's $11 off. With five lighting modes and five brightness levels, you can adjust it to match your needs without taking up too much space. If you fancy it in Black though, you'll need to pay one dollar more.<a class="view-deal button" href="https://www.amazon.com/Lepro-Dimmable-Control-Brightness-Diffused/dp/B08LMPCX3D" target="_blank" rel="nofollow" data-dimension112="0ebd2c3d-764b-4695-b233-fa94a4569be1" data-action="Deal Block" data-label="When an overhead light is too anti-social but you've still got papers to write and books to read, this LED desk lamp is the perfect slimline solution and right now, it's $11 off. With five lighting modes and five brightness levels, you can adjust it to match your needs without taking up too much space. If you fancy it in Black though, you'll need to pay one dollar more." data-dimension48="When an overhead light is too anti-social but you've still got papers to write and books to read, this LED desk lamp is the perfect slimline solution and right now, it's $11 off. With five lighting modes and five brightness levels, you can adjust it to match your needs without taking up too much space. If you fancy it in Black though, you'll need to pay one dollar more." data-dimension25="$18">View Deal</a></p></div><div class="product"><a data-dimension112="6aba5b48-69b0-4af0-95d2-b5e876e1f4e7" data-action="Deal Block" data-label="Roku Streaming Stick Plus 2025" data-dimension48="Roku Streaming Stick Plus 2025" data-dimension25="$29" href="https://www.amazon.com/Roku-Streaming-Stick-Plus-2025/dp/B0DXY833HV/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:107.66%;"><img id="pPMgt2JhPvPv8oLkHjXc29" name="Roku Streaming Stick Plus 2025" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/pPMgt2JhPvPv8oLkHjXc29.jpg" mos="" align="middle" fullscreen="" width="679" height="731" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/entertainment/streaming-devices/roku-streaming-stick-plus-review-a-slimmed-down-4k-hdr-powerhouse" data-dimension112="6aba5b48-69b0-4af0-95d2-b5e876e1f4e7" data-action="Deal Block" data-label="Roku Streaming Stick Plus 2025" data-dimension48="Roku Streaming Stick Plus 2025" data-dimension25="$29">Roku Streaming Stick Plus 2025</a> is the latest upgrade in Roku’s lineup, replacing the previous Express 4K Plus. This newer model is smaller, faster, and more powerful, offering stunning 4K HDR and Dolby Vision streaming. With improved Wi-Fi and access to thousands of channels, it’s one of the <a href="https://www.tomsguide.com/best-picks/best-roku-devices">best Roku devices</a> right now.<a class="view-deal button" href="https://www.amazon.com/Roku-Streaming-Stick-Plus-2025/dp/B0DXY833HV/" target="_blank" rel="nofollow" data-dimension112="6aba5b48-69b0-4af0-95d2-b5e876e1f4e7" data-action="Deal Block" data-label="Roku Streaming Stick Plus 2025" data-dimension48="Roku Streaming Stick Plus 2025" data-dimension25="$29">View Deal</a></p></div><div class="product"><a data-dimension112="3d01722f-f809-4744-bde6-17fd7cfcad36" data-action="Deal Block" data-label="K-Mini Mate" data-dimension48="K-Mini Mate" data-dimension25="$49" href="https://www.target.com/p/keurig-k-mini-mate-single-serve-k-cup-pod-coffee-maker/-/A-94469594" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1214px;"><p class="vanilla-image-block" style="padding-top:92.09%;"><img id="jcFDpXC2C6Rw6ssZkZruRi" name="Keurig K-Mini Mate" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/jcFDpXC2C6Rw6ssZkZruRi.png" mos="" align="middle" fullscreen="" width="1214" height="1118" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Short on space? No problem. Keurig's smallest coffee maker ever will fit nicely into your dorm room. And, if a quick cup of coffee is what keeps you going, but you don't want to spend cafe prices, the <a href="https://www.tomsguide.com/home/coffee-makers/keurig-just-launched-its-smallest-coffee-maker-ever-meet-the-k-mini-mate" data-dimension112="3d01722f-f809-4744-bde6-17fd7cfcad36" data-action="Deal Block" data-label="K-Mini Mate" data-dimension48="K-Mini Mate" data-dimension25="$49">K-Mini Mate</a> is an excellent buy. Using single-serve pods, you pop it in, press a button and you're sorted. Now at $30 off with money saving potential all year round.<a class="view-deal button" href="https://www.target.com/p/keurig-k-mini-mate-single-serve-k-cup-pod-coffee-maker/-/A-94469594" target="_blank" rel="nofollow" data-dimension112="3d01722f-f809-4744-bde6-17fd7cfcad36" data-action="Deal Block" data-label="K-Mini Mate" data-dimension48="K-Mini Mate" data-dimension25="$49">View Deal</a></p></div><div class="product"><a data-dimension112="9ee33051-c194-4c48-a67b-0a76d3888b37" data-action="Deal Block" data-label="Ultimate Ears Miniroll" data-dimension48="Ultimate Ears Miniroll" data-dimension25="$49" href="https://www.bestbuy.com/site/ultimate-ears-miniroll-ultra-portable-waterproof-bluetooth-speaker-with-131-ft-range-gentle-black/6599166.p?skuId=6599166" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1122px;"><p class="vanilla-image-block" style="padding-top:86.10%;"><img id="rTazZtVn5opqnJnVB5akZi" name="Ultimate Ears Miniroll Portable Speaker" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rTazZtVn5opqnJnVB5akZi.png" mos="" align="middle" fullscreen="" width="1122" height="966" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/bluetooth-speakers/ue-miniroll-review-tiny-but-mighty" data-dimension112="9ee33051-c194-4c48-a67b-0a76d3888b37" data-action="Deal Block" data-label="Ultimate Ears Miniroll" data-dimension48="Ultimate Ears Miniroll" data-dimension25="$49">Ultimate Ears Miniroll</a> is our top cheap pick amongst the <a href="https://www.tomsguide.com/us/best-bluetooth-speakers,review-1982.html#section-best-cheap-bluetooth-speaker">best Bluetooth speakers</a>, and now it's even cheaper. It's very compact  and portable, as well as producing solid sound considering its miniature size. Plus, the rugged design is durable and can survive being carted around across campus. And there's a decent battery life of 16 hours to boot, all for just $49.<a class="view-deal button" href="https://www.bestbuy.com/site/ultimate-ears-miniroll-ultra-portable-waterproof-bluetooth-speaker-with-131-ft-range-gentle-black/6599166.p?skuId=6599166" target="_blank" rel="nofollow" data-dimension112="9ee33051-c194-4c48-a67b-0a76d3888b37" data-action="Deal Block" data-label="Ultimate Ears Miniroll" data-dimension48="Ultimate Ears Miniroll" data-dimension25="$49">View Deal</a></p></div><div class="product"><a data-dimension112="65e1db95-7c01-46c3-a5d4-ee75169d5f7e" data-action="Deal Block" data-label="Moving to college doesn't mean you have to give up the luxury of having snacks and drinks at hand, especially with the Frigidaire Retro Mini Fridge installed. It's stylish and compact, but still makes room for up to 15 cans or 10 liters of your favorite beverages. It's also 'whisper-quiet', so it won't bother those around you while it's keeping your items cool." data-dimension48="Moving to college doesn't mean you have to give up the luxury of having snacks and drinks at hand, especially with the Frigidaire Retro Mini Fridge installed. It's stylish and compact, but still makes room for up to 15 cans or 10 liters of your favorite beverages. It's also 'whisper-quiet', so it won't bother those around you while it's keeping your items cool." data-dimension25="$54" href="https://www.walmart.com/ip/Frigidaire-Retro-10L-15-Can-Mini-Personal-Fridge-Cooler-EFMIS183-Stainless-Steel/126311211" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1272px;"><p class="vanilla-image-block" style="padding-top:85.69%;"><img id="KD8DNwha6kHwdoSqttxQ5i" name="Frigidaire Retro Mini Fridge" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KD8DNwha6kHwdoSqttxQ5i.png" mos="" align="middle" fullscreen="" width="1272" height="1090" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Moving to college doesn't mean you have to give up the luxury of having snacks and drinks at hand, especially with the Frigidaire Retro Mini Fridge installed. It's stylish and compact, but still makes room for up to 15 cans or 10 liters of your favorite beverages. It's also 'whisper-quiet', so it won't bother those around you while it's keeping your items cool.<a class="view-deal button" href="https://www.walmart.com/ip/Frigidaire-Retro-10L-15-Can-Mini-Personal-Fridge-Cooler-EFMIS183-Stainless-Steel/126311211" target="_blank" rel="nofollow" data-dimension112="65e1db95-7c01-46c3-a5d4-ee75169d5f7e" data-action="Deal Block" data-label="Moving to college doesn't mean you have to give up the luxury of having snacks and drinks at hand, especially with the Frigidaire Retro Mini Fridge installed. It's stylish and compact, but still makes room for up to 15 cans or 10 liters of your favorite beverages. It's also 'whisper-quiet', so it won't bother those around you while it's keeping your items cool." data-dimension48="Moving to college doesn't mean you have to give up the luxury of having snacks and drinks at hand, especially with the Frigidaire Retro Mini Fridge installed. It's stylish and compact, but still makes room for up to 15 cans or 10 liters of your favorite beverages. It's also 'whisper-quiet', so it won't bother those around you while it's keeping your items cool." data-dimension25="$54">View Deal</a></p></div><div class="product"><a data-dimension112="3673dd44-29ad-49c1-8a4e-bcc4408d25b3" data-action="Deal Block" data-label="Sony WF-C710N" data-dimension48="Sony WF-C710N" data-dimension25="$88" href="https://www.amazon.com/Sony-WF-C710N-Wireless-Noise-Canceling-Lightweight/dp/B0DWHPBK42" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1138px;"><p class="vanilla-image-block" style="padding-top:86.12%;"><img id="tpiudNRmQCSjwYuThTYRah" name="Sony WF-C710N Wireless Earbuds" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tpiudNRmQCSjwYuThTYRah.png" mos="" align="middle" fullscreen="" width="1138" height="980" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/audio/earbuds/sony-wf-c710n-wireless-earbuds-review" data-dimension112="3673dd44-29ad-49c1-8a4e-bcc4408d25b3" data-action="Deal Block" data-label="Sony WF-C710N" data-dimension48="Sony WF-C710N" data-dimension25="$88">Sony WF-C710N</a> are our budget heroes, taking the top spot for value in our <a href="https://www.tomsguide.com/us/best-wireless-earbuds,review-6160.html#section-best-value-wireless-earbuds">best wireless earbuds</a> guide. And fortunately, even though they're budget-priced, they still boast highly effective ANC which is a <em>really</em> good feature to have in your dorm. When you need to zone out and lock in, these buds have up to 33.5 hours of battery life and are extremely comfortable for long-term wear.<a class="view-deal button" href="https://www.amazon.com/Sony-WF-C710N-Wireless-Noise-Canceling-Lightweight/dp/B0DWHPBK42" target="_blank" rel="nofollow" data-dimension112="3673dd44-29ad-49c1-8a4e-bcc4408d25b3" data-action="Deal Block" data-label="Sony WF-C710N" data-dimension48="Sony WF-C710N" data-dimension25="$88">View Deal</a></p></div><div class="product"><a data-dimension112="ee7d43a4-72ac-4c2c-bf52-b5f6fabe99f7" data-action="Deal Block" data-label="This Beats Pill is a redesigned version of the original with improved sound, a huge 24-hour battery life, USB-C charging and IP67-rated for any moments used by the pool or at the beach. For the dorm room, it's a perfect slimline fit that can still dominate with its punchy sound. For this deal, you can grab it in Gold, Black, Red or Pink – all for the same price." data-dimension48="This Beats Pill is a redesigned version of the original with improved sound, a huge 24-hour battery life, USB-C charging and IP67-rated for any moments used by the pool or at the beach. For the dorm room, it's a perfect slimline fit that can still dominate with its punchy sound. For this deal, you can grab it in Gold, Black, Red or Pink – all for the same price." data-dimension25="$99" href="https://www.target.com/p/beats-pill-wireless-bluetooth-speaker/-/A-92595737?preselect=92268973" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1242px;"><p class="vanilla-image-block" style="padding-top:84.38%;"><img id="LKuaPtwRAAh8fCNEGdRjmi" name="Beats Pill Wireless Speaker" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/LKuaPtwRAAh8fCNEGdRjmi.png" mos="" align="middle" fullscreen="" width="1242" height="1048" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This Beats Pill is a redesigned version of the original with improved sound, a huge 24-hour battery life, USB-C charging and IP67-rated for any moments used by the pool or at the beach. For the dorm room, it's a perfect slimline fit that can still dominate with its punchy sound. For this deal, you can grab it in Gold, Black, Red or Pink – all for the same price.<a class="view-deal button" href="https://www.target.com/p/beats-pill-wireless-bluetooth-speaker/-/A-92595737?preselect=92268973" target="_blank" rel="nofollow" data-dimension112="ee7d43a4-72ac-4c2c-bf52-b5f6fabe99f7" data-action="Deal Block" data-label="This Beats Pill is a redesigned version of the original with improved sound, a huge 24-hour battery life, USB-C charging and IP67-rated for any moments used by the pool or at the beach. For the dorm room, it's a perfect slimline fit that can still dominate with its punchy sound. For this deal, you can grab it in Gold, Black, Red or Pink – all for the same price." data-dimension48="This Beats Pill is a redesigned version of the original with improved sound, a huge 24-hour battery life, USB-C charging and IP67-rated for any moments used by the pool or at the beach. For the dorm room, it's a perfect slimline fit that can still dominate with its punchy sound. For this deal, you can grab it in Gold, Black, Red or Pink – all for the same price." data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="d034dbb0-e72a-4721-8425-3a056ed494fe" data-action="Deal Block" data-label="Siena Memory Foam Mattress" data-dimension48="Siena Memory Foam Mattress" data-dimension25="$179" href="https://www.sienasleep.com/mattress" 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="gGzyxJ5MA5gJgQxSGKSjtH" name="Siena Memory Foam Mattress deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/gGzyxJ5MA5gJgQxSGKSjtH.jpg" mos="" align="middle" fullscreen="" width="1200" height="1200" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>In our <a href="https://www.tomsguide.com/reviews/siena-memory-foam-mattress" data-dimension112="d034dbb0-e72a-4721-8425-3a056ed494fe" data-action="Deal Block" data-label="Siena Memory Foam Mattress" data-dimension48="Siena Memory Foam Mattress" data-dimension25="$179">Siena Memory Foam Mattress</a> review, our side and back sleepers were pleased with the full-body support of the Siena all-foam mattress. So was our lone stomach sleeper, who liked that her hips didn't sink below the rest of her body. It did take a few nights for the mattress to soften slightly, though, to give that memory foam "hug." We rate the Siena as one of the <a href="https://www.tomsguide.com/best-picks/best-mattresses">best mattresses</a> you can buy. The twin is $179, whereas the queen is $359.<a class="view-deal button" href="https://www.sienasleep.com/mattress" target="_blank" rel="nofollow" data-dimension112="d034dbb0-e72a-4721-8425-3a056ed494fe" data-action="Deal Block" data-label="Siena Memory Foam Mattress" data-dimension48="Siena Memory Foam Mattress" data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="e374fe4a-c23f-4388-bf12-a4ae7cb9131d" data-action="Deal Block" data-label="If you're not into buds and prefer over-ears, the Sennheiser Accentum are another excellent buy with an incredible $61 off (as long as you buy them in White). It's a hell of a deal and one that'll give you strong sound and solid ANC performance, without having to part with loads of cash. With up to 50 hours of battery life too, they're really impressive and you can even get 5 hours out of just one single 10-minute charge." data-dimension48="If you're not into buds and prefer over-ears, the Sennheiser Accentum are another excellent buy with an incredible $61 off (as long as you buy them in White). It's a hell of a deal and one that'll give you strong sound and solid ANC performance, without having to part with loads of cash. With up to 50 hours of battery life too, they're really impressive and you can even get 5 hours out of just one single 10-minute charge." data-dimension25="$119" href="https://www.walmart.com/ip/Sennheiser-Accentum-Wireless-Bluetooth-Headphones-with-AptX-HD-Hybrid-Active-Noise-Cancellation-White/5061036857?wmlspartner=wlpa&selectedSellerId=7859&sourceid=dsn_ad_fac153e8-a819-4e04-9af5-1c5d04a29929&veh=dsn&wmlspartner=dsn_ad_fac153e8-a819-4e04-9af5-1c5d04a29929&cn=FY26-MP-PMax_cnv_dps_dsn_dis_ad_mp_s_n&gclsrc=aw.ds&wl9=pla&wl11=online&gad_source=1&gad_campaignid=22532405497&gbraid=0AAAAADmfBIpvmnXImDw_LFOdz-B6PB1hC&gclid=Cj0KCQjwqebEBhD9ARIsAFZMbfzhy4clvwgRVJm6_DIVz-kuQfHPofEhBrlUGwKMUXAIEp1yncLyJOwaAiBYEALw_wcB" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1198px;"><p class="vanilla-image-block" style="padding-top:87.48%;"><img id="rfzfPB97EzP7f8FqBqMLkh" name="Sennheiser Accentum Headphones" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rfzfPB97EzP7f8FqBqMLkh.png" mos="" align="middle" fullscreen="" width="1198" height="1048" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you're not into buds and prefer over-ears, the Sennheiser Accentum are another excellent buy with an incredible $61 off (as long as you buy them in White). It's a hell of a deal and one that'll give you strong sound and solid ANC performance, without having to part with loads of cash. With up to 50 hours of battery life too, they're really impressive and you can even get 5 hours out of just one single 10-minute charge.<a class="view-deal button" href="https://www.walmart.com/ip/Sennheiser-Accentum-Wireless-Bluetooth-Headphones-with-AptX-HD-Hybrid-Active-Noise-Cancellation-White/5061036857?wmlspartner=wlpa&selectedSellerId=7859&sourceid=dsn_ad_fac153e8-a819-4e04-9af5-1c5d04a29929&veh=dsn&wmlspartner=dsn_ad_fac153e8-a819-4e04-9af5-1c5d04a29929&cn=FY26-MP-PMax_cnv_dps_dsn_dis_ad_mp_s_n&gclsrc=aw.ds&wl9=pla&wl11=online&gad_source=1&gad_campaignid=22532405497&gbraid=0AAAAADmfBIpvmnXImDw_LFOdz-B6PB1hC&gclid=Cj0KCQjwqebEBhD9ARIsAFZMbfzhy4clvwgRVJm6_DIVz-kuQfHPofEhBrlUGwKMUXAIEp1yncLyJOwaAiBYEALw_wcB" target="_blank" rel="nofollow" data-dimension112="e374fe4a-c23f-4388-bf12-a4ae7cb9131d" data-action="Deal Block" data-label="If you're not into buds and prefer over-ears, the Sennheiser Accentum are another excellent buy with an incredible $61 off (as long as you buy them in White). It's a hell of a deal and one that'll give you strong sound and solid ANC performance, without having to part with loads of cash. With up to 50 hours of battery life too, they're really impressive and you can even get 5 hours out of just one single 10-minute charge." data-dimension48="If you're not into buds and prefer over-ears, the Sennheiser Accentum are another excellent buy with an incredible $61 off (as long as you buy them in White). It's a hell of a deal and one that'll give you strong sound and solid ANC performance, without having to part with loads of cash. With up to 50 hours of battery life too, they're really impressive and you can even get 5 hours out of just one single 10-minute charge." data-dimension25="$119">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Massive Apple leak just revealed 10 new products — Apple Watch 11, new Apple TV, new iPad mini and more  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/whoops-apple-just-accidentally-leaked-10-new-products-heres-everything-thats-coming</link>
                                                                            <description>
                            <![CDATA[ Apple's mistake provided us with a glimpse of the company's future plans, and things are looking promising. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4FXWEsc8wmc7jDCh7bwyah</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/T2nsAAmkxgTc8YGE7ftSzB-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 15 Aug 2025 14:57:41 +0000</pubDate>                                                                                                                                <updated>Fri, 15 Aug 2025 16:16:30 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></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 Senior 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/T2nsAAmkxgTc8YGE7ftSzB-1280-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tim Cook at an Apple event]]></media:description>                                                            <media:text><![CDATA[Tim Cook at an Apple event]]></media:text>
                                <media:title type="plain"><![CDATA[Tim Cook at an Apple event]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/T2nsAAmkxgTc8YGE7ftSzB-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>A massive new leak in Apple's own software code has reportedly revealed several unannounced hardware devices. In total, 10 new products were found by <a href="https://www.macrumors.com/2025/08/14/every-apple-secret-that-leaked-yesterday/" target="_blank">MacRumors</a> — that's a lot of Apple news to drop in a single day. This includes a new HomePod mini, a new Apple TV, new iPad, new Vision Pro and three new Apple Watches. </p><p>In fact, that's probably more than Apple will even announce at its <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-event-rumored-date-and-all-the-new-products-expected-to-launch">iPhone 17 event</a>, which is rapidly approaching. These devices may be available further down the road, so you may need to be patient for some of them. Here are all the devices that have been leaked, along with the information we have about them (for some, the details are very limited).</p><h2 id="new-homepod-mini-with-updated-chip">New HomePod mini with updated chip</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1960px;"><p class="vanilla-image-block" style="padding-top:42.86%;"><img id="ipxyu4Rf6gSwmiUEW3z5vC" name="HomePod-mini-kitchen_HERO.jpg" alt="Apple HomePod mini" src="https://cdn.mos.cms.futurecdn.net/ipxyu4Rf6gSwmiUEW3z5vC.jpg" mos="" align="middle" fullscreen="" width="1960" height="840" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>We've heard <a href="https://www.tomsguide.com/home/smart-home/new-apple-tv-and-homepod-mini-reportedly-launching-in-2025-with-apple-networking-chip">rumors of a new HomePod mini</a> for some time, and the big Apple leak seemingly confirms that the company is working on one. </p><p>The code leak references a device with a chip that uses T8310 microarchitecture, the same used in Apple Watch devices. While we don't know the exact model — it could be the S9, S10, or S11 based on all of those using the same technology — we can safely assume it'll be an upgraded version of the S5 chip found in the <a href="https://www.tomsguide.com/reviews/apple-homepod-mini">current HomePod mini</a>, which is getting a bit old now.</p><h2 id="new-apple-tv-with-a17-pro-chip">New Apple TV with A17 Pro chip</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="X2oggLgBnxuc5iHqkrTpgZ" name="Apple TV loses netflix access.jpg" alt="Apple TV on counter in living room" src="https://cdn.mos.cms.futurecdn.net/X2oggLgBnxuc5iHqkrTpgZ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>It's about time for Apple to release an <a href="https://www.tomsguide.com/tvs/new-apple-tv-expected-in-2025-all-the-rumors-so-far">updated Apple TV device</a>, and it appears that it will happen in the relatively near future. Based on the leak's claim that the new device will use an A17 Pro chip, it could represent a significant power boost from the previous generation — the current model features a reasonably powerful <a href="https://www.tomsguide.com/news/a16-bionic-vs-a15-bionic">A15 Bionic chip</a>. </p><p>Unfortunately, that's about all we know about this new Apple TV device. Form factor and other performance elements weren't revealed in this leak, but if the device is coming soon, I'm sure additional news will follow.</p><h2 id="apple-studio-display-2">Apple Studio Display 2</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TJW6XntruxNCDjxnkD2sYg" name="TG_Mac-Studio-Display-LIST.jpg" alt="Mac Studio on a desk plugged into a Studio Display" src="https://cdn.mos.cms.futurecdn.net/TJW6XntruxNCDjxnkD2sYg.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/reviews/apple-studio-display">original Studio Display</a> was released in 2022, so it's time for Apple to introduce a new one. A <a href="https://www.tomsguide.com/computing/apple-reportedly-working-on-two-new-studio-display-monitors-heres-what-i-want-to-see">Studio Display 2</a> with the codename J427 was spotted in this giant leak, indicating that the monitor is likely part of Apple's plans.</p><p>Unfortunately, we have more questions than answers regarding what the monitor will offer, but we're excited to see it next year, as the prevailing <a href="https://www.tomsguide.com/computing/apple-desktops/apples-next-studio-display-tipped-to-arrive-in-2026-and-itll-be-brighter-than-ever">rumors suggest it'll launch in early 2026</a>. </p><h2 id="new-ipad-mini-with-a19-pro-chip">New iPad mini with A19 Pro chip</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:775px;"><p class="vanilla-image-block" style="padding-top:64.52%;"><img id="UZ2wGncH98st5QcJSpnakb" name="ipad mini 5.jpg" alt="iPad Mini 5" src="https://cdn.mos.cms.futurecdn.net/UZ2wGncH98st5QcJSpnakb.jpg" mos="" align="middle" fullscreen="" width="775" height="500" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/reviews/apple-ipad-mini-6-2021">iPad mini</a> is Apple's most portable tablet option, making it ideal for a specific subset of buyers. It appears that a new one is on the way, and it features the <a href="https://www.tomsguide.com/phones/iphones/apple-a19-pro-chip-rumored-to-be-the-first-in-the-world-to-use-2nm-manufacutring-process">A19 Pro chip</a> that Apple plans to use in the <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro">iPhone 17 Pro</a> models. </p><p>That means the small tablet should offer stellar speed and performance compared to its predecessor with the A17 Pro chip. </p><h2 id="new-low-cost-ipad-with-a18-chip">New low-cost iPad with A18 chip</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2yqdyE2pSZWHbng9UkAiQb" name="iPad-Pro-11-2021_LIST.jpg" alt="iPad Pro 2021 (11-inch) review" src="https://cdn.mos.cms.futurecdn.net/2yqdyE2pSZWHbng9UkAiQb.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></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 base iPad is one of the best choices for many tablet buyers who don't need the most powerful devices on the market. The 12th-generation entry-level iPad is expected to utilize the A18 chip, according to MacRumors' findings. That would be Apple skipping the A17, as the 11th-generation iPad already features the A16.</p><h2 id="apple-vision-pro-with-m5-chip">Apple Vision Pro with M5 chip </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:42.85%;"><img id="FkEmFKxyK36Upypia9VoSM" name="Vision Pro HERO.jpg" alt="Apple Vision Pro" src="https://cdn.mos.cms.futurecdn.net/FkEmFKxyK36Upypia9VoSM.jpg" mos="" align="middle" fullscreen="" width="2000" height="857" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>There have been conflicting reports about whether <a href="https://www.tomsguide.com/computing/vr-ar/report-apple-may-stop-producing-vision-pro-by-next-month">Apple was giving up on the Vision Pro</a> or making a new one. This code leak seemingly confirms the company is, in fact, <a href="https://www.tomsguide.com/computing/vr-ar/apple-vision-pro-2">working on a new model</a> and that it will have the powerful M5 chip. Other rumors have suggested minimal hardware changes and improvements, but a new chip could be enough to incentivize others to hop on the bandwagon.</p><h2 id="apple-watch-11-apple-watch-ultra-3-and-apple-watch-se-3">Apple Watch 11, Apple Watch Ultra 3 and Apple Watch SE 3</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6EDQW8aCeegUtUxHYj7gBh" name="Apple Watch Ultra 2 LIST.jpg" alt="Apple Watch Ultra 2" src="https://cdn.mos.cms.futurecdn.net/6EDQW8aCeegUtUxHYj7gBh.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-biked-12-miles-with-the-apple-watch-10-vs-samsung-galaxy-watch-8-and-theres-a-clear-winner">I biked 12 miles with the Apple Watch 10 vs Samsung Galaxy Watch 8, and there's a clear winner</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-11">Apple Watch 11 — all the biggest rumors so far</a></li><li><a href="https://www.tomsguide.com/phones/iphones/mark-your-calendars-iphone-17-release-date-just-leaked">Mark your calendars — iPhone 17 release date may have just leaked</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I review tech for a living: 9 top-rated gadgets under $50 and on sale at Amazon now ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/i-review-tech-for-a-living-9-top-rated-gadgets-under-usd50-and-on-sale-right-now-at-amazon</link>
                                                                            <description>
                            <![CDATA[ I spend all day, every day, testing gadgets and tech. Here are my favorite products on sale for under $50 right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">xmzLoC5NNvjSURQjUSxvEP</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/udwBmC5erccqdJj7ZPgUNB-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 15 Aug 2025 11:00:00 +0000</pubDate>                                                                                                                                <updated>Tue, 19 Aug 2025 05:10:20 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&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/udwBmC5erccqdJj7ZPgUNB-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A split photo showing the EarFun Air Pro 3 on the left and the Amazfit Band 7 on the right.]]></media:description>                                                            <media:text><![CDATA[A split photo showing the EarFun Air Pro 3 on the left and the Amazfit Band 7 on the right.]]></media:text>
                                <media:title type="plain"><![CDATA[A split photo showing the EarFun Air Pro 3 on the left and the Amazfit Band 7 on the right.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/udwBmC5erccqdJj7ZPgUNB-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As the Tom's Guide reviews editor, my team of expert reviewers and I put tech through its paces to figure out whether it's worth your money. Naturally, a big factor in our analysis is pricing, so I'm always having to check the prices of products and monitor cost changes over time. That means I've permanently got a Chrome tab open for Amazon. </p><p>As I was checking prices for some camera gear, I couldn't help but notice that quite a few of my favorite budget products are on sale. </p><p>For instance, the <a href="https://www.amazon.com/EarFun-Air-Pro-Cancelling-Multipoint/dp/B0BNNMYSGQ" target="_blank" rel="nofollow">EarFun Air Pro 3 are currently on sale for just $47 at Amazon</a>, and these are some of the <a href="https://www.tomsguide.com/us/best-wireless-earbuds,review-6160.html">best wireless earbuds</a> around if you're on a budget. Looking for a new Bluetooth speaker? <a href="https://www.amazon.com/JBL-Ultra-Portable-Waterproof-Dustproof-Built/dp/B0CX5C6WP3" target="_blank" rel="nofollow">The JBL Go 4 is now only $43 at Amazon</a> — I reviewed this speaker personally and loved it! And if you're a gamer, check out one of our favorite budget gaming keyboards, the <a href="https://www.amazon.com/LEMOKEY-Mechanical-Programmable-North-facing-Compatible/dp/B0CTJR6KJ8" target="_blank" rel="nofollow">Lemokey X1, which is just $22 at Amazon</a>. </p><p>And there's more where that came from. To help you guys save money, I rounded up my favorite sub-$50 deals here. And don't miss out on these <a href="https://www.tomsguide.com/coupons/amazon.com">Amazon promo codes. </a></p><h2 class="article-body__section" id="section-quick-list"><span>Quick list</span></h2><ul><li><strong>Redragon M916 8K wireless gaming mouse: </strong><a href="https://www.amazon.com/dp/B0D2WT11JD" target="_blank" rel="nofollow"><strong>was $39 now $18 w/ Prime</strong></a><strong></strong></li><li><strong>Lemokey X1 gaming keyboard: </strong><a href="https://www.amazon.com/LEMOKEY-Mechanical-Programmable-North-facing-Compatible/dp/B0CTJR6KJ8" target="_blank" rel="nofollow"><strong>was $36 now $22 at Amazon</strong></a><strong></strong></li><li><strong>Anker Nano II multi-charger: </strong><a href="https://www.amazon.com/Anker-Charger-Compact-Foldable-MacBook/dp/B09C5RG6KV" target="_blank" rel="nofollow"><strong>was $39 now $25 at Amazon</strong></a><strong></strong></li><li><strong>Gamakay TK75 mechanical keyboard: </strong><a href="https://www.amazon.com/GK-GAMAKAY-TK75-Bluetooth-Mechanical/dp/B0BRPVB42T" target="_blank" rel="nofollow"><strong>was $49 now $34 at Amazon</strong></a></li><li><strong>Amazfit Band 7 fitness tracker: </strong><a href="https://www.amazon.com/Amazfit-Fitness-Tracker-Monitoring-Resistant/dp/B0C2717Y6G" target="_blank" rel="nofollow"><strong>was $47 now $37 at Amazon</strong></a><strong></strong></li><li><strong>JBL Go 4 Bluetooth speaker: </strong><a href="https://www.amazon.com/JBL-Ultra-Portable-Waterproof-Dustproof-Built/dp/B0CX5C6WP3" target="_blank" rel="nofollow"><strong>was $49 now $43 at Amazon</strong></a><strong></strong></li><li><strong>GameSir G7 SE gaming controller: </strong><a href="https://www.amazon.com/GameSir-Controller-Xbox-One-Windows-Joysticks/dp/B0D8KXMCTC" target="_blank" rel="nofollow"><strong>was $49 now $44 at Amazon</strong></a><strong></strong></li><li><strong>EarFun Air Pro 3 wireless earbuds:</strong><a href="https://www.amazon.com/EarFun-Air-Pro-Cancelling-Multipoint/dp/B0BNNMYSGQ" target="_blank" rel="nofollow"><strong> was $65 now $47 at Amazon</strong></a><strong></strong></li><li><strong>Cosori Mini Air Fryer: </strong><a href="https://www.amazon.com/COSORI-2-1-Quart-Leftover-Nonstick-Dishwasher-Safe/dp/B0BDFRZX3F" target="_blank" rel="nofollow"><strong>was $59 now $49 at Amazon</strong></a><strong></strong></li></ul><h2 class="article-body__section" id="section-editor-approved-deals-under-50"><span>Editor-approved deals under $50</span></h2><div class="product"><a data-dimension112="e2da712c-775e-4314-ae2c-e7de664c95a8" data-action="Deal Block" data-label="EarFun Air Pro 3" data-dimension48="EarFun Air Pro 3" data-dimension25="$47" href="https://www.amazon.com/EarFun-Air-Pro-Cancelling-Multipoint/dp/B0BNNMYSGQ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1228px;"><p class="vanilla-image-block" style="padding-top:99.59%;"><img id="Cgp37AGa6qGPskXkFNeykH" name="Earfun-Air-Pro-3-deal.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Cgp37AGa6qGPskXkFNeykH.jpg" mos="" align="middle" fullscreen="" width="1228" height="1223" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>My team reviewed the <a href="https://www.tomsguide.com/audio/earbuds/earfun-air-pro-3-review" data-dimension112="e2da712c-775e-4314-ae2c-e7de664c95a8" data-action="Deal Block" data-label="EarFun Air Pro 3" data-dimension48="EarFun Air Pro 3" data-dimension25="$47">EarFun Air Pro 3</a> last year, when we awarded a 4-star rating to these budget earbuds. The sound quality is strong for the money, while the ANC and battery life are excellent. I own the <a href="https://www.tomsguide.com/audio-headphones/earbuds/earfun-air-pro-4-review">EarFun Air Pro 4</a>s (also on sale for <a href="https://www.amazon.com/EarFun-Canceling-Snapdragon-Bluetooth-Detection/dp/B0D5M9SH1X" target="_blank" rel="nofollow">$67 at Amazon</a>) and I would recommend these instead if you can stretch the extra $20, as they're phenomenal and won 4.5 stars from us. You won't regret the Air Pro 3s, though, as they're still brilliant buds.<a class="view-deal button" href="https://www.amazon.com/EarFun-Air-Pro-Cancelling-Multipoint/dp/B0BNNMYSGQ" target="_blank" rel="nofollow" data-dimension112="e2da712c-775e-4314-ae2c-e7de664c95a8" data-action="Deal Block" data-label="EarFun Air Pro 3" data-dimension48="EarFun Air Pro 3" data-dimension25="$47">View Deal</a></p></div><div class="product"><a data-dimension112="3e04365f-5a9b-4421-a7a1-39fdec892b81" data-action="Deal Block" data-label="Redragon M916 review" data-dimension48="Redragon M916 review" data-dimension25="$18" href="https://www.amazon.com/dp/B0D2WT11JD" 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="saRYf79vb62jyn7N7TWCd9" name="Redragon M916.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/saRYf79vb62jyn7N7TWCd9.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>"Proof that gaming performance can come cheap" is how we described this mouse in our 4-star <a href="https://www.tomsguide.com/computing/peripherals/redragon-m916-pro-review" data-dimension112="3e04365f-5a9b-4421-a7a1-39fdec892b81" data-action="Deal Block" data-label="Redragon M916 review" data-dimension48="Redragon M916 review" data-dimension25="$18">Redragon M916 review</a>. This brilliant little gaming mouse is extremely light and offers excellent gaming features for the money, including adjustable DPI up to 8K. <em>This deal is for Prime Members only.</em><a class="view-deal button" href="https://www.amazon.com/dp/B0D2WT11JD" target="_blank" rel="nofollow" data-dimension112="3e04365f-5a9b-4421-a7a1-39fdec892b81" data-action="Deal Block" data-label="Redragon M916 review" data-dimension48="Redragon M916 review" data-dimension25="$18">View Deal</a></p></div><div class="product"><a data-dimension112="fc69ced6-fbb7-435f-a069-e0bc95bddb70" data-action="Deal Block" data-label="JBL Go 4" data-dimension48="JBL Go 4" data-dimension25="$43" href="https://www.amazon.com/JBL-Ultra-Portable-Waterproof-Dustproof-Built/dp/B0CX5C6WP3" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:466px;"><p class="vanilla-image-block" style="padding-top:106.22%;"><img id="FYpKvYvcYxzYCKVsg4CtRQ" name="JBL Go 4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FYpKvYvcYxzYCKVsg4CtRQ.jpg" mos="" align="middle" fullscreen="" width="466" height="495" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>I tested the <a href="https://www.tomsguide.com/audio/bluetooth-speakers/jbl-go-4-review" data-dimension112="fc69ced6-fbb7-435f-a069-e0bc95bddb70" data-action="Deal Block" data-label="JBL Go 4" data-dimension48="JBL Go 4" data-dimension25="$43">JBL Go 4</a> personally last year and was impressed by how well this speaker performed given its size, awarding a 4-star score. It offers decent sound quality, high levels of waterproofing, multi-point connectivity and is super portable. It's ideal for slipping into your bag to soundtrack spontaneous gatherings or for playing music while you study.<a class="view-deal button" href="https://www.amazon.com/JBL-Ultra-Portable-Waterproof-Dustproof-Built/dp/B0CX5C6WP3" target="_blank" rel="nofollow" data-dimension112="fc69ced6-fbb7-435f-a069-e0bc95bddb70" data-action="Deal Block" data-label="JBL Go 4" data-dimension48="JBL Go 4" data-dimension25="$43">View Deal</a></p></div><div class="product"><a data-dimension112="5814e0f5-a2a6-4ff1-8fb0-a650ca9d4907" data-action="Deal Block" data-label="GameSir G7 SE review" data-dimension48="GameSir G7 SE review" data-dimension25="$44" href="https://www.amazon.com/GameSir-Controller-Xbox-One-Windows-Joysticks/dp/B0D8KXMCTC" 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="h2vVtfz6VYN2AM5KDKhR5B" name="GameSir G7 SE.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/h2vVtfz6VYN2AM5KDKhR5B.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>I won't lie, this one took us a little by surprise in our <a href="https://www.tomsguide.com/gaming/gaming-peripherals/gamesir-g7-se-review" data-dimension112="5814e0f5-a2a6-4ff1-8fb0-a650ca9d4907" data-action="Deal Block" data-label="GameSir G7 SE review" data-dimension48="GameSir G7 SE review" data-dimension25="$44">GameSir G7 SE review</a>. We awarded this controller 4.5 stars and our Editor's Choice award. It's a fantastic pad for the money, with hall effect triggers <em><strong>and</strong></em> sticks (so no stick drift); excellent companion software and customization options; and a lightweight but sturdy build. "Better than an official gamepad" was our conclusion.<a class="view-deal button" href="https://www.amazon.com/GameSir-Controller-Xbox-One-Windows-Joysticks/dp/B0D8KXMCTC" target="_blank" rel="nofollow" data-dimension112="5814e0f5-a2a6-4ff1-8fb0-a650ca9d4907" data-action="Deal Block" data-label="GameSir G7 SE review" data-dimension48="GameSir G7 SE review" data-dimension25="$44">View Deal</a></p></div><div class="product"><a data-dimension112="ff63c8e5-7be4-48e7-96fc-ba6d5ac7e027" data-action="Deal Block" data-label="100W version, which is pricer (although currently $10 off)" data-dimension48="100W version, which is pricer (although currently $10 off)" data-dimension25="$25" href="https://www.amazon.com/Anker-Charger-Compact-Foldable-MacBook/dp/B09C5RG6KV" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:947px;"><p class="vanilla-image-block" style="padding-top:145.93%;"><img id="GfMyzCMwDRKggFZJ2WTecn" name="Anker Nano II" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GfMyzCMwDRKggFZJ2WTecn.jpg" mos="" align="middle" fullscreen="" width="947" height="1382" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Alright, full disclosure, my team hasn't reviewed this. However, I own one of these chargers and honestly, I don't go anywhere without it. It's so useful having three charging points, so I can charge all my devices simultaneously from one power outlet when on the go. This version is 65W: so good for phones, gadgets, tablets and small laptops like a Chromebook or MacBook Air. I own the <a href="https://www.amazon.com/Anker-Charger-Foldable-Compact-MacBook/dp/B0CZ6LXL8R" target="_blank" rel="nofollow" data-dimension112="ff63c8e5-7be4-48e7-96fc-ba6d5ac7e027" data-action="Deal Block" data-label="100W version, which is pricer (although currently $10 off)" data-dimension48="100W version, which is pricer (although currently $10 off)" data-dimension25="$25">100W version, which is pricer (although currently $10 off)</a>, but it can charge my full-size MacBook Pro.<a class="view-deal button" href="https://www.amazon.com/Anker-Charger-Compact-Foldable-MacBook/dp/B09C5RG6KV" target="_blank" rel="nofollow" data-dimension112="ff63c8e5-7be4-48e7-96fc-ba6d5ac7e027" data-action="Deal Block" data-label="100W version, which is pricer (although currently $10 off)" data-dimension48="100W version, which is pricer (although currently $10 off)" data-dimension25="$25">View Deal</a></p></div><div class="product"><a data-dimension112="d6c8718e-7a90-44c6-981d-97016d79b230" data-action="Deal Block" data-label="Gamakay TK75" data-dimension48="Gamakay TK75" data-dimension25="$34" href="https://www.amazon.com/GK-GAMAKAY-TK75-Bluetooth-Mechanical/dp/B0BRPVB42T" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1472px;"><p class="vanilla-image-block" style="padding-top:42.05%;"><img id="AVy2SNtgbcbqN52sDdisec" name="Gamakay TK75" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AVy2SNtgbcbqN52sDdisec.jpg" mos="" align="middle" fullscreen="" width="1472" height="619" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>We're big fans of the <a href="https://www.tomsguide.com/computing/peripherals/Gamakay-tk75-pro-review" data-dimension112="d6c8718e-7a90-44c6-981d-97016d79b230" data-action="Deal Block" data-label="Gamakay TK75" data-dimension48="Gamakay TK75" data-dimension25="$34">Gamakay TK75</a>, awarding 4 stars to the Pro model after our testing. This model is slightly cheaper, using Gateron switches rather than Gamakay's own brilliant switches. Absolutely nothing wrong with a Gateron switch, though, especially for $34. And besides, this deck is hot swappable, so you can change switches anyway! This board is perfect for typing and productivity — ideal for anyone heading back to school.<a class="view-deal button" href="https://www.amazon.com/GK-GAMAKAY-TK75-Bluetooth-Mechanical/dp/B0BRPVB42T" target="_blank" rel="nofollow" data-dimension112="d6c8718e-7a90-44c6-981d-97016d79b230" data-action="Deal Block" data-label="Gamakay TK75" data-dimension48="Gamakay TK75" data-dimension25="$34">View Deal</a></p></div><div class="product"><a data-dimension112="9254eff9-8550-4b55-845d-3753a49e404f" data-action="Deal Block" data-label="Lemokey X1" data-dimension48="Lemokey X1" data-dimension25="$22" href="https://www.amazon.com/LEMOKEY-Mechanical-Programmable-North-facing-Compatible/dp/B0CTJR6KJ8" 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="ASvVeo2dtAN2sByAigcZn9" name="LEMOKEY X1.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ASvVeo2dtAN2sByAigcZn9.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Another keyboard, and one of my team's favorite gaming decks. The <a href="https://www.tomsguide.com/computing/peripherals/lemokey-x1-review" data-dimension112="9254eff9-8550-4b55-845d-3753a49e404f" data-action="Deal Block" data-label="Lemokey X1" data-dimension48="Lemokey X1" data-dimension25="$22">Lemokey X1</a> is a budget gaming keyboard from Lemokey — that's Keychron's gaming-focused sub-brand. This budget board offers great gaming performance, is good to type on and is built very well given its minimal price tag. Gamers on a budget, look no further.<a class="view-deal button" href="https://www.amazon.com/LEMOKEY-Mechanical-Programmable-North-facing-Compatible/dp/B0CTJR6KJ8" target="_blank" rel="nofollow" data-dimension112="9254eff9-8550-4b55-845d-3753a49e404f" data-action="Deal Block" data-label="Lemokey X1" data-dimension48="Lemokey X1" data-dimension25="$22">View Deal</a></p></div><div class="product"><a data-dimension112="6950dae0-cce0-4dba-a54b-f2e7436478e8" data-action="Deal Block" data-label="Cosori Dual Basket" data-dimension48="Cosori Dual Basket" data-dimension25="$49" href="https://www.amazon.com/COSORI-2-1-Quart-Leftover-Nonstick-Dishwasher-Safe/dp/B0BDFRZX3F" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1094px;"><p class="vanilla-image-block" style="padding-top:137.11%;"><img id="3JMgDT9ngujroatmcVG9KU" name="Cosori.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3JMgDT9ngujroatmcVG9KU.jpg" mos="" align="middle" fullscreen="" width="1094" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Where would we be without our air fryers? I use mine day in, day out. We tested this Corsori Mini Air Fryer's bigger sibling, the <a href="https://www.tomsguide.com/home/air-fryers/cosori-dual-basket-air-fryer-review" data-dimension112="6950dae0-cce0-4dba-a54b-f2e7436478e8" data-action="Deal Block" data-label="Cosori Dual Basket" data-dimension48="Cosori Dual Basket" data-dimension25="$49">Cosori Dual Basket</a>, awarding 4 stars. This smaller version is great if you need to save space, maybe in a dorm or small/shared kitchen!<a class="view-deal button" href="https://www.amazon.com/COSORI-2-1-Quart-Leftover-Nonstick-Dishwasher-Safe/dp/B0BDFRZX3F" target="_blank" rel="nofollow" data-dimension112="6950dae0-cce0-4dba-a54b-f2e7436478e8" data-action="Deal Block" data-label="Cosori Dual Basket" data-dimension48="Cosori Dual Basket" data-dimension25="$49">View Deal</a></p></div><div class="product"><a data-dimension112="2d15e143-22fa-4c38-aa32-b55a70162bea" data-action="Deal Block" data-label="Amazfit Band 7" data-dimension48="Amazfit Band 7" data-dimension25="$37" href="https://www.amazon.com/Amazfit-Fitness-Tracker-Monitoring-Resistant/dp/B0C2717Y6G" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:126.36%;"><img id="FvVeEggCMcJRToQwRTkfca" name="Amazfit Band 7 Fitness & Activity Tracker" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FvVeEggCMcJRToQwRTkfca.jpg" mos="" align="middle" fullscreen="" width="679" height="858" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>We bestowed upon the <a href="https://www.tomsguide.com/wellness/fitness-trackers/amazfit-band-7-review" data-dimension112="2d15e143-22fa-4c38-aa32-b55a70162bea" data-action="Deal Block" data-label="Amazfit Band 7" data-dimension48="Amazfit Band 7" data-dimension25="$37">Amazfit Band 7</a> our 4.5-star Editor's Choice award when we tested it last year. We asked: "why spend $150 when the Amazfit Band 7 is right here?" A lovely display with great battery life; tons of fitness, health and sleep tracking features; plus a minimal, lightweight design... all for $37. What's not to love?<a class="view-deal button" href="https://www.amazon.com/Amazfit-Fitness-Tracker-Monitoring-Resistant/dp/B0C2717Y6G" target="_blank" rel="nofollow" data-dimension112="2d15e143-22fa-4c38-aa32-b55a70162bea" data-action="Deal Block" data-label="Amazfit Band 7" data-dimension48="Amazfit Band 7" data-dimension25="$37">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The future of wearable wellness tech: 5 wild predictions for 2035 according to experts and industry leaders ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/the-future-of-wearable-wellness-tech-5-wild-predictions-for-2035-according-to-experts-and-industry-leaders</link>
                                                                            <description>
                            <![CDATA[ Smartwatch batteries that never need a recharge, steering wheels that sense when you're stressed, and contact lenses that help you remember acquaintances' names — the not-too-distant future of wearable and embeddable technology is fascinating. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">HpaNQJePNMuWgn5G8PBN8N</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/kbpGMHhRHaGX3pSx2cnPW4-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 11 Aug 2025 12:00:00 +0000</pubDate>                                                                                                                                <updated>Mon, 11 Aug 2025 15:35:40 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&gt;&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/kbpGMHhRHaGX3pSx2cnPW4-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The World in 2035: Wearables]]></media:description>                                                            <media:text><![CDATA[The World in 2035: Wearables]]></media:text>
                                <media:title type="plain"><![CDATA[The World in 2035: Wearables]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/kbpGMHhRHaGX3pSx2cnPW4-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Explore The World in 2035</div><div class="fancy_box_body"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' ><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HAX5Jbb7yNHduz7GyBCGFb" name="World-in-2035-Boxout-Curve" caption="" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/HAX5Jbb7yNHduz7GyBCGFb.jpg" mos="" link="" align="" fullscreen="" width="" height="" attribution="" endorsement="" class="pinterest-pin-exclude"></p></div></div><figcaption itemprop="caption description" class=""><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p class="fancy-box__body-text"><strong></strong><a data-analytics-id="inline-link" href="https://www.tomsguide.com/ai/from-hyper-personal-assistants-to-mind-reading-tech-this-is-how-ai-will-transform-everything-by-2035" target="_blank"><strong>AI</strong></a><strong>  |  </strong><a data-analytics-id="inline-link" href="https://www.tomsguide.com/computing/smart-glasses/smart-glasses-revolution-inside-the-biggest-tech-trend-of-the-next-10-years" target="_blank"><strong>Smart Glasses</strong></a><strong>  |  </strong><a data-analytics-id="inline-link" href="https://www.tomsguide.com/tech/the-future-of-wearable-wellness-tech-5-wild-predictions-for-2035-according-to-experts-and-industry-leaders" target="_blank"><strong>Wearable Tech</strong></a><strong></strong><br><strong></strong><a data-analytics-id="inline-link" href="https://www.tomsguide.com/phones/what-will-our-phones-be-like-in-2035" target="_blank"><strong>Smartphones</strong></a><strong>  |  </strong><a data-analytics-id="inline-link" href="https://www.tomsguide.com/phones/iphones/meet-the-iphone-of-2035-its-the-mainframe-on-your-body" target="_blank"><strong>iPhones</strong></a><strong>  |  </strong><a data-analytics-id="inline-link" href="https://www.tomsguide.com/home/smart-home/heres-what-your-home-robot-will-actually-be-like-by-2035" target="_blank"><strong>Robots</strong></a><strong>  |  </strong><a data-analytics-id="inline-link" href="https://www.tomsguide.com/vehicle-tech/evs/flying-cars-heres-what-our-vehicles-will-do-by-2035" target="_blank"><strong>Cars</strong></a><strong>  |  </strong><a data-analytics-id="inline-link" href="https://www.tomsguide.com/tvs/your-tv-in-2035-will-be-wildly-different-and-its-not-what-you-think" target="_blank"><strong>TVs</strong></a></p></div></div><p>In 2035, your Apple Watch Series 36 could arrive with enough battery power to last the lifetime of the wearable; I’m talking years rather than days, i.e., no recharging required.</p><p>Don’t like wearing a watch? All those holistic sensors may come in an assortment of new forms, including flexible and near-invisible stick-on ‘smart patches’ that look kind of like a Band-Aid but stay put for weeks or even months.</p><p>As the speed in which health data can be processed and analysed continues to improve, while physical holistic sensors get tinier and tinier, keeping tabs on your vitals ten years from now will likely not be handled by one piece of dedicated wearable tech, but by an array of health-sensing devices you don’t even have to think about, like the steering wheel of your car if you commute by automobile, your contact lenses (even if you don’t require corrective vision), or even the waistband of your favorite underpants.</p><p>With so much information to decipher, AI will be the backbone that powers future wearable wellness technology. The promise of early detection of not just chronic disease but everyday illness will be another crucial selling point of tomorrow’s wearable devices, and the best devices will offer sensible, actionable steps to follow if something <em>does</em> come up.</p><p>To get a clearer picture of our possible wearable/embeddable future, I spoke with an array of experts and industry leaders in the field, including, Angela McIntyre, the director of the Stanford’s <a href="https://wearable.su.domains/" target="_blank">Wearable Electronics Initiative</a>; Amaury Kosman, the founder and CEO of the smart ring brand, <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-just-went-hands-on-with-the-new-circular-ring-2-and-its-the-most-impressive-smart-ring-at-ces-2025">Circular</a>; Jason Russell, the vice president of software at <a href="https://www.tomsguide.com/wellness/fitness-trackers/oura-ring-4-review">Oura Ring</a>; Antoine Joussain, a lead product manager at the consumer health technology brand, <a href="https://www.withings.com/us/en/" target="_blank">Withings</a>; Roman Axelrod and Dr Valentyn Volkov, cofounders of the smart contact lens startup <a href="https://www.xpanceo.com/">Xpanceo</a>; and Michael Hayes, the CEO of the smart contact startup <a href="https://inwithcorp.com/" target="_blank">InWith Corp</a>.</p><p>These conversations resulted in five major trends surrounding wearables and embeddables for the year 2035: More form factors, batteries that last the life of the device, predictive monitoring for both chronic diseases and everyday conditions, AI connecting the dots between wellness metrics and healthcare, and further incorporation of smart features that make life easier/less stressful. </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:3800px;"><p class="vanilla-image-block" style="padding-top:1.50%;"><img id="tbPV7PssS9CM7F6eRoMcB3" name="World-in-2035-horiz-line" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/tbPV7PssS9CM7F6eRoMcB3.png" mos="" align="middle" fullscreen="" width="3800" height="57" attribution="" endorsement="" class=""></p></div></div></figure><h2 id="the-end-of-rechargeable-batteries">The end of rechargeable batteries</h2><p>Battery life, or lack thereof, is one of the biggest factors holding back today’s wearables. Relatively reliable subscription-free wearables can be picked up for $100 or less (see the <a href="https://www.tomsguide.com/wellness/smartwatches/i-just-tested-the-amazfit-active-2-7-things-you-should-know-about-my-favorite-smartwatch-under-usd100">Amazfit Active 2</a>), but few last longer than a week on a single charge. Fortunately, in 2035, the need to plug in may be as antiquated as the away message.</p><p>“Our goal is for [the battery] to last the lifetime of the device,” says Antoine Joussain, a lead product manager at the French wellness tech brand, Withings. “So if a device is lasting for five years, we’d like [the battery] to last for five years too.”</p><p>This will come through both innovations in battery technology and reductions in power consumption.</p><p>Nearly everyone I spoke to for this article mentioned flexible or even stretchable batteries. Such technology would be crucial for developing a truly band-aid-style "smart patch," notes Angela McIntyre, the Executive Director of Stanford University’s Wearable Electronics Initiative (eWEAR). More on that below.</p><p>Some wearables brands like the smart ring manufacturer, Circular, already use bendable batteries in their product design. However, at the rate at which battery technology is currently developing, the batteries of 2035 will likely look vastly different than today’s.</p><p>“We already have flexible batteries in our rings, and we're trying to max them out. Over the past six years, I've seen three different technologies used in batteries, so different materials that can withstand more and more capacity,” says Amaury Kosman, the Founder and CEO of Circular.</p><div><blockquote><p>“By 2035, it’s plausible that wearables could integrate hybrid energy systems that passively recharge throughout the day, vastly extending runtime and reducing dependency on charging cycles.”</p><p>— Jason Russell, VP of Consumer Software, Oura</p></blockquote></div><p>Power management improvements won’t only come in the form of better batteries. “More efficient signal paths and the ability to disable unused sensors will also contribute meaningfully [to improved battery life]” says Jason Russell, Oura’s VP of consumer software, when asked what a theoretical Oura Ring 10 might look like.</p><p>Another hot topic: energy harvesting. While ten years is likely too soon for our smartwatches to be powered solely by body heat, McIntyre reports that researchers at Stanford and elsewhere are hard at work making the concept a reality. </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:2001px;"><p class="vanilla-image-block" style="padding-top:56.22%;"><img id="CJb2nqtAqiKCeMhQmoh223" name="wearables_LIST1" alt="The World in 2035: Wearables" src="https://cdn.mos.cms.futurecdn.net/CJb2nqtAqiKCeMhQmoh223.jpg" mos="" align="middle" fullscreen="" width="2001" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>“Motion of a person could be harvested as well,” says McIntyre.</p><p>Of course, self-charging wearables <em>do</em> exist in 2025. The <a href="https://www.tomsguide.com/Garmin-Instinct-3-review">Garmin Instinct 3 Solar</a>, which features a light-sensative cell behind the device’s screen, is a great example. However, by 2035, solar charging capabilities might be small enough to fit directly into a contact lens.</p><p>“We are developing light-harvesting features integrated into the lens surface, allowing ambient sunlight or indoor lighting to contribute to the power supply. While energy harvested this way is modest, the low power demands of contact lenses make even small boosts valuable," says Dr Valentyn Volkov, the cofounder of Xpanceo.</p><p>While the founder of the Circular Ring, Amaury Kosman, seemed skeptical of wearables' self-generating energy by 2035, Oura’s VP of Consumer Software, Jason Russell, sounds more optimistic.</p><p>“By 2035, it’s plausible that wearables could integrate hybrid energy systems that passively recharge throughout the day, vastly extending runtime and reducing dependency on charging cycles,” says Russell.</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:3800px;"><p class="vanilla-image-block" style="padding-top:1.50%;"><img id="tbPV7PssS9CM7F6eRoMcB3" name="World-in-2035-horiz-line" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/tbPV7PssS9CM7F6eRoMcB3.png" mos="" align="middle" fullscreen="" width="3800" height="57" attribution="" endorsement="" class=""></p></div></div></figure><h2 id="health-monitoring-sensors-everywhere">Health monitoring sensors … everywhere</h2><p>Don’t expect watches or rings to disappear anytime soon, because whether smart or not, this style of jewelry is likely here to stay. On the flip side, <em>do</em> expect the sensors you already see in smart rings and smartwatches to eventually appear in other wearable products, like earbuds, bracelets, stick-on patches, contact lenses and smart clothing.</p><p>“The idea is to make it disappear,” says Joussain when asked what the future of health-sensing technology looks like for Withings. That’s a pretty bold statement for a brand that makes a somewhat <a href="https://www.tomsguide.com/news/withings-scanwatch-2-unveiled-and-it-can-last-30-days-on-a-charge">chunky metal smartwatch</a> with considerable heft in 2025.</p><p>Ultimately, ten years from now, holistic sensors will be small enough to be installed just about anywhere, not just in wearables but also your computer mouse and even your car’s steering wheel. Essentially, wherever you’re most likely to interact with them.</p><div class="looped-video"><video class="lazyload-in-view lazyloading" data-src="https://cdn.mos.cms.futurecdn.net/yugkFuy5oosyTdGWfYV748/Adobe%20Express%20-%20shutterstock_1090838319%20(1).mp4" autoplay loop muted playsinline src="https://cdn.mos.cms.futurecdn.net/yugkFuy5oosyTdGWfYV748/Adobe%20Express%20-%20shutterstock_1090838319%20(1).mp4"></video></div><p>“All these new [health tracking] technologies will be implemented in everyday objects. So, you take your car every day, when you are holding the steering wheel, it will monitor your vitals,” predicts Joussain.</p><p>Ultimately, Joussain suspects that health sensors will be embedded directly into the user's body. However, he confesses that the concept is almost certainly more than a decade off. Stanford’s McIntyre agrees. Instead, she thinks stick-on smart patches packed with holistic sensors are more likely to make an impact in the next ten years.</p><p>“There are new sensors that are coming, and with your flexible, stretchable capabilities, they'll be even more that we can do from a sticky patch,” says McIntyre.</p><div><blockquote><p>“All these new [health tracking] technologies will be implemented in everyday objects. So, you take your car every day, when you are holding the steering wheel, it will monitor your vitals”</p><p>— Antoine Joussain, lead product manager, Withings</p></blockquote></div><p>Much to my surprise, Circular’s founder, Amaury Kosman, also thinks that smart patches could be the way of the future when it comes to at-home health monitoring.</p><p>“A patch, which is tiny and anybody can wear, I think that's the future of where we're heading. As time goes by, everything gets miniaturized, everything gets more precise, and it gets cheaper. So it's just a logical next step for me,” says Kosman when asked what future wearables will most likely look like.</p><p>Similarly, Oura's Jason Russell acknowledges that the future of wellness monitoring might go beyond the singular smart ring. "We foresee stretching the boundaries of biometric sensing via the ring while integrating complementary wearables that together enable an even more complete picture of your health," Russell says.</p><p>Outside of smart patches, what other new wearable health-monitoring tech can we expect to take off in the next decade? </p><p>“Smart contact lenses, being in direct contact with the eye's surface and tear film, function as a tiny biochemical laboratory on the eye. This close proximity enables continuous, noninvasive monitoring of a variety of health metrics,” says Dr. Volkov.</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:3800px;"><p class="vanilla-image-block" style="padding-top:1.50%;"><img id="tbPV7PssS9CM7F6eRoMcB3" name="World-in-2035-horiz-line" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/tbPV7PssS9CM7F6eRoMcB3.png" mos="" align="middle" fullscreen="" width="3800" height="57" attribution="" endorsement="" class=""></p></div></div></figure><h2 id="early-detection-and-treatment-for-chronic-diseases-and-everyday-ailments">Early detection and treatment for chronic diseases and everyday ailments</h2><p>The <a href="https://www.tomsguide.com/us/best-smartwatches,review-2156.html">best smartwatches</a> already alert users to potential signs of chronic health issues. Popular models like the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-10-review">Apple Watch 10</a> and <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-8-review">Samsung Galaxy Watch 8</a> monitor for signs of sleep apnea and heart abnormalities, like AFib. The <a href="https://www.tomsguide.com/wellness/smartwatches/google-pixel-watch-3-review">Google Pixel Watch 3</a> can even trigger an alert and send for help if a <a href="https://www.tomsguide.com/wellness/smartwatches/googles-new-life-saving-tool-just-launched-in-the-u-s-heres-how-to-use-it-on-your-pixel-watch">loss of pulse is detected</a>. </p><p>However, these tools are just scratching the surface. In ten years, your smart wearable may be able to screen for a whole range of chronic conditions, like diabetes, cancer or heart disease. These devices may also be able to give you a 72-hour heads-up to an upcoming cold, or alert you to heightened biomarkers that could indicate elevated stress, with actionable advice to return to your baseline.</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:3840px;"><p class="vanilla-image-block" style="padding-top:55.68%;"><img id="5P4zGSCq4fySoSt6fdpdGk" name="shutterstock_2566860029" alt="World in 2035: Wearable health tech" src="https://cdn.mos.cms.futurecdn.net/5P4zGSCq4fySoSt6fdpdGk.jpg" mos="" align="middle" fullscreen="" width="3840" height="2138" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>“As sensors become more advanced and miniaturized, the depth and granularity of data will also increase significantly. But the biggest shift will be in how insights are delivered: instead of just showing you the data, future insights could anticipate changes in your health, offer personalized, real-time guidance, and adapt to your unique physiology and goals—making the experience more predictive, proactive, and deeply personalized than ever before,” says Oura’s Jason Russell.</p><p>Ultimately, the future of disease detection may rely less on developing new sensor technology and more on making the most of the data already coming off the sensors we currently have. Enter, the promise of AI.</p><p>“AI is getting a lot better, being able to discern what's a ‘real’ signal out of very noisy data, and then being able to make insights that are more valid for us from that data,” says McIntyre.</p><p>The use of artificial intelligence to analyze health data, effectively replacing manually written code, will exponentially increase the ability for software to sniff out health trends and make personalized recommendations, notes McIntyre.</p><div><blockquote><p>“As sensors become more advanced and miniaturized, the depth and granularity of data will also increase significantly. But the biggest shift will be in how insights are delivered: instead of just showing you the data, future insights could anticipate changes in your health, offer personalized, real-time guidance, and adapt to your unique physiology and goals—making the experience more predictive, proactive, and deeply personalized than ever before.”</p><p>— Jason Russell, VP of Consumer Software, Oura</p></blockquote></div><p>Tomorrow’s wearables might even analyse your blood, urine, or sweat, as all three contain a multitude of easily trackable biomarkers that could indicate whether you’re dehydrated, stressed, or a whole host of other conditions. Monitoring stress, in particular, is a focus of researchers.</p><p>“Cortisol is another ingredient that people are trying to sense with sensors on wearables.  I should say that people have cortisol and sometimes feel very pumped and excited, and other people might have a lot of cortisol and feel very afraid. So it really depends on circumstances and on the individual what putting out cortisol means, ” says McIntyre.</p><p>Future wearables may additionally be able to take the guesswork out of taking medication, says Michael Hayes, the CEO of the smart contact startup InWith. </p><p>“There's a plethora of health applications with smart contacts. From early warning of disease to therapeutic delivery of drugs to the eyes to prevent certain conditions, to bringing new focus capabilities. The tear fluid is a rich medium for biomarkers,” says Hayes. yes.</p><p>Smart contact lenses could even one day replace today’s blood-based health monitoring methods.</p><p>“Glucose levels in tears can be tracked to assist people with diabetes in managing their condition without the need for finger-prick blood tests. Similarly, fluctuations in hormone or vitamin concentrations in the tear film can offer valuable insights into a person’s metabolic or nutritional status,” says Dr. Volkov. </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:3800px;"><p class="vanilla-image-block" style="padding-top:1.50%;"><img id="tbPV7PssS9CM7F6eRoMcB3" name="World-in-2035-horiz-line" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/tbPV7PssS9CM7F6eRoMcB3.png" mos="" align="middle" fullscreen="" width="3800" height="57" attribution="" endorsement="" class=""></p></div></div></figure><h2 id="wearables-that-talk-to-your-doctor-with-some-help-from-ai">Wearables that talk to your doctor (with some help from AI)</h2><p>The concept of a faceless, nameless artificial intelligence interface spitting out wellness advice based on the augmentation of my sleep, workout, dietary, etc., data is beyond unsettling to me. However, everyone I spoke to on the subject assured me that the aggressive AI analysis of my holistic metrics is <em>actually</em> a positive thing.</p><p>Doctors are busy. Wearable data is useful, but in 2025, there’s no conduit to make that data easily accessible to the medical field. And even if there was, the amount of data would likely be entirely overwhelming.</p><div class="looped-video"><video class="lazyload-in-view lazyloading" data-src="https://cdn.mos.cms.futurecdn.net/DJ3Z8XMKMjFkTCC99CTVkG/Adobe%20Express%20-%20shutterstock_1091554281.mp4" autoplay loop muted playsinline src="https://cdn.mos.cms.futurecdn.net/DJ3Z8XMKMjFkTCC99CTVkG/Adobe%20Express%20-%20shutterstock_1091554281.mp4"></video></div><p>This is where AI can help. With more sensors and more users, it will become better at finding patterns that may warrant alerting your doctor or wellness team. In a time-sensitive health emergency, AI could potentially trigger an alert to your medical provider on its own, similar to Google's <a href="https://www.tomsguide.com/wellness/smartwatches/google-exclusive-how-the-pixel-watch-3-got-a-life-saving-feature-the-apple-watch-cant-match">Loss of Pulse Detection</a> or crash/fall detection.</p><p>Representatives from Oura, Circular, and Withings <em>all</em> emphasised the importance of wearable data being more accessible to a user’s healthcare team in the future, with AI playing a crucial role as the middleman.</p><p>“In the future, [wearable tech] could support clinical applications like remote patient monitoring, early detection of chronic conditions, or continuous tracking of biomarkers relevant to metabolic, cardiovascular, or hormonal health. They may enable secure sharing of health data with care teams, integrate with electronic health records, or even assist with medication adherence through real-time prompts,” predicts Russell.</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:3800px;"><p class="vanilla-image-block" style="padding-top:1.50%;"><img id="tbPV7PssS9CM7F6eRoMcB3" name="World-in-2035-horiz-line" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/tbPV7PssS9CM7F6eRoMcB3.png" mos="" align="middle" fullscreen="" width="3800" height="57" attribution="" endorsement="" class=""></p></div></div></figure><h2 id="but-also-seamless-smart-features-that-make-life-easier">But also, seamless smart features that make life easier </h2><p>If you’re like me, not so hot with remembering names, I’ve got great news. Tomorrow’s wearable tech may make awkward social situations a thing of the past.</p><p>“The smart contact lens will act as the ultimate personal assistant embedded directly into your vision and capable of analyzing complex social environments in real-time,” says Roman Axelrod, the (other) co-founder of Xpanceo.</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:1001px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="eo9SeWeF6wjG3BwGGnhKKW" name="wearables_3" alt="World in 2035: Wearables" src="https://cdn.mos.cms.futurecdn.net/eo9SeWeF6wjG3BwGGnhKKW.jpg" mos="" align="middle" fullscreen="" width="1001" height="563" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>“Yes, at a party, the lenses could scan the room and instantly recognize faces, drawing on your personal contacts and social databases to remind you of people’s names, how you met, and important details about them before you even approach,” says Alexlrod, though he acknowledges that privacy concerns and regulations for such features are still far from being sorted out.</p><div><blockquote><p>“The smart contact lens will act as the ultimate personal assistant embedded directly into your vision and capable of analyzing complex social environments in real-time.”</p><p>— Roman Axelrod, Xpanceo co-founder</p></blockquote></div><p>You can also expect these next-gen devices to potentially improve our human capabilities, Inspector Gadget-style. For example, InWith CEO Michael Hayes predicts that smart contacts in 2035 will not only offer night vision but potentially even zoom capabilities.</p><p>“Seeing better in the dark is an advanced function, but we’ve already made significant progress. We can engineer lenses that enhance low-light vision. Nanoparticles alter the way the lens interacts with incoming light, effectively expanding what the eye can perceive in dim environments,” says Dr. Volkov.</p><p>“The idea of zooming in on distant objects is perhaps the most futuristic, but not impossible. This feature would require smart lenses with materials whose refractive properties can be dynamically controlled. Using electrical signals, the lens could adjust how it focuses light, effectively creating a variable ‘optical zoom’ function.”</p><p>“Although this technology is still in the research phase,” Volkov says, he also suspects that rapid progress in the field should mean working prototypes well before 2035. </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:3800px;"><p class="vanilla-image-block" style="padding-top:1.50%;"><img id="tbPV7PssS9CM7F6eRoMcB3" name="World-in-2035-horiz-line" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/tbPV7PssS9CM7F6eRoMcB3.png" mos="" align="middle" fullscreen="" width="3800" height="57" attribution="" endorsement="" class=""></p></div></div></figure>        <div class="featured_product_block featured_block_horizontal" data-id="da55a480-ed60-4498-9a8a-df156466fe51">            <div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:61.35%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/wHkEgfvEsaWMP4HT8QA5eG.jpg" alt="The World in 2035"></p></div>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title"></div>                                    </div>                <div class="subtitle__description">                                                            <p><p><strong>• </strong><a href="https://www.tomsguide.com/ai/from-hyper-personal-assistants-to-mind-reading-tech-this-is-how-ai-will-transform-everything-by-2035" target="_blank"><strong>Artificial Intelligence</strong></a><strong> </strong><br><strong>• </strong><a href="https://www.tomsguide.com/computing/smart-glasses/smart-glasses-revolution-inside-the-biggest-tech-trend-of-the-next-10-years" target="_blank"><strong>Smart Glasses</strong></a><strong></strong><br><strong>• </strong><a href="https://www.tomsguide.com/tech/the-future-of-wearable-wellness-tech-5-wild-predictions-for-2035-according-to-experts-and-industry-leaders" target="_blank"><strong>Wearable Tech</strong></a><strong></strong><br><strong>• </strong><a href="https://www.tomsguide.com/phones/what-will-our-phones-be-like-in-2035" target="_blank"><strong>Smartphones</strong></a><strong> </strong><br><strong>• </strong><a href="https://www.tomsguide.com/phones/iphones/meet-the-iphone-of-2035-its-the-mainframe-on-your-body" target="_blank"><strong>iPhones</strong></a><strong></strong><br><strong>• </strong><a href="https://www.tomsguide.com/home/smart-home/heres-what-your-home-robot-will-actually-be-like-by-2035"><strong>Robots</strong></a><strong></strong><br><strong>• </strong><a href="https://www.tomsguide.com/vehicle-tech/evs/flying-cars-heres-what-our-vehicles-will-do-by-2035" target="_blank"><strong>Cars</strong></a><strong></strong><br><strong>• </strong><a href="https://www.tomsguide.com/tvs/your-tv-in-2035-will-be-wildly-different-and-its-not-what-you-think" target="_blank"><strong>TVs</strong></a></p></p>                </div>                            </div>        </div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The World in 2035: A Sneak Peek at the Gadgets of Tomorrow  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/the-world-in-2035</link>
                                                                            <description>
                            <![CDATA[ From smart patches that can read your vitals to AR glasses that could replace your phone, Tom’s Guide takes a deep dive into what’s next for tech. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">5ZS2PD9vQXC4d6wfYwyzU6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/pER84tQnpPPUUrjgnFBojd-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 11 Aug 2025 12:00:00 +0000</pubDate>                                                                                                                                <updated>Mon, 11 Aug 2025 16:05:45 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Mark has a passion for covering all things mobile, having reviewed dozens of smartphones and other gadgets. He enjoys testing the top mobile devices and putting them up against each other in our in-depth face-offs. He also works hand in hand with our editors and testing team to continually improve how we evaluate products.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Having led Tom&#039;s Guide since 2013, Mark has focused on growing the core tech coverage of the site while also expanding into new areas, such as entertainment, fitness and home, recruiting talented writers and editors to help our readers figure out what to buy and how to get the most out of the products and services they use every day.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Mark has spoken at key industry events and appears regularly on TV to discuss the latest trends, including &lt;a href=&quot;https://cheddar.com/media/pixel-watch-gets-a-release-date-at-google-i-o-2022&quot;&gt;Cheddar&lt;/a&gt;, Fox 5, &lt;a href=&quot;https://www.foxbusiness.com/technology/apple-march-event-5g-iphone&quot;&gt;Fox Business&lt;/a&gt; and other outlets. Mark was previously editor in chief of Laptop Mag, and his work has appeared in Wired, Popular Science and Inc. Follow him on Twitter at @mspoonauer.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/pER84tQnpPPUUrjgnFBojd-1280-80.jpg">
                                                            <media:credit><![CDATA[ ]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The World in 2035]]></media:description>                                                            <media:text><![CDATA[The World in 2035]]></media:text>
                                <media:title type="plain"><![CDATA[The World in 2035]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/pER84tQnpPPUUrjgnFBojd-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><em>You’re on your way to work in the year 2035. Despite the heavy traffic, you’re relaxing in the comfort of your EV while it drives itself through the city.</em></p><p><em>Last night you fell asleep while watching a movie — but your bedroom TV knew exactly when you stopped paying attention. You easily pick back up where you left off, streaming the last ten minutes on the car’s OLED display that curves around the interior.</em></p><p><em>After first suggesting some new restaurants for lunch, the personal AI on your wrist anticipates the end of the movie and asks if you’d like to organize a multiplayer racing game with your best friend. A few minutes later you get a notification on your smartglasses display — your friend has logged on and is ready to play.</em></p><p><em>Unfolding your phone into a large tablet, you jump right into the game on a low-latency 6G network. A widget in the corner of your glasses allows you to track subtle changes in your heart rate as you battle to overtake your friend for first place.</em></p><div  class="fancy-box"><div class="fancy_box-title">Explore The World in 2035</div><div class="fancy_box_body"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' ><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gx3tawnstwuYpuchhrH25i" name="World-in-2035_Logo_v16-9-300-2" caption="" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/gx3tawnstwuYpuchhrH25i.png" mos="" link="" align="" fullscreen="" width="" height="" attribution="" endorsement="" class="pinterest-pin-exclude"></p></div></div></figure><p class="fancy-box__body-text"><strong></strong><a data-analytics-id="inline-link" href="https://www.tomsguide.com/ai/from-hyper-personal-assistants-to-mind-reading-tech-this-is-how-ai-will-transform-everything-by-2035" target="_blank"><strong>AI</strong></a><strong>  |  </strong><a data-analytics-id="inline-link" href="https://www.tomsguide.com/computing/smart-glasses/smart-glasses-revolution-inside-the-biggest-tech-trend-of-the-next-10-years" target="_blank"><strong>Smart Glasses</strong></a><strong>  |  </strong><a data-analytics-id="inline-link" href="https://www.tomsguide.com/tech/the-future-of-wearable-wellness-tech-5-wild-predictions-for-2035-according-to-experts-and-industry-leaders" target="_blank"><strong>Wearable Tech</strong></a><strong></strong><br><strong></strong><a data-analytics-id="inline-link" href="https://www.tomsguide.com/phones/what-will-our-phones-be-like-in-2035" target="_blank"><strong>Smartphones</strong></a><strong>  |  </strong><a data-analytics-id="inline-link" href="https://www.tomsguide.com/phones/iphones/meet-the-iphone-of-2035-its-the-mainframe-on-your-body" target="_blank"><strong>iPhones</strong></a><strong>  |  </strong><a data-analytics-id="inline-link" href="https://www.tomsguide.com/home/smart-home/heres-what-your-home-robot-will-actually-be-like-by-2035" target="_blank"><strong>Robots</strong></a><strong>  |  </strong><a data-analytics-id="inline-link" href="https://www.tomsguide.com/vehicle-tech/evs/flying-cars-heres-what-our-vehicles-will-do-by-2035" target="_blank"><strong>Cars</strong></a><strong>  |  </strong><a data-analytics-id="inline-link" href="https://www.tomsguide.com/tvs/your-tv-in-2035-will-be-wildly-different-and-its-not-what-you-think" target="_blank"><strong>TVs</strong></a></p></div></div><p>This may read like science fiction, but it’s closer than you think.</p><p>To envision where our relationship with technology is heading, Tom’s Guide talked to some of the leading experts in artificial intelligence, autonomous vehicles, wearable devices and robotics — including companies such as Samsung, Oura, Qualcomm, General Motors, LG and Amazon.</p><p>A decade from now, how will we interact with our cars, phones, TVs and wearables? How will our lives be reimagined by artificial intelligence and robots? </p><p>Welcome to the World in 2035.</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:4000px;"><p class="vanilla-image-block" style="padding-top:2.40%;"><img id="yZwKgGuAvg2uEXodGxvZTY" name="World-in-2035-divider3" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/yZwKgGuAvg2uEXodGxvZTY.png" mos="" align="middle" fullscreen="" width="4000" height="96" attribution="" endorsement="" class=""></p></div></div></figure><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:8.75%;"><img id="jyGAqukhkmi69PXEY35CUC" name="World-in-2035-horiz-3-wearables" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/jyGAqukhkmi69PXEY35CUC.png" mos="" align="middle" fullscreen="" width="2000" height="175" attribution="" endorsement="" class=""></p></div></div></figure>        <div class="featured_product_block featured_block_horizontal" data-id="5b226f47-00d6-4eb1-9f3a-23710ed13c04">            <div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:56.22%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/CJb2nqtAqiKCeMhQmoh223.jpg" alt="The World in 2035: Wearables"></p></div>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title"></div>                                    </div>                <div class="subtitle__description">                                                            <p><p><a href="https://www.tomsguide.com/tech/the-future-of-wearable-wellness-tech-5-wild-predictions-for-2035-according-to-experts-and-industry-leaders" target="_blank"><strong>The future of wearable wellness tech: 5 wild predictions for 2035 according to experts and industry leaders</strong></a></p><p>The Apple Watch that arrives in 2035 could have enough battery power to last forever. We can also see stick-on ‘smart patches’ that continuously monitor your vitals while looking out for troubling trends. And next-gen ‘smart contacts’ could help you see in the dark or even put names to faces.</p></p>                </div>                            </div>        </div><a href="https://www.tomsguide.com/tech/the-future-of-wearable-wellness-tech-5-wild-predictions-for-2035-according-to-experts-and-industry-leaders"><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2996px;"><p class="vanilla-image-block" style="padding-top:1.90%;"><img id="SuEtwjv3ZGHFo34pnjKK6P" name="World-in-2035-horiz-READ MORE" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/SuEtwjv3ZGHFo34pnjKK6P.png" mos="" align="middle" fullscreen="" width="2996" height="57" attribution="" endorsement="" class=""></p></div></div></figure></a><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:2.40%;"><img id="yZwKgGuAvg2uEXodGxvZTY" name="World-in-2035-divider3" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/yZwKgGuAvg2uEXodGxvZTY.png" mos="" align="middle" fullscreen="" width="4000" height="96" attribution="" endorsement="" class=""></p></div></div></figure><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:8.75%;"><img id="8TPdgu8dK2Xr2E7kk9prRB" name="World-in-2035-horiz-8-robots" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/8TPdgu8dK2Xr2E7kk9prRB.png" mos="" align="middle" fullscreen="" width="2000" height="175" attribution="" endorsement="" class=""></p></div></div></figure>        <div class="featured_product_block featured_block_horizontal" data-id="9d52391e-931c-4b22-88c0-3aaf26698439">            <div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:56.22%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/rcn4EiyxnfJPCz9oRAfCZi.jpg" alt="Futuristic TV concept"></p></div>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title"></div>                                    </div>                <div class="subtitle__description">                                                            <p><p><strong></strong><a href="https://www.tomsguide.com/tvs/your-tv-in-2035-will-be-wildly-different-and-its-not-what-you-think" target="_blank"><strong>Your TV in 2035 will be wildly different — and it’s not what you think</strong></a></p><p>The future of TVs looks pretty tantalizing, including MicroLED finally going mainstream, next-generation “dream OLED” panels and a leap in AI assistants that know what you want to watch before you do.</p></p>                </div>                            </div>        </div><a href="https://www.tomsguide.com/tvs/your-tv-in-2035-will-be-wildly-different-and-its-not-what-you-think"><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2996px;"><p class="vanilla-image-block" style="padding-top:1.90%;"><img id="SuEtwjv3ZGHFo34pnjKK6P" name="World-in-2035-horiz-READ MORE" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/SuEtwjv3ZGHFo34pnjKK6P.png" mos="" align="middle" fullscreen="" width="2996" height="57" attribution="" endorsement="" class=""></p></div></div></figure></a><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:2.40%;"><img id="yZwKgGuAvg2uEXodGxvZTY" name="World-in-2035-divider3" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/yZwKgGuAvg2uEXodGxvZTY.png" mos="" align="middle" fullscreen="" width="4000" height="96" attribution="" endorsement="" class=""></p></div></div></figure><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:8.75%;"><img id="Tt4TWTQBRZPCMCRhY5hkRB" name="World-in-2035-horiz-7-cars" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/Tt4TWTQBRZPCMCRhY5hkRB.png" mos="" align="middle" fullscreen="" width="2000" height="175" attribution="" endorsement="" class=""></p></div></div></figure>        <div class="featured_product_block featured_block_horizontal" data-id="7b0b8ef9-cd3f-45a2-9521-5ce076b522fd">            <div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:56.26%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/7zJLVwZMBpuQDgfGXKoCtD.jpg" alt="World in 2035"></p></div>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title"></div>                                    </div>                <div class="subtitle__description">                                                            <p><p><strong></strong><a href="https://www.tomsguide.com/vehicle-tech/evs/flying-cars-heres-what-our-vehicles-will-do-by-2035" target="_blank"><strong>I dreamed of flying cars, but the automotive reality of 2035 is even more revolutionary</strong></a></p><p>Your car will feel very different from today, thanks in part to advances in autonomous driving, more efficient battery technologies, and how AI will be a main driving force behind everything by 2035 — including aerial vehicles.</p></p>                </div>                            </div>        </div><a href="https://www.tomsguide.com/vehicle-tech/evs/flying-cars-heres-what-our-vehicles-will-do-by-2035"><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2996px;"><p class="vanilla-image-block" style="padding-top:1.90%;"><img id="SuEtwjv3ZGHFo34pnjKK6P" name="World-in-2035-horiz-READ MORE" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/SuEtwjv3ZGHFo34pnjKK6P.png" mos="" align="middle" fullscreen="" width="2996" height="57" attribution="" endorsement="" class=""></p></div></div></figure></a><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:2.40%;"><img id="yZwKgGuAvg2uEXodGxvZTY" name="World-in-2035-divider3" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/yZwKgGuAvg2uEXodGxvZTY.png" mos="" align="middle" fullscreen="" width="4000" height="96" attribution="" endorsement="" class=""></p></div></div></figure><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:8.75%;"><img id="gppHQXuaPFyNUvrEXBvFUC" name="World-in-2035-horiz-6-robots" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/gppHQXuaPFyNUvrEXBvFUC.png" mos="" align="middle" fullscreen="" width="2000" height="175" attribution="" endorsement="" class=""></p></div></div></figure>        <div class="featured_product_block featured_block_horizontal" data-id="0a587642-4f00-4c5a-b825-b440eb282b19">            <div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:56.22%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/YKM5dd9BTgtYMsrHN6WZgV.jpg" alt="The World in 2035: Robots"></p></div>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title"></div>                                    </div>                <div class="subtitle__description">                                                            <p><p><a href="https://www.tomsguide.com/home/smart-home/heres-what-your-home-robot-will-actually-be-like-by-2035" target="_blank"><strong>Forget "I, Robot" — here's what your home robot will actually be like by 2035</strong></a></p><p>From “The Jetsons” to “I, Robot,” the future has been imagined with all of us living with humanoid robots in our home. But how close are we to having personal C-3POs? Here’s what the next ten years will really bring us. </p></p>                </div>                            </div>        </div><a href="https://www.tomsguide.com/home/smart-home/heres-what-your-home-robot-will-actually-be-like-by-2035"><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2996px;"><p class="vanilla-image-block" style="padding-top:1.90%;"><img id="SuEtwjv3ZGHFo34pnjKK6P" name="World-in-2035-horiz-READ MORE" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/SuEtwjv3ZGHFo34pnjKK6P.png" mos="" align="middle" fullscreen="" width="2996" height="57" attribution="" endorsement="" class=""></p></div></div></figure></a><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:2.40%;"><img id="yZwKgGuAvg2uEXodGxvZTY" name="World-in-2035-divider3" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/yZwKgGuAvg2uEXodGxvZTY.png" mos="" align="middle" fullscreen="" width="4000" height="96" attribution="" endorsement="" class=""></p></div></div></figure><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:8.75%;"><img id="8gykKWNwFt8xL4RzgefGjE" name="World-in-2035-horiz-1-AI" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/8gykKWNwFt8xL4RzgefGjE.png" mos="" align="middle" fullscreen="" width="2000" height="175" attribution="" endorsement="" class=""></p></div></div></figure>        <div class="featured_product_block featured_block_horizontal" data-id="dc6b3d2b-e789-4ce8-82fd-055895855818">            <div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:56.25%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/mtoDfKpiiwbzam7hDwTXtU.jpg" alt="Artificial intelligence "AI" and brain glowing next to a smartphone screen"></p></div>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title"></div>                                    </div>                <div class="subtitle__description">                                                            <p><p><strong></strong><a href="https://www.tomsguide.com/ai/from-hyper-personal-assistants-to-mind-reading-tech-this-is-how-ai-will-transform-everything-by-2035"><strong>From hyper-personal assistants to mind-reading tech — this is how AI will transform everything by 2035</strong></a></p><p>By 2035, AI will go way beyond a mere assistant. It will anticipate your needs, sense your mood and reshape your home and work life. The question won’t be what AI can do, but <em>what we’ll let it do</em>.</p></p>                </div>                            </div>        </div><a href="https://www.tomsguide.com/ai/from-hyper-personal-assistants-to-mind-reading-tech-this-is-how-ai-will-transform-everything-by-2035"><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2996px;"><p class="vanilla-image-block" style="padding-top:1.90%;"><img id="SuEtwjv3ZGHFo34pnjKK6P" name="World-in-2035-horiz-READ MORE" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/SuEtwjv3ZGHFo34pnjKK6P.png" mos="" align="middle" fullscreen="" width="2996" height="57" attribution="" endorsement="" class=""></p></div></div></figure></a><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:2.40%;"><img id="yZwKgGuAvg2uEXodGxvZTY" name="World-in-2035-divider3" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/yZwKgGuAvg2uEXodGxvZTY.png" mos="" align="middle" fullscreen="" width="4000" height="96" attribution="" endorsement="" class=""></p></div></div></figure><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:8.75%;"><img id="5p7ui332hUfCHEFRjdX37P" name="World-in-2035-horiz-2-Smartglasses" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/5p7ui332hUfCHEFRjdX37P.png" mos="" align="middle" fullscreen="" width="2000" height="175" attribution="" endorsement="" class=""></p></div></div></figure>        <div class="featured_product_block featured_block_horizontal" data-id="056a2aac-ee18-4771-bb69-ee6255174863">            <div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:56.22%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/GJcejDjjQqtV2afx94DKok.jpg" alt="The World in 2035: Smart Glasses"></p></div>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title"></div>                                    </div>                <div class="subtitle__description">                                                            <p><p><strong></strong><a href="https://www.tomsguide.com/computing/smart-glasses/smart-glasses-revolution-inside-the-biggest-tech-trend-of-the-next-10-years" target="_blank"><strong>Smart Glasses Revolution: Inside the biggest tech trend of the next 10 years</strong></a></p><p>Right now, smart glasses either give you the best of AR or the best of AI. By 2035 we’ll get the best of both worlds — turning these into the all-in-one device that could replace your smartphone, and going beyond with sensors that can track your physical and mental health.</p></p>                </div>                            </div>        </div><a href="https://www.tomsguide.com/computing/smart-glasses/smart-glasses-revolution-inside-the-biggest-tech-trend-of-the-next-10-years"><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2996px;"><p class="vanilla-image-block" style="padding-top:1.90%;"><img id="SuEtwjv3ZGHFo34pnjKK6P" name="World-in-2035-horiz-READ MORE" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/SuEtwjv3ZGHFo34pnjKK6P.png" mos="" align="middle" fullscreen="" width="2996" height="57" attribution="" endorsement="" class=""></p></div></div></figure></a><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:2.40%;"><img id="yZwKgGuAvg2uEXodGxvZTY" name="World-in-2035-divider3" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/yZwKgGuAvg2uEXodGxvZTY.png" mos="" align="middle" fullscreen="" width="4000" height="96" attribution="" endorsement="" class=""></p></div></div></figure><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:8.75%;"><img id="p4U8BDjHtfobk4wkxJihRB" name="World-in-2035-horiz-4-phones" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/p4U8BDjHtfobk4wkxJihRB.png" mos="" align="middle" fullscreen="" width="2000" height="175" attribution="" endorsement="" class=""></p></div></div></figure>        <div class="featured_product_block featured_block_horizontal" data-id="d50cf816-a08e-4d61-8aa3-c5c33dcd97e7">            <div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:56.22%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/qYVgeKnxkLakkqqdmiGCoW.jpg" alt="AI agent on a futuristic smartphone"></p></div>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title"></div>                                    </div>                <div class="subtitle__description">                                                            <p><p><strong></strong><a href="https://www.tomsguide.com/phones/what-will-our-phones-be-like-in-2035" target="_blank"><strong>What will our phones be like in 2035? We asked Samsung, Motorola, OnePlus and more about your future</strong></a></p><p>Multi-fold designs, 6G and a quantum leap in AI powers. Despite talk of smartphones making way for devices like smart glasses, experts say the phone is here to stay. Here’s how your smartphone could evolve over the next decade.</p></p>                </div>                            </div>        </div><a href="https://www.tomsguide.com/phones/what-will-our-phones-be-like-in-2035"><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2996px;"><p class="vanilla-image-block" style="padding-top:1.90%;"><img id="SuEtwjv3ZGHFo34pnjKK6P" name="World-in-2035-horiz-READ MORE" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/SuEtwjv3ZGHFo34pnjKK6P.png" mos="" align="middle" fullscreen="" width="2996" height="57" attribution="" endorsement="" class=""></p></div></div></figure></a><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:2.40%;"><img id="yZwKgGuAvg2uEXodGxvZTY" name="World-in-2035-divider3" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/yZwKgGuAvg2uEXodGxvZTY.png" mos="" align="middle" fullscreen="" width="4000" height="96" attribution="" endorsement="" class=""></p></div></div></figure><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:8.75%;"><img id="uWHZJfNoBKJ3uZEKPcKJUC" name="World-in-2035-horiz-5-iphones" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/uWHZJfNoBKJ3uZEKPcKJUC.png" mos="" align="middle" fullscreen="" width="2000" height="175" attribution="" endorsement="" class=""></p></div></div></figure>        <div class="featured_product_block featured_block_horizontal" data-id="80b38d60-f3f9-4331-b238-8b4b13f297ef">            <div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:56.28%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/YkCnXfhbsXCdoVZvTNNpsX.jpg" alt="World in 2035: iPhones of the Future"></p></div>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                                                <div class="featured__title"></div>                                    </div>                <div class="subtitle__description">                                                            <p><p><strong></strong><a href="https://www.tomsguide.com/phones/iphones/meet-the-iphone-of-2035-its-the-mainframe-on-your-body" target="_blank"><strong>Meet the iPhone of 2035 — it’s the ‘mainframe on your body'</strong></a></p><p>What is Apple planning for the iPhone over the next decade? We talked to some leading Apple experts on what they think the iPhone of 2035 might have to offer.</p></p>                </div>                            </div>        </div><a href="https://www.tomsguide.com/phones/iphones/meet-the-iphone-of-2035-its-the-mainframe-on-your-body"><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2996px;"><p class="vanilla-image-block" style="padding-top:1.90%;"><img id="SuEtwjv3ZGHFo34pnjKK6P" name="World-in-2035-horiz-READ MORE" alt="The World in 2035" src="https://cdn.mos.cms.futurecdn.net/SuEtwjv3ZGHFo34pnjKK6P.png" mos="" align="middle" fullscreen="" width="2996" height="57" attribution="" endorsement="" class=""></p></div></div></figure></a>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Tom's Guide Awards 2025: All the big winners across 12 categories from phones to homes ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/toms-guide-awards-2025</link>
                                                                            <description>
                            <![CDATA[ These are the Tom's Guide Awards 2025 winners across categories like TVs, AI, Photography, Automotive, Sleep, Streaming and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">qmER7VHSDkJzLXJd8EbkPF</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/v7hNHTtHfGpq44z9Aq6yE7-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 03 Aug 2025 06:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/v7hNHTtHfGpq44z9Aq6yE7-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Tom&#039;s Guide Awards 2025 badge on a multicolored background]]></media:description>                                                            <media:text><![CDATA[The Tom&#039;s Guide Awards 2025 badge on a multicolored background]]></media:text>
                                <media:title type="plain"><![CDATA[The Tom&#039;s Guide Awards 2025 badge on a multicolored background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/v7hNHTtHfGpq44z9Aq6yE7-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Please join us in giving a round of applause to all of the winners in the Tom’s Guide Awards 2025.</p><p>Now in its sixth year, the Tom’s Guide Awards celebrates our favorite products, devices and services across all of the different categories we cover across our entire site including two new ones for this year’s awards. Our experts have tested and reviewed hundreds of different products to help you find the best new additions and upgrades to improve your daily life.</p><p>From TVs with brilliant picture quality and massive displays, innovative laptops that make it easier to get more done on the go and the latest smartphones to the most exciting kitchen tech, top fitness gadgets, our favorite streaming service and even the latest AI tools and sleep gear, the Tom’s Guide Awards 2025 honors them all.</p><p>Here are all of the winners from this year’s awards and if you head to the award announcement stories at the bottom of each category, you can read more on why we selected each of these products for their respective awards.</p><h3 class="article-body__section" id="section-hero-awards"><span>Hero Awards</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iBn5nWjEkgyazcxHPYF2hS" name="TG Awards 2025 Hero LIST" alt="Tom's Guide 2025 Hero Awards" src="https://cdn.mos.cms.futurecdn.net/iBn5nWjEkgyazcxHPYF2hS.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><ul><li><strong>Best new product: </strong><a href="https://www.tomsguide.com/ai/google-gemini/i-tested-gemini-live-for-24-hours-the-good-the-bad-and-the-weird"><strong>Gemini Live</strong></a><strong></strong></li><li><strong>Innovation award: </strong><a href="https://www.tomsguide.com/computing/laptops/gaming-laptops/asus-rog-flow-z13-2025-review"><strong>Asus ROG Flow Z13</strong></a><strong></strong></li><li><strong>Best company award: </strong><a href="https://www.tomsguide.com/ai/anthropic-is-putting-a-limit-on-a-claude-ai-feature-because-people-are-using-it-24-7"><strong>Anthropic</strong></a><strong></strong></li><li><strong>Sustainability in tech: </strong><a href="https://www.tomsguide.com/computing/laptops/i-just-built-the-new-framework-laptop-12-and-this-upgrade-is-a-game-changer-heres-why"><strong>Framework Laptop 12</strong></a><strong></strong></li><li><strong>Best product design: </strong><a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review"><strong>Samsung Galaxy Z Fold 7</strong></a></li></ul><p><em>Find out more about all the winners in the </em><a href="https://www.tomsguide.com/tech/toms-guide-hero-awards-2025"><em>Tom's Guide Awards 2025 Hero Awards</em></a></p><h3 class="article-body__section" id="section-phones"><span>Phones</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="w7PAueLTDb5ZEXcBn4CsZ9" name="TG Awards 2025 Phones LIST" alt="Tom's Guide Awards 2025: Phones" src="https://cdn.mos.cms.futurecdn.net/w7PAueLTDb5ZEXcBn4CsZ9.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><ul><li><strong>Best phone: </strong><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s25-ultra-review"><strong>Samsung Galaxy S25 Ultra</strong></a><strong></strong></li><li><strong>Best iPhone: </strong><a href="https://www.tomsguide.com/phones/iphones/apple-iphone-16-pro-review"><strong>iPhone 16 Pro</strong></a><strong></strong></li><li><strong>Best Android phone: </strong><a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-9-pro-review"><strong>Google Pixel 9 Pro</strong></a><strong></strong></li><li><strong>Best camera phone: </strong><a href="https://www.tomsguide.com/phones/i-shot-over-200-photos-with-the-galaxy-s25-ultra-vs-pixel-9-pro-xl-heres-the-winner"><strong>Samsung Galaxy S25 Ultra</strong></a><strong></strong></li><li><strong>Best AI phone: </strong><a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-9-review"><strong>Google Pixel 9</strong></a><strong></strong></li><li><strong>Best foldable phone: </strong><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-7-hands-on-review-feels-like-flip-phone-perfection"><strong>Samsung Galaxy Z Flip 7</strong></a><strong></strong></li><li><strong>Best phone design: </strong><a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review"><strong>Samsung Galaxy Z Fold 7</strong></a><strong></strong></li><li><strong>Best phone battery life: </strong><a href="https://www.tomsguide.com/phones/android-phones/asus-rog-phone-9-pro-review-gaming-pro-and-battery-life-legend"><strong>Asus ROG Phone 9 Pro</strong></a><strong></strong></li><li><strong>Best budget phone: </strong><a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-9a-review"><strong>Google Pixel 9a</strong></a></li></ul><p><em>Find out more about all the winners for the </em><a href="https://www.tomsguide.com/phones/toms-guide-awards-2025"><em>Tom's Guide Awards 2025 for Phones</em></a></p><h3 class="article-body__section" id="section-active-life"><span>Active Life</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Vkgu3Y6QhYkiEtXWXSo8jH" name="TG Awards 2025 Active Life LIST" alt="Tom's Guide Awards 2025: Active Life" src="https://cdn.mos.cms.futurecdn.net/Vkgu3Y6QhYkiEtXWXSo8jH.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><ul><li><strong>Best smartwatch: </strong><a href="https://www.tomsguide.com/Garmin-Instinct-3-review"><strong>Garmin Instinct 3</strong></a><strong></strong></li><li><strong>Best fitness tracker: </strong><a href="https://www.tomsguide.com/wellness/fitness-trackers/oura-ring-4-review"><strong>Oura Ring 4</strong></a><strong></strong></li><li><strong>Best running watch: </strong><a href="https://www.tomsguide.com/wellness/smartwatches/garmin-forerunner-970-review-my-new-favorite-sports-watch"><strong>Garmin Forerunner 970</strong></a><strong></strong></li><li><strong>Best workout headphones: </strong><a href="https://www.tomsguide.com/audio/beats-powerbeats-pro-2-review"><strong>Beats Powerbeats Pro 2</strong></a><strong></strong></li><li><strong>Best massage gun: </strong><a href="https://www.tomsguide.com/wellness/fitness/bob-and-brad-m7-plus-mini-massage-gun-review"><strong>Bob and Brad M7 Plus Mini</strong></a><strong></strong></li><li><strong>Best running shoes: </strong><a href="https://www.tomsguide.com/wellness/running/asics-novablast-5-review"><strong>Asics Novablast 5</strong></a><strong></strong></li><li><strong>Best hiking boots: </strong><a href="https://www.tomsguide.com/wellness/fitness/timberland-motion-access-mid-waterproof-sneaker-review-comfortable-stylish-and-no-break-in-period"><strong>Timberland Motion Access Mid</strong></a><strong></strong></li><li><strong>Best outerwear: </strong><a href="https://www.tomsguide.com/wellness/fitness/patagonia-nano-air-ultralight-review-outrageous-comfort-doesnt-come-cheap"><strong>Patagonia Nano-Air Ultralight</strong></a><strong></strong></li><li><strong>Best workout app: </strong><a href="https://www.tomsguide.com/reviews/runna-app"><strong>Runna</strong></a><strong></strong></li><li><strong>Best adjustable dumbbells: </strong><a href="https://www.tomsguide.com/wellness/fitness/my-all-time-favorite-budget-adjustable-dumbbells-are-just-usd165-right-now-for-prime-day-and-they-load-up-to-25lbs"><strong>LifePro PowerFlow Plus</strong></a><strong></strong></li><li><strong>Best electric scooter: </strong><a href="https://www.tomsguide.com/home/electric-scooters/segway-ninebot-ekickscooter-max-g3-review"><strong>Segway Max G3</strong></a><strong></strong></li><li><strong>Best electric bike: </strong><a href="https://www.tomsguide.com/reviews/rad-power-radcity-5-plus"><strong>Rad Power RadCity 5 Plus</strong></a><strong></strong></li></ul><p><em>Find out more about all the winners for the </em><a href="https://www.tomsguide.com/wellness/fitness/toms-guide-awards-2025-our-favorite-health-and-fitness-gear-to-power-an-active-life"><em>Tom's Guide Awards 2025 for Active Life</em></a></p><h3 class="article-body__section" id="section-computing"><span>Computing</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="B4aqDYHPsc4T96FtNzZCXP" name="TG Awards 2025 Computing LIST" alt="Tom's Guide Awards 2025 Computing" src="https://cdn.mos.cms.futurecdn.net/B4aqDYHPsc4T96FtNzZCXP.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><ul><li><strong>Best laptop: </strong><a href="https://www.tomsguide.com/computing/laptops/macbook-air-m4-review"><strong>Apple MacBook Air M4</strong></a><strong></strong></li><li><strong>Best AI laptop: </strong><a href="https://www.tomsguide.com/reviews/msi-prestige-16-ai-evo"><strong>MSI Prestige 16 AI Evo</strong></a><strong></strong></li><li><strong>Best keyboard: </strong><a href="https://www.tomsguide.com/computing/peripherals/zsa-moonlander-review-the-most-customizable-keyboard-ive-ever-used"><strong>ZSA Moonlander</strong></a><strong></strong></li><li><strong>Best gaming laptop: </strong><a href="https://www.tomsguide.com/computing/gaming-laptops/alienware-16-area-51-gaming-laptop-review"><strong>Alienware Area-51</strong></a><strong></strong></li><li><strong>Best 2-in-1 laptop: </strong><a href="https://www.tomsguide.com/computing/laptops/gaming-laptops/asus-rog-flow-z13-2025-review"><strong>Asus ROG Flow Z13</strong></a><strong></strong></li><li><strong>Best monitor: </strong><a href="https://www.tomsguide.com/computing/monitors/lg-ultragear-45gx950a-b-review"><strong>LG 5K2K ultrawide</strong></a><strong></strong></li><li><strong>Best AR Glasses: </strong><a href="https://www.tomsguide.com/computing/vr-ar/smart-glasses/xreal-one-pro-ar-glasses-review"><strong>Xreal One Pro</strong></a><strong></strong></li><li><strong>Best webcam: </strong><a href="https://www.tomsguide.com/computing/peripherals/insta360-link-2c-review"><strong>Insta360 Link 2C</strong></a><strong></strong></li><li><strong>Best tablet: </strong><a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review"><strong>iPad Air M3</strong></a><strong></strong></li><li><strong>Best router: </strong><a href="https://www.tomsguide.com/computing/routers/netgear-nighthawk-rs600-review"><strong>Netgear Nighthawk RS600</strong></a><strong></strong></li><li><strong>Best mesh router: </strong><a href="https://www.tomsguide.com/computing/routers/asus-bq16-pro-review"><strong>Asus ZenWiFi BQ16 Pro</strong></a><strong></strong></li><li><strong>Best antivirus: </strong><a href="https://www.tomsguide.com/computing/antivirus/norton-360-deluxe-antivirus-review"><strong>Norton 360 Deluxe</strong></a><strong></strong></li><li><strong>Best VPN: </strong><a href="https://www.tomsguide.com/reviews/nordvpn-review"><strong>NordVPN</strong></a></li></ul><p><em>Find out more about all the winners for the </em><a href="https://www.tomsguide.com/computing/toms-guide-awards-2025"><em>Tom's Guide Awards 2025 for Computing</em></a><em>.</em></p><h3 class="article-body__section" id="section-audio"><span>Audio </span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MAdoEdLdNF2GxcWigEk4v" name="TG Awards 2025 Audio LIST" alt="Tom's Guide Awards 2025 Audio" src="https://cdn.mos.cms.futurecdn.net/MAdoEdLdNF2GxcWigEk4v.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><ul><li><strong>Best headphones: </strong><a href="https://www.tomsguide.com/audio/bowers-and-wilkins-px7-s3-review"><strong>Bowers & Wilkins PX7 S3</strong></a><strong></strong></li><li><strong>Best noise-cancelling headphones: </strong><a href="https://www.tomsguide.com/audio/over-ear-headphones/sony-wh-1000xm6-review"><strong>Sony WH-1000XM6</strong></a><strong></strong></li><li><strong>Best noise-cancelling earbuds: </strong><a href="https://www.tomsguide.com/audio/earbuds/noble-fokus-amadeus-review"><strong>Noble Fokus Amadeus</strong></a><strong></strong></li><li><strong>Best wireless earbuds: </strong><a href="https://www.tomsguide.com/audio/earbuds/sony-wf-c710n-wireless-earbuds-review"><strong>Sony WF-C710N</strong></a><strong></strong></li><li><strong>Best audiophile headphones: </strong><a href="https://www.tomsguide.com/audio/final-d8000-dc-review"><strong>Final D8000 DC</strong></a><strong></strong></li><li><strong>Best soundbar: </strong><a href="https://www.tomsguide.com/audio/soundbars/marshall-heston-120-soundbar-review-rock-n-roll-styling-meets-movie-magic"><strong>Marshall Heston 120</strong></a><strong></strong></li><li><strong>Best Bluetooth speaker: </strong><a href="https://www.tomsguide.com/audio/bluetooth-speakers/marshall-kilburn-iii-review"><strong>Marshall Kilburn III</strong></a><strong></strong></li></ul><p><em>Find out more about all the winners for the </em><a href="https://www.tomsguide.com/audio/toms-guide-awards-2025"><em>Tom's Guide Awards 2025 for Audio</em></a></p><h3 class="article-body__section" id="section-streaming"><span>Streaming</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XsbVTnqub7KuLcpZ8Aryjm" name="TG Awards 2025 Streaming LIST" alt="Tom's Guide Awards 2025 Streaming" src="https://cdn.mos.cms.futurecdn.net/XsbVTnqub7KuLcpZ8Aryjm.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock/Netflix/Tubi/Tom's Guide)</span></figcaption></figure><ul><li><strong>Best streaming service: </strong><a href="https://www.tomsguide.com/reviews/hbo-max"><strong>HBO Max</strong></a><strong></strong></li><li><strong>Best live TV streaming service: </strong><a href="https://www.tomsguide.com/reviews/youtube-tv"><strong>YouTube TV</strong></a><strong></strong></li><li><strong>Best sports streaming service: </strong><a href="https://www.tomsguide.com/reviews/youtube-tv"><strong>YouTube TV</strong></a><strong></strong></li><li><strong>Best free streaming service: </strong><a href="https://www.tomsguide.com/news/tubi-tv"><strong>Tubi</strong></a><strong></strong></li><li><strong>Best streaming original show: </strong><a href="https://www.tomsguide.com/entertainment/netflix/netflix-just-got-a-gripping-crime-drama-show-thats-already-hit-no-1-and-its-100-percent-on-rotten-tomatoes"><strong>Adolescence</strong></a><strong></strong></li><li><strong>Best streaming original movie: </strong><a href="https://www.tomsguide.com/entertainment/netflix/netflixs-new-crime-thriller-is-one-of-the-best-movies-of-the-year-and-its-already-92-percent-on-rotten-tomatoes"><strong>Woman of the Hour</strong></a></li></ul><p><em>Find out more about all the winners for the </em><a href="https://www.tomsguide.com/entertainment/streaming/toms-guide-awards-2025"><em>Tom's Guide Awards 2025 for Streaming</em></a></p><h3 class="article-body__section" id="section-tvs"><span>TVs</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MASah7WqLWn9ta2pEPBfwk" name="TG Awards 2025 TVs LIST" alt="Tom's Guide Awards 2025 TVs" src="https://cdn.mos.cms.futurecdn.net/MASah7WqLWn9ta2pEPBfwk.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><ul><li><strong>Best TV overall: </strong><a href="https://www.tomsguide.com/tvs/oled-tvs/lg-c5-oled-tv-review"><strong>LG C5 OLED</strong></a><strong></strong></li><li><strong>Best TV value: </strong><a href="https://www.tomsguide.com/tvs/tcl-qm6k-mini-led-tv-review"><strong>TCL QM6K</strong></a><strong></strong></li><li><strong>Best OLED TV: </strong><a href="https://www.tomsguide.com/tvs/4k-tvs/samsung-s95f-oled-tv-review"><strong>Samsung S95F OLED</strong></a><strong></strong></li><li><strong>Best QLED TV: </strong><a href="https://www.tomsguide.com/tvs/4k-tvs/hisense-u8qg-mini-led-tv-review"><strong>Hisense U8QG</strong></a><strong></strong></li><li><strong>Best TV design: </strong><a href="https://www.tomsguide.com/tvs/oled-tvs/lg-g5-oled-tv-review"><strong>LG G5 OLED</strong></a><strong></strong></li><li><strong>Best TV innovation: </strong><a href="https://www.tomsguide.com/tvs/oled-tvs/panasonics-2025-flagship-oled-tv-is-a-true-stunner-and-it-might-beat-lg-and-samsung"><strong>Panasonic Z95B OLED</strong></a><strong></strong></li><li><strong>Best 8K TV: </strong><a href="https://www.tomsguide.com/tvs/samsung-qn990f-neo-qled-8k-tv-review"><strong>Samsung QN990F Neo QLED</strong></a><strong></strong></li><li><strong>Best big-screen TV: </strong><a href="https://www.tomsguide.com/tvs/samsung-s90d-oled-tv-review"><strong>Samsung S90D OLED</strong></a><strong></strong></li><li><strong>Best projector: </strong><a href="https://www.tomsguide.com/tvs/hisense-c2-ultra-review"><strong>Hisense C2 Ultra</strong></a></li></ul><p><em>Find out more about all the winners for the </em><a href="https://www.tomsguide.com/tvs/toms-guide-awards-2025"><em>Tom's Guide Awards 2025 for TVs</em></a></p><h3 class="article-body__section" id="section-photography"><span>Photography</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jaHePPVaf9wyV4vDayA937" name="TG Awards 2025 Photography LIST" alt="Tom's Guide Awards 2025 Photography" src="https://cdn.mos.cms.futurecdn.net/jaHePPVaf9wyV4vDayA937.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><ul><li><strong>Best mirrorless camera: </strong><a href="https://www.tomsguide.com/cameras-photography/mirrorless-cameras/nikon-z5ii-review"><strong>Nikon Z5II</strong></a><strong></strong></li><li><strong>Best action camera: </strong><a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-5-pro-review"><strong>DJI Osmo Action 5 Pro</strong></a><strong></strong></li><li><strong>Best 360 camera: </strong><a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-x5-review"><strong>Insta360 X5</strong></a><strong></strong></li><li><strong>Best instant camera: </strong><a href="https://www.tomsguide.com/cameras-photography/fujifilm-instax-mini-41-instant-camera-review"><strong>Fujifilm Instax mini 41</strong></a><strong></strong></li><li><strong>Best film camera: </strong><a href="https://www.tomsguide.com/cameras-photography/pentax-17-review"><strong>Pentax 17</strong></a><strong></strong></li><li><strong>Best drone: </strong><a href="https://www.tomsguide.com/cameras-photography/drones/dji-air-3s-review"><strong>DJI Air 3S</strong></a><strong></strong></li><li><strong>Best vlogging camera: </strong><a href="https://www.tomsguide.com/cameras-photography/mirrorless-cameras/canon-eos-r50-v-review"><strong>Canon EOS R50 V</strong></a><strong></strong></li></ul><p><em>Find out more about all the winners for the </em><a href="https://www.tomsguide.com/cameras-photography/toms-guide-awards-2025"><em>Tom's Guide Awards 2025 for Photography</em></a></p><h3 class="article-body__section" id="section-gaming"><span>Gaming</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GBYCEiTFBeyewTA9GxrQjR" name="TG Awards 2025 Gaming LIST" alt="Tom's Guide Awards 2025" src="https://cdn.mos.cms.futurecdn.net/GBYCEiTFBeyewTA9GxrQjR.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><ul><li><strong>Best console: </strong><a href="https://www.tomsguide.com/gaming/playstation/ps5-slim"><strong>PS5 Slim</strong></a><strong></strong></li><li><strong>Best handheld gaming console: </strong><a href="https://www.tomsguide.com/gaming/handheld-gaming/lenovo-legion-go-s-hands-on-review"><strong>Lenovo Legion Go S</strong></a><strong></strong></li><li><strong>Best VR headset: </strong><a href="https://www.tomsguide.com/computing/vr-ar/meta-quest-3s-review"><strong>Meta Quest 3S</strong></a><strong></strong></li><li><strong>Best gaming monitor: </strong><a href="https://www.tomsguide.com/computing/monitors/alienware-aw3425dw-review"><strong>Alienware 34 QD-OLED</strong></a><strong></strong></li><li><strong>Best gaming keyboard: </strong><a href="https://www.tomsguide.com/computing/peripherals/lemokey-l5-he-review"><strong>Lemokey L5 HE</strong></a><strong></strong></li><li><strong>Best gaming mouse: </strong><a href="https://www.tomsguide.com/computing/peripherals/corsair-m75-mac-mouse-review"><strong>Corsair M75</strong></a><strong></strong></li><li><strong>Best gaming headset: </strong><a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-3-wireless-review"><strong>SteelSeries Arctis Nova 3 Wireless</strong></a><strong></strong></li><li><strong>Best gaming chair: </strong><a href="https://www.tomsguide.com/gaming/gaming-peripherals/dxracer-martian-review"><strong>DX Racer Martian</strong></a><strong></strong></li><li><strong>Best game subscription service: </strong><a href="https://www.tomsguide.com/gaming/handheld-gaming/nvidia-geforce-now-steam-deck-hands-on-test"><strong>Nvidia GeForce Now</strong></a><strong></strong></li></ul><p><em>Find out more about all the winners for the </em><a href="https://www.tomsguide.com/gaming/toms-guide-awards-2025"><em>Tom's Guide Awards 2025 for Gaming</em></a></p><h3 class="article-body__section" id="section-ai"><span>AI</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NV8rxefokJpuu6SzwR4SMo" name="TG Awards 2025 AI LIST" alt="Tom's Guide Awards 2025" src="https://cdn.mos.cms.futurecdn.net/NV8rxefokJpuu6SzwR4SMo.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><ul><li><strong>Best AI chatbot: </strong><a href="https://www.tomsguide.com/ai/what-is-claude-everything-you-need-to-know-about-anthropics-ai-powerhouse"><strong>Claude</strong></a><strong></strong></li><li><strong>Best AI image generator: </strong><a href="https://www.tomsguide.com/ai/chatgpts-4o-image-generation-is-a-mindblowing-upgrade-7-examples-of-it-in-action"><strong>ChatGPT</strong></a><strong></strong></li><li><strong>Best AI video generator: </strong><a href="https://www.tomsguide.com/ai/google-veo-3-and-flow-the-future-of-ai-filmmaking-is-here-heres-how-it-works"><strong>Veo 3</strong></a><strong></strong></li><li><strong>Best AI music generator: </strong><a href="https://www.tomsguide.com/ai/make-your-own-music-with-riffusion-ai-5-prompts-to-get-started"><strong>Riffusion</strong></a><strong></strong></li><li><strong>Best AI device: </strong><a href="https://www.tomsguide.com/ai/plaud-notepin-review"><strong>Plaud NotePin</strong></a><strong></strong></li><li><strong>Best AI phone feature: </strong><a href="https://www.tomsguide.com/ai/google-gemini/i-tested-gemini-live-for-24-hours-the-good-the-bad-and-the-weird"><strong>Gemini Live</strong></a></li></ul><p><em>Find out more about all the winners for the </em><a href="https://www.tomsguide.com/ai/toms-guide-awards-2025"><em>Tom's Guide Awards 2025 for AI</em></a></p><h3 class="article-body__section" id="section-automotive"><span>Automotive</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pVVTPyiosxCAh2CfL7hte9" name="TG Awards 2025 Auto LIST" alt="Tom's Guide Awards 2025 Automotive" src="https://cdn.mos.cms.futurecdn.net/pVVTPyiosxCAh2CfL7hte9.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><ul><li><strong>Best design: </strong><a href="https://www.tomsguide.com/vehicle-tech/evs/i-drove-the-2025-volkswagen-id-buzz-for-a-week-and-it-gets-more-attention-than-any-other-ev-on-the-road#section-2025-volkswagen-id-buzz-pro-s-plus-4motion-what-i-like"><strong>Volkswagen ID.Buzz</strong></a><strong></strong></li><li><strong>Best EV: </strong><a href="https://www.tomsguide.com/vehicle-tech/evs/i-drove-the-volvo-ex30-for-a-week-and-its-the-ev-id-buy-with-my-own-money#section-2025-volvo-ex30-testing-summary"><strong>Volvo EX30</strong></a><strong></strong></li><li><strong>Best Plug-In Hybrid: </strong><a href="https://www.tomsguide.com/vehicle-tech/evs/i-drove-the-kia-niro-plug-in-hybrid-for-a-week-and-its-a-phev-that-most-people-can-afford#section-2024-kia-niro-phev-sx-touring-specifications"><strong>Kia Niro PHEV</strong></a><strong></strong></li><li><strong>Best value: </strong><a href="https://www.tomsguide.com/vehicle-tech/evs/2025-chevrolet-equinox-ev-lt-pros-and-cons"><strong>Chevrolet Equinox EV</strong></a><strong></strong></li><li><strong>Best SUV: </strong><a href="https://www.tomsguide.com/vehicle-tech/evs/i-drove-a-honda-prologue-ev-for-a-week-and-its-the-most-underrated-electric-vehicle-ive-tested-this-year"><strong>Honda Prologue</strong></a><strong></strong></li><li><strong>Best Pickup Truck: </strong><a href="https://www.tomsguide.com/vehicle-tech/evs/i-drove-a-rivian-r1t-tri-for-a-week-heres-my-pros-and-cons"><strong>Rivian R1T</strong></a><strong></strong></li><li><strong>Most efficient: </strong><a href="https://www.tomsguide.com/vehicle-tech/evs/2025-lucid-air-touring-pros-and-cons"><strong>Lucid Air Pure</strong></a><strong></strong></li></ul><p><em>Find out more about all the winners for the </em><a href="https://www.tomsguide.com/vehicle-tech/toms-guide-awards-2025"><em>Tom's Guide Awards 2025 for Automotive</em></a></p><h3 class="article-body__section" id="section-sleep"><span>Sleep</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GrBmR47YpfyCFB8Aq2ZgaN" name="TG Awards 2025 Sleep LIST" alt="Tom's Guide Awards 2025 Sleep" src="https://cdn.mos.cms.futurecdn.net/GrBmR47YpfyCFB8Aq2ZgaN.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><ul><li><strong>Best mattress: </strong><a href="https://www.tomsguide.com/reviews/saatva-classic-mattress"><strong>Saatva Classic</strong></a><strong></strong></li><li><strong>Best mattress in a box: </strong><a href="https://www.tomsguide.com/reviews/dreamcloud-mattress"><strong>DreamCloud Classic</strong></a><strong></strong></li><li><strong>Best hybrid mattress: </strong><a href="https://www.tomsguide.com/reviews/saatva-classic-mattress"><strong>Saatva Classic</strong></a><strong></strong></li><li><strong>Best memory foam mattress: </strong><a href="https://www.tomsguide.com/wellness/mattresses/nectar-premier-memory-foam-mattress-review"><strong>Nectar Premier Memory Foam Mattress</strong></a><strong></strong></li><li><strong>Best mattress for side sleepers: </strong><a href="https://www.tomsguide.com/wellness/mattresses/helix-midnight-luxe-mattress-review-year"><strong>Helix Midnight Luxe</strong></a><strong></strong></li><li><strong>Best mattress for stomach sleepers: </strong><a href="https://www.tomsguide.com/mattresses/helix-dawn-review"><strong>Helix Dawn</strong></a><strong></strong></li><li><strong>Best mattress topper: </strong><a href="https://www.tomsguide.com/wellness/mattresses/tempur-pedic-tempur-adapt-cooling-mattress-topper"><strong>Tempur-Pedic Tempur-Adapt + Cooling Mattress Topper</strong></a><strong></strong></li><li><strong>Best pillow: </strong><a href="https://www.tomsguide.com/mattresses/pillows-bedding/coop-sleep-goods-original-adjustable-pillow-review"><strong>Coop Home Goods Adjustable Pillow</strong></a><strong></strong></li><li><strong>Best mattress protector: </strong><a href="https://www.tomsguide.com/wellness/mattresses/coop-home-goods-ultra-tech-waterproof-mattress-protector-review-year"><strong>Coop Home Goods Waterproof Mattress Protector</strong></a><strong></strong></li><li><strong>Best sunrise alarm clock: </strong><a href="https://www.tomsguide.com/wellness/sleep-tech/hatch-restore-3-sunrise-alarm-clock-review"><strong>Hatch Restore 3</strong></a><strong></strong></li></ul><p><em>Find out more about all the winners for the </em><a href="https://www.tomsguide.com/wellness/sleep/toms-guide-awards-2025"><em>Tom's Guide Awards 2025 for Sleep</em></a></p><h3 class="article-body__section" id="section-homes"><span>Homes</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8ATLnpYuw5cxr6TRQE7Go9" name="TG Awards 2025 Homes LIST" alt="Tom's Guide Awards 2025 Homes" src="https://cdn.mos.cms.futurecdn.net/8ATLnpYuw5cxr6TRQE7Go9.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><ul><li><strong>Best air fryer: </strong><a href="https://www.tomsguide.com/home/air-fryers/ninja-crispi-air-fryer-review"><strong>Ninja Crispi</strong></a><strong></strong></li><li><strong>Best blender: </strong><a href="https://www.tomsguide.com/home/home-appliances/vitamix-ascent-x2-blender-review"><strong>Vitamix Ascent Series X2</strong></a><strong></strong></li><li><strong>Best juicer: </strong><a href="https://www.tomsguide.com/home/home-appliances/nama-c2-cold-press-juicer-and-blender-review"><strong>Nama C2 Cold Press Blender & Juicer</strong></a><strong></strong></li><li><strong>Best stand mixer: </strong><a href="https://www.tomsguide.com/home/home-appliances/i-got-a-first-look-at-oonis-new-halo-pro-stand-mixer"><strong>Ooni Halo Pro</strong></a><strong></strong></li><li><strong>Best smart home device: </strong><a href="https://www.tomsguide.com/home/smart-home/echo-show-21-review"><strong>Amazon Echo Show 21</strong></a><strong></strong></li><li><strong>Best air purifier: </strong><a href="https://www.tomsguide.com/home/home-appliances/blueair-blue-signature-air-purifier-review"><strong>Blueair Blue Signature </strong></a><strong></strong></li><li><strong>Best coffee maker: </strong><a href="https://www.tomsguide.com/home/coffee-makers/fellow-aiden-coffee-maker-review"><strong>Fellow Aiden</strong></a><strong></strong></li><li><strong>Best espresso machine: </strong><a href="https://www.tomsguide.com/home/coffee-makers/i-spent-a-month-testing-the-delonghi-la-specialista-touch-and-its-an-instant-classic"><strong>De'Longhi La Specialista Touch</strong></a><strong></strong></li><li><strong>Best vacuum cleaner: </strong><a href="https://www.tomsguide.com/home/home-appliances/samsung-bespoke-jet-ai-ultra-vacuum-review"><strong>Samsung Bespoke Jet AI Ultra</strong></a><strong></strong></li><li><strong>Best robot vacuum cleaner: </strong><a href="https://www.tomsguide.com/home/home-appliances/roborock-saros-10r-review"><strong>Roborock Saros 10R</strong></a><strong></strong></li><li><strong>Best digital photo frame: </strong><a href="https://www.tomsguide.com/cameras-photography/aura-aspen-review"><strong>Aura Aspen</strong></a><strong></strong></li><li><strong>Best standing desk: </strong><a href="https://www.tomsguide.com/home/home-office/branch-four-leg-standing-desk-review"><strong>Branch Four Leg Standing Desk</strong></a><strong></strong></li><li><strong>Best office chair: </strong><a href="https://www.tomsguide.com/home/home-office/hinomi-x1-review"><strong>Hinomi X1</strong></a><strong></strong></li><li><strong>Best grill: </strong><a href="https://www.tomsguide.com/home/outdoors/weber-spirit-ep-425-gas-grill-review"><strong>Weber Spirit EP-425</strong></a><strong></strong></li><li><strong>Best cooler: </strong><a href="https://www.tomsguide.com/home/ninja-frostvault-cooler-review"><strong>Ninja FrostVault</strong></a><strong></strong></li></ul><p><em>Find out more about all the winners for the </em><a href="https://www.tomsguide.com/home/toms-guide-awards-2025"><em>Tom's Guide Awards 2025 for Homes</em></a></p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Tom's Guide Awards 2025: The brands, innovations and products that excite us the most ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/toms-guide-hero-awards-2025</link>
                                                                            <description>
                            <![CDATA[ These are the Tom's Guide Awards 2025 winners in our Hero Awards category which covers the latest innovations, best design, impressive sustainability efforts and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LPD6QYginoRCtpvLt57xgL</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/iBn5nWjEkgyazcxHPYF2hS-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 02 Aug 2025 07:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tom&#039;s Guide Staff ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/6hCNi5TkwpnQYs6nUTtoPc.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/iBn5nWjEkgyazcxHPYF2hS-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tom&#039;s Guide 2025 Hero Awards]]></media:description>                                                            <media:text><![CDATA[Tom&#039;s Guide 2025 Hero Awards]]></media:text>
                                <media:title type="plain"><![CDATA[Tom&#039;s Guide 2025 Hero Awards]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/iBn5nWjEkgyazcxHPYF2hS-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We’ve covered a wide range of products, devices and services across 12 different categories for this year’s Tom’s Guide Awards. However, we’ve saved the best for last and our Hero Awards recognize the best of the best from the latest innovations to cutting-edge design and impressive sustainability efforts.</p><p>The winners of this year’s Hero Awards stood out to our team here at Tom’s Guide for changing the course of the world of technology as a whole, breaking ground with new innovations and going the extra mile when it comes to making the devices we use everyday more sustainable. </p><p>Join us in celebrating the achievements of all of this year’s Hero Awards winners and the lasting impact these companies and their products will have on the future of technology.</p><h3 class="article-body__section" id="section-best-new-product"><span>Best new product</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4uWGLzayo9vCcEKew5pH9K" name="Gemini Live" alt="Gemini Live" src="https://cdn.mos.cms.futurecdn.net/4uWGLzayo9vCcEKew5pH9K.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><h2 id="gemini-live">Gemini Live</h2><p>AI is everywhere these days, and Google’s Gemini is absolutely dominating the space right now. While the AI software has a lot of features to boast, <a href="https://www.tomsguide.com/ai/google-gemini/i-tested-gemini-live-for-24-hours-the-good-the-bad-and-the-weird"><strong>Gemini Live</strong></a> has quickly stood out as one of its best.</p><p>Google describes it as a more natural way to chat to Gemini. Open up the Gemini app and you can start a video chat with it, showing Gemini your surroundings and chatting away to the AI bot.</p><p>It’s not just video, share documents, images and files with Gemini and live chat with the bot as it identifies what it is looking at.</p><p>This feature has been advertised heavily by Samsung, and for good reason. It turns your smartphone into an all-knowing chatbot with eyes. It can translate menus, explain documents, teach you how to change a tire and identify what kind of laptop you have.</p><p>Sure, this kind of feature isn’t entirely unique, competitors like OpenAI have their own version, but Gemini stands out as the most intuitive, understanding context and situational awareness far better than anyone else.<br></p><h3 class="article-body__section" id="section-innovation-award"><span>Innovation award</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sAUcsPsbAmH8AZpfQcwFYV" name="Asus ROG Flow Z13" alt="Asus ROG Flow Z13" src="https://cdn.mos.cms.futurecdn.net/sAUcsPsbAmH8AZpfQcwFYV.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><h2 id="asus-rog-flow-z13">Asus ROG Flow Z13</h2><p>The <a href="https://www.tomsguide.com/computing/laptops/gaming-laptops/asus-rog-flow-z13-2025-review"><strong>Asus ROG Flow Z13</strong></a> started its life this year in controversial fashion — being announced with no dedicated graphics card. Instead, you’re getting an AMD Ryzen AI Max APU with…integrated graphics? Asus promised me it was powerful, but I was suspicious.</p><p>Fast forward a few months later to launch, and I can safely confirm that Strix Halo is the real deal — I’m absolutely blown away by what this 2-in-1 can do in the gaming space. I’m talking about Cyberpunk 2077 with topped out settings at over 90 frames per second, and even Black Myth: Wukong at 92 FPS.</p><p>And all of this in what is <em>essentially </em>a tablet!? And a damn good looking one at that with a bright, colorful and buttery smooth 180Hz Mini-LED display, a slim and sleek design, and a battery life that frankly embarrasses other high performance laptops?</p><p>I’ve been waiting for this moment for years — where gaming notebooks can be ultraportable without compromising performance. And now, it’s happened.</p><h3 class="article-body__section" id="section-best-company-award"><span>Best company award</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xLM37vfkFA49k8yatRjJSY" name="Anthropic--credit-VCG-Getty" alt="Anthropic" src="https://cdn.mos.cms.futurecdn.net/xLM37vfkFA49k8yatRjJSY.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images/VCG)</span></figcaption></figure><h2 id="anthropic">Anthropic</h2><p>Thanks to its mission-driven approach to building safe and trustworthy AI, <a href="https://www.tomsguide.com/ai/anthropic-is-putting-a-limit-on-a-claude-ai-feature-because-people-are-using-it-24-7"><strong>Anthropic</strong></a> deserves the award for Best Company. Founded in 2021 by a team of former OpenAI researchers, the company has quickly risen to prominence with its Claude AI models, most notably Claude Sonnet 4 and Claude Opus 4, which have surpassed competitors in productivity tasks like writing, summarization and even code generation, leading in SWE-Bench benchmarks. </p><p>With massive backing from Amazon and Google and $4 billion in revenue to show for it, Anthropic’s Claude is quickly becoming one of the most influential AI platforms in the industry.<br><br>But what really sets Anthropic apart is its focus on AI safety, transparency and model explainability, qualities that are increasingly critical as AI tools move into our daily lives.</p><p>In a fast-moving industry where hype often outpaces impact, Anthropic’s steady, safety-first strategy is earning real-world trust, and that’s why it’s our top pick. </p><h3 class="article-body__section" id="section-sustainability-in-tech"><span>Sustainability in tech</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sANFmyRA8DzZ2yLJBahD5h" name="Framework Laptop 12 TG" alt="Framework Laptop 12" src="https://cdn.mos.cms.futurecdn.net/sANFmyRA8DzZ2yLJBahD5h.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><h2 id="framework-laptop-12">Framework Laptop 12</h2><p>I’ve been reviewing laptops for decades, and the <a href="https://www.tomsguide.com/computing/laptops/i-just-built-the-new-framework-laptop-12-and-this-upgrade-is-a-game-changer-heres-why"><strong>Framework Laptop 12</strong></a> is the most accessible, sustainable and upgradable 2-in-1 I’ve ever seen. </p><p>Sure, it can’t match the elegance and power of more expensive laptops, but the fact that you can crack it open and start swapping out parts yourself makes the Framework Laptop 12 the most sustainable laptop I’ve used all year. And since the cute, chunky 2-in-1 comes in five color schemes (including bubblegum and sage) it could be a huge hit with kids, students and families.</p><p>That’s great for sustainability because like all Framework laptops, the Framework Laptop 12 is designed to be easy to learn thanks to embedded QR codes inside the laptop which take you right to Framework’s step-by-step guides. If the Framework Laptop 12 proves popular with families and schools it could help a whole generation feel more comfortable modifying and tinkering with their devices, and that could be a huge win for the future of sustainability.</p><h3 class="article-body__section" id="section-best-product-design"><span>Best product design</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bejYnsiPKn86LAmVG7XYsk" name="Galaxy Z Fold 7" alt="Samsung Galaxy Z Fold 7" src="https://cdn.mos.cms.futurecdn.net/bejYnsiPKn86LAmVG7XYsk.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><h2 id="samsung-galaxy-z-fold-7">Samsung Galaxy Z Fold 7</h2><p>This is it. Samsung has done what we didn’t think possible. Make a foldable phone that’s just as sleek as a regular slab smartphone.</p><p>The <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review"><strong>Galaxy Z Fold 7</strong></a> is a revelation in design. Measuring 8.9 mm when folded and 4.2mm when unfolded, this device is only slightly thicker than the Galaxy S25 Ultra and even lighter.</p><p>This is thanks to a redesigned Armor FlexHinge with an enhanced water droplet design. As a result of this and other enhancements, the Z Fold 7 is 48% thinner than the original Galaxy Z Fold and 26% thinner than last year’s Fold 6.</p><p>Even with this huge leap in portability, the Z Fold 7 boasts an even larger 8-inch main display. Plus, there’s a new multi-rail structure that reduces the visibility of the crease. And there’s a bigger 6.5-inch screen up front, too.</p><p>Yes, Samsung ditched S Pen support to achieve this thinner design. And you don’t get dust resistance. But overall, the Galaxy Z Fold 7 is the best foldable I’ve ever held and used. And it’s easily the best designed gadget of the year.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Your tech is costly — cover it ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/protect-home-tech-cover-device-support-installation-verizon</link>
                                                                            <description>
                            <![CDATA[ Verizon Home Device Protect offers protection and support for virtually all your home tech, from gaming consoles to robot vacuums. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">bD5rjbAByZhsAbbHL64b99</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sBVis5NssdFyji7t4Vj7ZM-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 28 Jul 2025 14:29:20 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                                    <dc:creator><![CDATA[ Cole Martin ]]></dc:creator>                                                                                                        <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                    <sponsoredContent>true</sponsoredContent>
                                <cf:isSponsored>true</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/sBVis5NssdFyji7t4Vj7ZM-1280-80.jpg">
                                                            <media:credit><![CDATA[Verizon]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A pair of hands are holding a game controller, with a TV, console, headphones, and tablet in the background among various other home decor items.]]></media:description>                                                            <media:text><![CDATA[A pair of hands are holding a game controller, with a TV, console, headphones, and tablet in the background among various other home decor items.]]></media:text>
                                <media:title type="plain"><![CDATA[A pair of hands are holding a game controller, with a TV, console, headphones, and tablet in the background among various other home decor items.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sBVis5NssdFyji7t4Vj7ZM-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Between the robotic cleaners that vacuum and mop our homes and the gaming systems that entertain us in our free time, we have become inseparable from our favorite tech. But making our homes smarter and keeping ourselves entertained with the latest tech comes at a cost. Not only is the technology itself often expensive, but the ongoing maintenance can add up. Thankfully, you can protect virtually all your home tech investments with <a href="https://vz.to/vz688" target="_blank" rel="nofollow sponsored"><u>Verizon Home Device Protect</u></a>.</p><h2 id="installations-and-tech-support-from-verizon">Installations and tech support from Verizon</h2><p>The robotic vacuum sucks up a dust bunny that’s a bit too big and clogs the machine. The wear and tear of frequent use is taking its toll on your preferred gaming controller. You can't catch your favorite shows because your TV is on the fritz. We’ve all been there! </p><p>With Verizon Home Device Protect, it’s easy to call for backup to get that new TV or game console set up and ready to enjoy. For example, Verizon Home Internet customers with a 5G Home or Fios internet plan who are enrolled in VHDP can enjoy $0 installation on eligible home tech such as televisions, sounds bars, security cameras and more. For non-Verizon Home internet customers, a $49 service fee applies for each product installed—still a fraction of the typical retail installation cost. (You'll get a quote when you call to schedule your installation, so you'll know the exact cost beforehand.)<br><br>Verizon Home Device Protect is a protection and support plan for nearly all your home tech, even beyond installation services. From TVs to laptops to smart home tech to healthcare tech, Verizon has you covered with 24/7 tech support from connected experts. You can even enjoy up to two in-home visits a year with tech experts who can help you troubleshoot the most frustrating woes. </p><p>Tech support from Verizon doesn’t only include troubleshooting. Its Complete Tech Care service includes tune-ups and cleanings that can keep your home tech running its best and extend its longevity, saving you money and protecting your investments in the long run. And when it’s time to let go of that old tablet, laptop or gaming system, Verizon Home Device Protect also offers recycling services so your e-waste doesn’t end up in a landfill. That’s Complete Tech Care for the entire life of your home tech, old and new alike!</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:1999px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="RB5G3zMYdw77wnCquKzpZM" name="Verizon x TG Story 2" alt="A hand drops a cup of coffee just above a laptop, with the coffee splashing over the side of the mug." src="https://cdn.mos.cms.futurecdn.net/RB5G3zMYdw77wnCquKzpZM.jpg" mos="" align="middle" fullscreen="" width="1999" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Verizon)</span></figcaption></figure><h2 id="protecting-your-home-tech-wherever-home-may-be">Protecting your home tech, wherever home may be</h2><p>These days, our home tech doesn’t always stay in one home. We often pack up our consoles, laptops and tablets and take them with us when we travel. It’s fair to be concerned about what could happen to your tech when it’s on the go and to want protection when you’re not at home. Don’t worry — Verizon Home Device Protect still has you covered. </p><p>In fact, you can get protection at a second residence at no additional cost. Has your oldest’s laptop become the victim of a spilled drink in their dorm room? Verizon Home Device Protect can help. Are you struggling to set up tech at your parents’ home? Verizon Home Device Protect can come to the rescue at no additional cost. Adding a second residence can be done quickly and easily from a dashboard or while filing a claim, and you can even change the second covered address up to three times per year.</p><h2 id="verizon-home-device-protect-makes-tech-support-and-maintenance-easy">Verizon Home Device Protect makes tech support and maintenance easy</h2><p>We love our tech, but it doesn’t always love us back. Accidents happen, troubles arise, and settings will forever be a headache. Verizon Home Device Protect makes it easy to set up and enjoy your home tech with support at your fingertips — no receipts, no hassle, just support when and where you need it. Visit <a href="https://vz.to/vz688" target="_blank" rel="nofollow sponsored"><u>Verizon Home Device Protect</u></a> for more information on how to protect, repair and replace your favorite home technology. </p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ This compact power bank will save your phone's lifespan — and it's currently 36% off in this post-Prime Day deal ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/this-compact-power-bank-will-save-your-phones-lifespan-and-its-currently-36-percent-off-in-this-post-prime-day-deal</link>
                                                                            <description>
                            <![CDATA[ Powering up on the go shouldn't be a hassle. This INIU B6 power bank proves just that — and it's now discounted by 36% on Amazon. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">dF4J3fGy8GWzk6pqsvbq4N</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/rBR2ULjyvj8JhGUpNmvKYk-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 25 Jul 2025 00:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ lucy.scotting@futurenet.com (Lucy Scotting) ]]></author>                    <dc:creator><![CDATA[ Lucy Scotting ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/UC9ncAYxkmJ5ipHEyX44ri.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Lucy Scotting is a digital content writer for Tom’s Guide in Australia, covering NBN and internet-related news. Lucy started her career writing for HR and staffing industry publications, with articles covering emerging tech, business and finance.&lt;/p&gt;&lt;p&gt;In her spare time, Lucy can be found watching sci-fi movies, working on her dystopian fiction novel (in progress since 2017) or hanging out with her dog, Fletcher, and her three cats. If she’s not found doing any of the above, she’s likely on her next adventure to a new city, country, or continent. &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/rBR2ULjyvj8JhGUpNmvKYk-1280-80.jpg">
                                                            <media:credit><![CDATA[INIU]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[INIU 10,000 mAh Portable Charger]]></media:description>                                                            <media:text><![CDATA[INIU 10,000 mAh Portable Charger]]></media:text>
                                <media:title type="plain"><![CDATA[INIU 10,000 mAh Portable Charger]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/rBR2ULjyvj8JhGUpNmvKYk-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you're constantly on the go, then chances are you need to invest in one of the best power banks money can buy. But this great deal proves that you don't need to pay top dollar to ensure your phone is constantly at 100% when you're far from a power outlet. </p><p>Hailing from a lesser-known brand, the INIU B6 power bank is <a href="https://www.amazon.com.au/INIU-Portable-Charger-10500mAh-Charging/dp/B08K7GHZ3V" target="_blank">now discounted by 36% on Amazon</a>, down to just AU$29.99. Owning a portable charger is near critical nowadays, especially if you're commuting to and from work, school or university, or jetsetting abroad. </p><p>Having a trusty portable charger will always come in handy, and this one even has some nice features that jazz it up. With a USB-C port, two USB-A ports and a large, easy-to-read display, the INIU B6 is small enough to fit inside your pocket or bag, is totally flight-safe and is extremely light, weighing just 210g. </p><p>You'll need to act fast to pick this one up, though, as there's no guarantee stock will last at this price.</p><div class="product"><a data-dimension112="8e34cf8d-b1cf-446a-a1a6-d54228960d79" data-action="Deal Block" data-label="best power banks" data-dimension48="best power banks" data-dimension25="$29.99" href="https://www.amazon.com.au/INIU-Portable-Charger-10500mAh-Charging/dp/B08K7GHZ3V" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:983px;"><p class="vanilla-image-block" style="padding-top:123.60%;"><img id="WuKiugGG4FjiXit7JehahG" name="INIU Portable Charger 20000mAh deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WuKiugGG4FjiXit7JehahG.jpg" mos="" align="middle" fullscreen="" width="983" height="1215" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you're constantly on the go, be it commuting or travelling, there's no better accessory to have than a portable power bank for your devices. Our colleagues over at TechRadar give this INIU top marks in their<a href="https://www.techradar.com/au/news/top-portable-chargers#section-the-best-budget-power-bank" target="_blank" data-dimension112="8e34cf8d-b1cf-446a-a1a6-d54228960d79" data-action="Deal Block" data-label="best power banks" data-dimension48="best power banks" data-dimension25="$29.99"> best power banks</a> guide, as it can fast charge your phone with its 10,000mAh battery and still have extra juice left over.<a class="view-deal button" href="https://www.amazon.com.au/INIU-Portable-Charger-10500mAh-Charging/dp/B08K7GHZ3V" target="_blank" rel="nofollow" data-dimension112="8e34cf8d-b1cf-446a-a1a6-d54228960d79" data-action="Deal Block" data-label="best power banks" data-dimension48="best power banks" data-dimension25="$29.99">View Deal</a></p></div><p>TechRadar also gave this little pocket rocket a <a href="https://www.techradar.com/au/news/top-portable-chargers#section-the-best-budget-power-bank" target="_blank">massive 5 stars in their review</a>, as the B6 combined affordability and fast charging in one simple package. Their reviewer said that the B6 "has excellent voltage accuracy and can output 85% of its rated capacity at 20W," and comes with an added bonus of a built-in torch — though, they didn't find it to be very bright. </p><p>And thanks to its 10,000mAh of power and 3A fast charging, this power bank can provide lots of juice when you're in a hurry. According to the maker, the B6 can fuel most smartphones at least twice without needing to recharge, which is great if you or your mates need an extra battery boost on your travels. </p><p>The INIU B6 also acts as a phone stand, with a pull-out holder tucked away into the slim design. The B6 also comes with a great 3-year warranty, but if you're keen on draining its battery every day, or want to charge your laptop as well, you may want to consider the <a href="https://www.amazon.com.au/INIU-20000mAh-Charging-Portable-Powerbank/dp/B0CB1DTFT6" target="_blank">INIU B5</a>, which holds more capacity for fast charging larger devices.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
            </channel>
</rss>