<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:dcterms="http://purl.org/dc/terms/"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:cf="https://www.futureplc.com/rss/content-flags"
>
    <channel>
                    <atom:link rel="alternate" hreflang="en-GB"
                       href="https://www.tomsguide.com/uk/feeds/tag/computing"
                       type="application/rss+xml"/>
                            <title><![CDATA[ Latest from Tom's Guide UK in Computing ]]></title>
                <link>https://www.tomsguide.com/uk/computing/peripherals</link>
        <description><![CDATA[ All the latest computing content from the Tom's Guide  UK team ]]></description>
                                    <lastBuildDate>Thu, 17 Sep 2026 06:00:00 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ EXCLUSIVE: Snap CEO Evan Spiegel says smart glasses disguised as normal eyewear are 'creepy' — why Specs look bold on purpose ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Most <a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">smart glasses</a> makers treat their technology like something to apologize for (or something to covertly hide), shrinking cameras and batteries until the frames pass for standard Wayfarers. Snap is doing the <strong>exact </strong>opposite.</p><p>From when Specs debuted to <a href="https://www.tomsguide.com/computing/smart-glasses/snap-specs-hands-on-review">trying them on for myself</a>, it’s clear that the bold, thick-framed silhouette has split opinions. But during my exclusive interview, Snap CEO Evan Spiegel made it clear that this aesthetic isn’t just overcoming engineering physics — it’s a philosophical stance.</p><p>“I think a lot of companies have made the mistake of trying to make smart glasses look like normal glasses, which really just ends up being kind of creepy,” Spiegel commented. “People feel like, ‘oh, are you spying on me? Why are you wearing those spy glasses that are disguised as regular glasses?'"</p><h2 id="designer-wearables-you-see-coming">Designer wearables you see coming</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uGb45L4noSqK4rW8nUPY8F" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/uGb45L4noSqK4rW8nUPY8F-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Rather than apologizing, Snap made Specs unapologetically conspicuous. Of course, in terms of whether you like the look, there’s going to be some detractors. But by doing this, making the hardware unmistakable makes visual transparency a norm.</p><p>"So with Specs, you can really see them coming. They've got iridescent lenses, a very distinct style, and hopefully that invites some real conversation,” Spiegel added.</p><p>“Because the thing I think that's so surprising about Specs is that someone might think, 'Oh, are you recording me?' and it's like, 'No, I'm watching a video on YouTube.' You're like, 'What, you're watching a video on YouTube with a pair of see-through glasses?'"</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DuJ3r5hwtSwNo83vkRCuUo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/DuJ3r5hwtSwNo83vkRCuUo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>By going hard on this big, bold aesthetic, Snap’s intention is to reframe those bystander assumptions with an obvious computer on your face, and defuse any tension that may come from wearing them.</p><p>And I gotta be real, it’s refreshing to see. While the look has drawn some chuckles from the team when I showed them (one said I looked like the front of a pickup truck), making it abundantly visually clear — not just with an LED but also with the size and shape of the glasses themselves — is going to be a lot less “pervert glasses,” and more “what do they do?”</p><h2 id="the-engineering-reality-of-ditching-the-tether">The engineering reality of ditching the tether</h2><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="5JQgLWehqG3taJNsL7Ki7" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/5JQgLWehqG3taJNsL7Ki7-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While Spiegel framed the aesthetic as a social design choice, it is equally a compromise dictated by the laws of physics in 2026. Unlike tethered headsets that offload their compute and battery into a pocket puck, Specs house their entire computing architecture directly within the frame.</p><p>“We thought that was important because people don't want to lug around another puck or something like that just to use Specs,” Spiegel stated. “So in terms of real wearability and portability, that was something that was really important to us."</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zxDGweFyzznyGYehG5NwCF" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/zxDGweFyzznyGYehG5NwCF-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>And as you can read during my hands-on time, they have managed to work around some of those physics challenges — effective vapor chambers to combat the heat generated by two Snapdragon chips and keep those temperatures at a comfortable level. After a few bigger, bulkier generations, I had to ask Evan what the “Eureka moment” was that had him realizing now was the time to go to the consumer.</p><p>"I think the reason why this generation of Specs is ready for primetime is that we finally fit all of this extraordinary capability into a lightweight pair of see-through glasses. They're about 130 grams, so they're very wearable,” Spiegel said. “The last developer version weighed like 200 grams, just way too heavy to really be wearable for these sorts of experiences."</p><p>That’s not to say these aren’t still definitely an early-adopter package. There’s a huge $2,195 price tag attached to them, after all. But trying them on myself, it’s clear the comfort has been figured out.</p><h2 id="can-loud-design-win-public-trust">Can loud design win public trust?</h2><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="zQgTWrovURitAZfU6PbWVo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/zQgTWrovURitAZfU6PbWVo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Snap’s refusal — or inability — to build stealth eyewear is a candid acknowledgment of what AR hardware actually requires today. By choosing high-visibility industrial design over covert disguise, Specs are attempting to solve the societal etiquette problem before it starts. They are visibly loud by design so you physically cannot be sneaky.</p><p>However, the real battle ahead won’t just be the whole “stealth glasses are creepy” thing, it will be convincing consumers to wear a chunky, two-thousand-dollar face computer out in the real world.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/snapchat-launches-its-own-ai-and-says-snap-intelligence-will-anticipate-your-needs">Snapchat launches its own AI — and says Snap Intelligence will 'anticipate your needs'</a></li><li><a href="https://www.tomsguide.com/computing/virtual-reality/pimax-dream-air-review">I’ve played for 100 hours on a VR headset lighter than my iPhone — Pimax Dream Air is an expensive breakthrough</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-benchmarked-the-real-dlss-5-in-nba-2k27-and-the-future-of-photorealistic-graphics-has-one-big-catch">I tested DLSS 5 in NBA 2K27 on a mid-range gaming laptop — it's the future of photorealistic graphics, but there's a catch</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/smart-glasses/exclusive-snap-ceo-evan-spiegel-says-smart-glasses-disguised-as-normal-eyewear-are-creepy-why-specs-look-bold-on-purpose</link>
                                                                            <description>
                            <![CDATA[ Disguised smart glasses are kind of "creepy.” Snap CEO Evan Spiegel tells Tom’s Guide why the new $2,195 Specs look bold and unmistakable on purpose. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">mmSWLcLzHHzW8yYiLcEgiN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/rjasUexY43aCDDxX5TadWo-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 17 Sep 2026 06:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 17 Sep 2026 08:51:25 +0000</updated>
                                                                                                                                            <category><![CDATA[Smart Glasses]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[VR & AR]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/rjasUexY43aCDDxX5TadWo-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Snap Specs (2026)]]></media:description>                                                            <media:text><![CDATA[Snap Specs (2026)]]></media:text>
                                <media:title type="plain"><![CDATA[Snap Specs (2026)]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/rjasUexY43aCDDxX5TadWo-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Most <a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">smart glasses</a> makers treat their technology like something to apologize for (or something to covertly hide), shrinking cameras and batteries until the frames pass for standard Wayfarers. Snap is doing the <strong>exact </strong>opposite.</p><p>From when Specs debuted to <a href="https://www.tomsguide.com/computing/smart-glasses/snap-specs-hands-on-review">trying them on for myself</a>, it’s clear that the bold, thick-framed silhouette has split opinions. But during my exclusive interview, Snap CEO Evan Spiegel made it clear that this aesthetic isn’t just overcoming engineering physics — it’s a philosophical stance.</p><p>“I think a lot of companies have made the mistake of trying to make smart glasses look like normal glasses, which really just ends up being kind of creepy,” Spiegel commented. “People feel like, ‘oh, are you spying on me? Why are you wearing those spy glasses that are disguised as regular glasses?'"</p><h2 id="designer-wearables-you-see-coming">Designer wearables you see coming</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uGb45L4noSqK4rW8nUPY8F" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/uGb45L4noSqK4rW8nUPY8F-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Rather than apologizing, Snap made Specs unapologetically conspicuous. Of course, in terms of whether you like the look, there’s going to be some detractors. But by doing this, making the hardware unmistakable makes visual transparency a norm.</p><p>"So with Specs, you can really see them coming. They've got iridescent lenses, a very distinct style, and hopefully that invites some real conversation,” Spiegel added.</p><p>“Because the thing I think that's so surprising about Specs is that someone might think, 'Oh, are you recording me?' and it's like, 'No, I'm watching a video on YouTube.' You're like, 'What, you're watching a video on YouTube with a pair of see-through glasses?'"</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DuJ3r5hwtSwNo83vkRCuUo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/DuJ3r5hwtSwNo83vkRCuUo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>By going hard on this big, bold aesthetic, Snap’s intention is to reframe those bystander assumptions with an obvious computer on your face, and defuse any tension that may come from wearing them.</p><p>And I gotta be real, it’s refreshing to see. While the look has drawn some chuckles from the team when I showed them (one said I looked like the front of a pickup truck), making it abundantly visually clear — not just with an LED but also with the size and shape of the glasses themselves — is going to be a lot less “pervert glasses,” and more “what do they do?”</p><h2 id="the-engineering-reality-of-ditching-the-tether">The engineering reality of ditching the tether</h2><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="5JQgLWehqG3taJNsL7Ki7" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/5JQgLWehqG3taJNsL7Ki7-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While Spiegel framed the aesthetic as a social design choice, it is equally a compromise dictated by the laws of physics in 2026. Unlike tethered headsets that offload their compute and battery into a pocket puck, Specs house their entire computing architecture directly within the frame.</p><p>“We thought that was important because people don't want to lug around another puck or something like that just to use Specs,” Spiegel stated. “So in terms of real wearability and portability, that was something that was really important to us."</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zxDGweFyzznyGYehG5NwCF" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/zxDGweFyzznyGYehG5NwCF-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>And as you can read during my hands-on time, they have managed to work around some of those physics challenges — effective vapor chambers to combat the heat generated by two Snapdragon chips and keep those temperatures at a comfortable level. After a few bigger, bulkier generations, I had to ask Evan what the “Eureka moment” was that had him realizing now was the time to go to the consumer.</p><p>"I think the reason why this generation of Specs is ready for primetime is that we finally fit all of this extraordinary capability into a lightweight pair of see-through glasses. They're about 130 grams, so they're very wearable,” Spiegel said. “The last developer version weighed like 200 grams, just way too heavy to really be wearable for these sorts of experiences."</p><p>That’s not to say these aren’t still definitely an early-adopter package. There’s a huge $2,195 price tag attached to them, after all. But trying them on myself, it’s clear the comfort has been figured out.</p><h2 id="can-loud-design-win-public-trust">Can loud design win public trust?</h2><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="zQgTWrovURitAZfU6PbWVo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/zQgTWrovURitAZfU6PbWVo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Snap’s refusal — or inability — to build stealth eyewear is a candid acknowledgment of what AR hardware actually requires today. By choosing high-visibility industrial design over covert disguise, Specs are attempting to solve the societal etiquette problem before it starts. They are visibly loud by design so you physically cannot be sneaky.</p><p>However, the real battle ahead won’t just be the whole “stealth glasses are creepy” thing, it will be convincing consumers to wear a chunky, two-thousand-dollar face computer out in the real world.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/snapchat-launches-its-own-ai-and-says-snap-intelligence-will-anticipate-your-needs">Snapchat launches its own AI — and says Snap Intelligence will 'anticipate your needs'</a></li><li><a href="https://www.tomsguide.com/computing/virtual-reality/pimax-dream-air-review">I’ve played for 100 hours on a VR headset lighter than my iPhone — Pimax Dream Air is an expensive breakthrough</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-benchmarked-the-real-dlss-5-in-nba-2k27-and-the-future-of-photorealistic-graphics-has-one-big-catch">I tested DLSS 5 in NBA 2K27 on a mid-range gaming laptop — it's the future of photorealistic graphics, but there's a catch</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'New type of computer': Snap Specs reveals how its new smart glasses fit into your daily life alongside new AR experiences ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Way back in June of this year, Snap CEO <a href="https://www.tomsguide.com/computing/smart-glasses/snap-specs-are-official-and-theyre-a-bold-mash-up-of-ray-ban-metas-and-apple-vision-pro-with-an-eye-watering-price">Evan Spiegel revealed the company's Specs</a> — a pair of AR glasses that he described as the beginning of a "new era of computing."</p><p>At the time, an official launch date was not released, but now they're here. </p><p>As a reminder, Specs are something of a mashup between Meta's Ray-Ban AI glasses and a VR headset. They feature two Snapdragon processors built into the glasses. They do come with a hefty starting price of $2,195.</p><p>“We’ve seen these different shifts in computing happen, and we see a shift is coming,” Russell Patton product manager for Specs at Snap told <a href="https://www.tomsguide.com/computing/smart-glasses/really-pushing-the-frontier-of-what-technology-can-deliver-snap-specs-product-head-reveals-the-challenges-in-designing-the-new-ar-glasses">Tom's Guide in an interview</a>. “Going forward, it’s going to be that shift from phones to glasses, and I think it’s not just taking the apps that are on our phones and putting them into glasses.”</p><h2 id="specs-quot-specs-quot">Specs "specs"</h2><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="iCzXsEkVBnMkLJxXxsHDFn" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/iCzXsEkVBnMkLJxXxsHDFn-1920-80.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: Snap)</span></figcaption></figure><div ><table><tbody><tr><td class="firstcol " ><p><strong>Form factor</strong></p></td><td  ><p>Fully standalone augmented reality glasses</p></td></tr><tr><td class="firstcol " ><p><strong>Build material</strong></p></td><td  ><p>Swiss TR90 polymer</p></td></tr><tr><td class="firstcol " ><p><strong>Sizes & weights</strong></p></td><td  ><p>132 grams (47mm model) and 136 grams (52mm model)</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>Proprietary waveguide displays with 51-degree field of view, support for 16 million colors</p></td></tr><tr><td class="firstcol " ><p><strong>Lenses</strong></p></td><td  ><p>Electrochromic lenses (10-second transition time to tinted) with prescription support</p></td></tr><tr><td class="firstcol " ><p><strong>Processors</strong></p></td><td  ><p>Dual Snapdragon processors (1x computer vision, 1x AR lenses)</p></td></tr><tr><td class="firstcol " ><p><strong>Tracking</strong></p></td><td  ><p>Hand tracking and spatial mapping, 7ms response time</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>4 hours on one charge, up to 20 hours when used with the case</p></td></tr></tbody></table></div><p>Alongside the Specs, Snap also announced a charging case that has cellular connectivity. The company is partnering with Verizon on the cellular connection, meaning you'll need a data plan with Verizon to access the feature.</p><h2 id="what-do-specs-do">What do Specs do</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:480px;"><p class="vanilla-image-block" style="padding-top:54.58%;"><img id="C6fpBjCoH6yg9og3Be8bQ4" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/C6fpBjCoH6yg9og3Be8bQ4-1920-80.gif" mos="" align="middle" fullscreen="" width="480" height="262" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>Like a VR headset, Specs lets you work (and play) in virtual spaces from using shared whiteboards to watching YouTube and shopping in 3D spaces that let you place objects in the real world. Or you can put navigation cues on the displays that map to the world as you explore.</p><p>At the same time, they're akin to AI glasses in that you can take Bluetooth calls, control your music and utilize live translation. </p><p>Snap promoted the glasses as a learning tool with apps built in collaboration with the NBA and WNBA that help you learn how to shoot a basketball, or apps that analyze your golf swing. These features and apps Snap calls Lenses. Other learning experiences include 3D exploration of the solar system or constellations. </p><p>These glasses do have cameras and Snap spokespeople claimed that an LED light will show when the glasses are recording. A burgeoning privacy concern for smart glasses and recording clearly has Snap worried about getting the<a href="https://www.tomsguide.com/ai/less-pervert-y-meta-ai-glasses-will-now-stop-recording-if-you-cover-the-warning-light"> pervert glasses</a> label.</p><p>" SPECS do not use facial recognition to identify people. SPECS do not record the world to understand it, and don't continuously record or save audio, video, or photos," Snap said in a press release.</p><p>And like everything, AI is a big part of what Snap is producing.</p><h2 id="snap-intelligence">Snap Intelligence</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1250px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="pipEeYfBWFxhH6upvL4doX" name="SPECS26_SPECS Intelligence crop" alt="Snap Intelligence AI platform" src="https://cdn.mos.cms.futurecdn.net/pipEeYfBWFxhH6upvL4doX-1920-80.png" mos="" align="middle" fullscreen="" width="1250" height="703" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>Snap OS, which runs the glasses, already features AI. Like most AI promises, its supposed to see what you're looking at, understand the context and help you "in the moment."</p><p>But, Snap also has what it calls an "anticipatory AI service" dubbed Snap Intelligence, which takes that AI makes it accessible across multiple devices from your iPhone and MacBook back to the Specs. It's designed to carry "personal context" across your devices. </p><p>In some cases, it is supposed to anticipate your needs and act without a prompt. Snap promises that security is paramount and Snap personnel can't see your personal information or content. </p><p>You can choose what apps connect to Snap Intelligence like your calendar, email and notes. And it is supposed to ask before it does anything, prompting you to confirm a choice. </p><p>You don't need Specs to try out Snap Intelligence.</p><h2 id="price-and-availability">Price and availability</h2><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="d686Q7GaqVywQHBBnNTJWo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/d686Q7GaqVywQHBBnNTJWo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If the price doesn't scare you away, you can pre-order the Snap Specs today at specs.com for $2,195 with a $200 refundable deposit.</p><p>There is a bundle with the cellular charging case that costs $2,395. To get the cellular, you'll need a Verizon plan that starts at $10 per month for Verizon customers and $20 per month for non-Verizon customers.</p><p>Snap expects to ship the glasses in the US, UK and France starting this fall.</p><p>If you live or are visiting Los Angeles, you can check out the glasses at Westfield Century City mall at a Snap popup starting October 1. We were told that some Verizon locations will have hands-on experiences but not which ones or when.</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/smart-glasses/toms-guide-to-smart-glasses-13-terms-you-need-to-know">Tom's Guide to smart glasses: 13 terms you need to know</a></li><li><a href="https://www.tomsguide.com/computing/smart-glasses/i-tried-the-rayneo-gt-max-and-theyre-easily-the-most-comfortable-ar-glasses-ive-worn-yet">I tried the RayNeo GT Max, and they're easily the most comfortable AR glasses I've worn yet</a></li><li><a href="https://www.tomsguide.com/ai/people-are-using-custom-apps-and-usd30-gadgets-to-hunt-for-smart-glasses-that-may-be-filming-them-heres-how">People are using custom apps and $30 gadgets to hunt for smart glasses that may be filming them—here's how</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/smart-glasses/new-type-of-computer-snap-specs-officially-launch-and-heres-what-these-ar-glasses-can-do</link>
                                                                            <description>
                            <![CDATA[ Snap Specs are finally launching with new details about partnerships and features. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">cHoWn4XY6YyBUJ5HFdetck</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/d686Q7GaqVywQHBBnNTJWo-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 16 Sep 2026 23:40:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smart Glasses]]></category>
                                                    <category><![CDATA[VR & AR]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;br&gt;Send secure tips on Signal: scyo1.55.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/d686Q7GaqVywQHBBnNTJWo-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Snap Specs (2026)]]></media:description>                                                            <media:text><![CDATA[Snap Specs (2026)]]></media:text>
                                <media:title type="plain"><![CDATA[Snap Specs (2026)]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/d686Q7GaqVywQHBBnNTJWo-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Way back in June of this year, Snap CEO <a href="https://www.tomsguide.com/computing/smart-glasses/snap-specs-are-official-and-theyre-a-bold-mash-up-of-ray-ban-metas-and-apple-vision-pro-with-an-eye-watering-price">Evan Spiegel revealed the company's Specs</a> — a pair of AR glasses that he described as the beginning of a "new era of computing."</p><p>At the time, an official launch date was not released, but now they're here. </p><p>As a reminder, Specs are something of a mashup between Meta's Ray-Ban AI glasses and a VR headset. They feature two Snapdragon processors built into the glasses. They do come with a hefty starting price of $2,195.</p><p>“We’ve seen these different shifts in computing happen, and we see a shift is coming,” Russell Patton product manager for Specs at Snap told <a href="https://www.tomsguide.com/computing/smart-glasses/really-pushing-the-frontier-of-what-technology-can-deliver-snap-specs-product-head-reveals-the-challenges-in-designing-the-new-ar-glasses">Tom's Guide in an interview</a>. “Going forward, it’s going to be that shift from phones to glasses, and I think it’s not just taking the apps that are on our phones and putting them into glasses.”</p><h2 id="specs-quot-specs-quot">Specs "specs"</h2><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="iCzXsEkVBnMkLJxXxsHDFn" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/iCzXsEkVBnMkLJxXxsHDFn-1920-80.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: Snap)</span></figcaption></figure><div ><table><tbody><tr><td class="firstcol " ><p><strong>Form factor</strong></p></td><td  ><p>Fully standalone augmented reality glasses</p></td></tr><tr><td class="firstcol " ><p><strong>Build material</strong></p></td><td  ><p>Swiss TR90 polymer</p></td></tr><tr><td class="firstcol " ><p><strong>Sizes & weights</strong></p></td><td  ><p>132 grams (47mm model) and 136 grams (52mm model)</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>Proprietary waveguide displays with 51-degree field of view, support for 16 million colors</p></td></tr><tr><td class="firstcol " ><p><strong>Lenses</strong></p></td><td  ><p>Electrochromic lenses (10-second transition time to tinted) with prescription support</p></td></tr><tr><td class="firstcol " ><p><strong>Processors</strong></p></td><td  ><p>Dual Snapdragon processors (1x computer vision, 1x AR lenses)</p></td></tr><tr><td class="firstcol " ><p><strong>Tracking</strong></p></td><td  ><p>Hand tracking and spatial mapping, 7ms response time</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>4 hours on one charge, up to 20 hours when used with the case</p></td></tr></tbody></table></div><p>Alongside the Specs, Snap also announced a charging case that has cellular connectivity. The company is partnering with Verizon on the cellular connection, meaning you'll need a data plan with Verizon to access the feature.</p><h2 id="what-do-specs-do">What do Specs do</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:480px;"><p class="vanilla-image-block" style="padding-top:54.58%;"><img id="C6fpBjCoH6yg9og3Be8bQ4" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/C6fpBjCoH6yg9og3Be8bQ4-1920-80.gif" mos="" align="middle" fullscreen="" width="480" height="262" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>Like a VR headset, Specs lets you work (and play) in virtual spaces from using shared whiteboards to watching YouTube and shopping in 3D spaces that let you place objects in the real world. Or you can put navigation cues on the displays that map to the world as you explore.</p><p>At the same time, they're akin to AI glasses in that you can take Bluetooth calls, control your music and utilize live translation. </p><p>Snap promoted the glasses as a learning tool with apps built in collaboration with the NBA and WNBA that help you learn how to shoot a basketball, or apps that analyze your golf swing. These features and apps Snap calls Lenses. Other learning experiences include 3D exploration of the solar system or constellations. </p><p>These glasses do have cameras and Snap spokespeople claimed that an LED light will show when the glasses are recording. A burgeoning privacy concern for smart glasses and recording clearly has Snap worried about getting the<a href="https://www.tomsguide.com/ai/less-pervert-y-meta-ai-glasses-will-now-stop-recording-if-you-cover-the-warning-light"> pervert glasses</a> label.</p><p>" SPECS do not use facial recognition to identify people. SPECS do not record the world to understand it, and don't continuously record or save audio, video, or photos," Snap said in a press release.</p><p>And like everything, AI is a big part of what Snap is producing.</p><h2 id="snap-intelligence">Snap Intelligence</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1250px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="pipEeYfBWFxhH6upvL4doX" name="SPECS26_SPECS Intelligence crop" alt="Snap Intelligence AI platform" src="https://cdn.mos.cms.futurecdn.net/pipEeYfBWFxhH6upvL4doX-1920-80.png" mos="" align="middle" fullscreen="" width="1250" height="703" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>Snap OS, which runs the glasses, already features AI. Like most AI promises, its supposed to see what you're looking at, understand the context and help you "in the moment."</p><p>But, Snap also has what it calls an "anticipatory AI service" dubbed Snap Intelligence, which takes that AI makes it accessible across multiple devices from your iPhone and MacBook back to the Specs. It's designed to carry "personal context" across your devices. </p><p>In some cases, it is supposed to anticipate your needs and act without a prompt. Snap promises that security is paramount and Snap personnel can't see your personal information or content. </p><p>You can choose what apps connect to Snap Intelligence like your calendar, email and notes. And it is supposed to ask before it does anything, prompting you to confirm a choice. </p><p>You don't need Specs to try out Snap Intelligence.</p><h2 id="price-and-availability">Price and availability</h2><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="d686Q7GaqVywQHBBnNTJWo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/d686Q7GaqVywQHBBnNTJWo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If the price doesn't scare you away, you can pre-order the Snap Specs today at specs.com for $2,195 with a $200 refundable deposit.</p><p>There is a bundle with the cellular charging case that costs $2,395. To get the cellular, you'll need a Verizon plan that starts at $10 per month for Verizon customers and $20 per month for non-Verizon customers.</p><p>Snap expects to ship the glasses in the US, UK and France starting this fall.</p><p>If you live or are visiting Los Angeles, you can check out the glasses at Westfield Century City mall at a Snap popup starting October 1. We were told that some Verizon locations will have hands-on experiences but not which ones or when.</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/smart-glasses/toms-guide-to-smart-glasses-13-terms-you-need-to-know">Tom's Guide to smart glasses: 13 terms you need to know</a></li><li><a href="https://www.tomsguide.com/computing/smart-glasses/i-tried-the-rayneo-gt-max-and-theyre-easily-the-most-comfortable-ar-glasses-ive-worn-yet">I tried the RayNeo GT Max, and they're easily the most comfortable AR glasses I've worn yet</a></li><li><a href="https://www.tomsguide.com/ai/people-are-using-custom-apps-and-usd30-gadgets-to-hunt-for-smart-glasses-that-may-be-filming-them-heres-how">People are using custom apps and $30 gadgets to hunt for smart glasses that may be filming them—here's how</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I wore the new Snap Specs — the design is wildly polarizing, but the instinctual computing is a genuine breakthrough ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Let’s address the elephant on your face: <a href="https://www.specs.com/smart-glasses/specs-27" target="_blank" rel="nofollow">Snap’s new $2,195 Specs</a> have an unmistakable, thick-framed aesthetic that will inevitably divide opinion. I can hear you through your screen — sharing your take on how I look wearing them — when I saw them at AWE this year, I braced myself for an awkward feeling.</p><p>But then, I put them on and the reality check hit me like a brick in the courtyard of Snap’s Santa Monica HQ: they are shockingly wearable. The weight balance across the bridge and temples avoids the front-heavy lever effect that plagues tethered setups, which makes them much more comfortable for the extended session I had than their bold silhouette suggests.</p><p>And while the tech world has been obsessed over either making simple AI glasses or bulky mixed-reality ski goggles, Snap has quietly built the perfect middle ground — a fully standalone spatial computer with zero cables and zero pocket pucks that actually works in the real world.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7686286448235924749" data-video-id="7686286448235924749" 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="♬ Basement Loop - Justine Cargo" href="https://www.tiktok.com/music/Basement-Loop-7660942236637267978">♬ Basement Loop - Justine Cargo</a></section>                    </blockquote></div>                <h2 id="snap-specs-specs">Snap Specs: Specs</h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Feature</strong></p></td><td  ><p><strong>Snap Specs (2026 Consumer Edition)</strong></p></td><td  ><p><strong>Meta Ray-Ban Display</strong></p></td><td  ><p><strong>Apple Vision Pro</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Form Factor</strong></p></td><td  ><p>Standalone AR Glasses (No Puck)</p></td><td  ><p>Audio/Camera Smart Frames</p></td><td  ><p>Spatial Headset (Tethered Battery)</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>Dual Binocular Waveguide (Electrochromic)</p></td><td  ><p>single 600x600p  full-color display</p></td><td  ><p>Dual 4K Micro-OLED</p></td></tr><tr><td class="firstcol " ><p><strong>Interaction</strong></p></td><td  ><p>Instinctual Palm UI & Hand Tracking</p></td><td  ><p>Voice Control / Touchpad/Hand tracking</p></td><td  ><p>Eye Tracking & Pinch Gestures</p></td></tr><tr><td class="firstcol " ><p><strong>Thermal System</strong></p></td><td  ><p>Dual Vapor Chambers in Temples</p></td><td  ><p>Passive Dissipation</p></td><td  ><p>Active Fan & Dual Heat Exchangers</p></td></tr><tr><td class="firstcol " ><p><strong>Battery Life</strong></p></td><td  ><p>~4 Hours Active AR (20 Hours with Cellular Case)</p></td><td  ><p>6 Hours Mixed use</p></td><td  ><p>~2–2.5 Hours External Pack</p></td></tr><tr><td class="firstcol " ><p><strong>Starting Price</strong></p></td><td  ><p>$2,195 (Carrier Financing Avail.)</p></td><td  ><p>$799</p></td><td  ><p>$3,499</p></td></tr></tbody></table></div><h2 id="pure-standalone-freedom">Pure standalone freedom</h2><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="kuBMZpjE2hCUwNETjKfnXo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/kuBMZpjE2hCUwNETjKfnXo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>No wires, no tether, no pocket pack. Every single bit of compute, sensor fusion and battery architecture is housed directly inside the frame. And through that lens, their size becomes more understandable, but whether this look is your cup of tea or not, one thing I can confirm is they’re <em>surprisingly </em>comfortable to wear.</p><p>I had them on for roughly an hour, and I didn’t feel any serious downward pressure on the tops of my ears. As the guy who took <em>that </em>side profile picture of CEO Evan Spiegel wearing them at AWE (you know the one), I was pleasantly shocked at this weight distribution.</p><p>On top of that, the dual vapor chambers do a great job at keeping things cool on your temples — with only a small bit of warming up when you really put them under pressure. And those two-step electrochromic lenses do a great job of blocking out the LA sun. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="d686Q7GaqVywQHBBnNTJWo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/d686Q7GaqVywQHBBnNTJWo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>One thing worth noting about those lenses with the built-in waveguide displays is that they do add a little chromatic aberration to the real world around you. Nothing too dramatic, but the iridescence does have a definitely noticeable effect on visibility.</p><p>And of course, the design itself is certainly polarizing. Speaking to Spiegel, this is by design to make them stand out, and go against the grain of making glasses that blend in a little <em>too</em> well (sparking the privacy concerns we’ve all seen around the <a href="https://www.tomsguide.com/computing/smart-glasses/ray-ban-meta-gen-2-review">Ray-Ban Metas</a>).</p><p>In that vein, I kinda get it. Everybody will know you’re wearing smart glasses, but as the most visible piece of wearable tech on you, I can appreciate these will split opinions and cause some insecurity wearing them in public. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rjasUexY43aCDDxX5TadWo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/rjasUexY43aCDDxX5TadWo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Opinions in the office ranged from appreciating that brutalist aesthetic to comparisons made to the 3D glasses you got at the cinema. But I’d love to know what you think!</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xm8AEO"></div>                            </div>                            <script src="https://kwizly.com/embed/Xm8AEO.js" async></script><h2 id="the-palmtastic-ui">The “palmtastic” UI</h2><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="hAXAktQKEtuKUmzLYjdrA" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/hAXAktQKEtuKUmzLYjdrA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Yes, Snap has a buzz word for this — calling it “Instinctual computing” — tech that adapts to you, replaces traditional input devices with gestures and voice commands, and keeps people present and connected in their surroundings.</p><p>Rather than trying to teach a new dynamic of gesture control, Specs go the instinctual route and let you reach out and touch things, with opening your palm summoning the quick settings right on your skin.</p><p>I won’t delve too far into this, as you’ve already seen <a href="https://www.tomsguide.com/computing/smart-glasses/i-just-went-eyes-on-with-snap-specs-theyre-a-lot-more-stylish-than-i-feared-at-first">my impressions of Specs OS</a> over the last 12 months leading up to this debut moment for consumers. But the extra layers of polish to get this ready for consumer launch really show in the UI, the rigid tracking of objects (even in travel mode) and the Specs Intelligence AI taking action rapidly on my requests.</p><h2 id="daily-utility-over-gimmicks">Daily utility over gimmicks</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:480px;"><p class="vanilla-image-block" style="padding-top:55.00%;"><img id="6dnfZHuSihBuj5EFwRW4h4" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/6dnfZHuSihBuj5EFwRW4h4-1920-80.gif" mos="" align="middle" fullscreen="" width="480" height="264" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>And that’s because the main thing I do want to focus on here is the just what these many hundreds of thousands of Lenses unlock. It creates a massive ecosystem that can be immensely helpful and impactful.</p><p>The utility can come in the form of live-captioning across 60 languages that’s overlaid directly onto speakers in front of you — turning foreign travel into a foreign language movie with subtitles. </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:480px;"><p class="vanilla-image-block" style="padding-top:54.58%;"><img id="fRWB493yS978oAJKzsFqt3" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/fRWB493yS978oAJKzsFqt3-1920-80.gif" mos="" align="middle" fullscreen="" width="480" height="262" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>You can also measure things in the real world with your hands, TripAdvisor integration gives you spatial reviews, landmark histories and currency conversions on storefronts, and connecting a bluetooth keyboard can take you into a multi-screen UI to get work done.</p><p>And then there’s the entertainment and sports side of things. As you’ve probably already seen, Snap’s partnered up with the HBO remake of "Harry Potter" to make an AR experience that is almost pitch perfect for my millennial-coded self. I put on the sorting hat with my hands and was put into Gryffindor (apologies to the reviewer before me who got put in Hufflepuff).</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:480px;"><p class="vanilla-image-block" style="padding-top:54.58%;"><img id="C6fpBjCoH6yg9og3Be8bQ4" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/C6fpBjCoH6yg9og3Be8bQ4-1920-80.gif" mos="" align="middle" fullscreen="" width="480" height="262" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>Then for sports, being taught proper form for my golf swings, running soccer dribbling drills and practicing my basketball jumpshot revealed just how much of a comfortable revolution this is for those who use VR headsets for fitness.</p><p>And of course, if you remember all those visionaries from the <a href="https://www.tomsguide.com/computing/smart-glasses/heres-what-the-snap-specs-look-like-as-modelled-by-jack-harlow-imogen-heap-and-more">Specs global campaign</a> (Jack Harlow, Imogen Heap, Hoyeon, etc), they all have their own purpose-built lenses based on their own interests.</p><p>For example, Hoyeon’s is a full blown meditation garden to bring guided breathing into AR, Jimmy Butler’s love for dominoes comes to life in a connected AR experience between two Specs owners playing the game, and Imogen Heap’s Sound Space translates your body and your natural physical movements into music.</p><p>All-in-all, this is turning out to be a vast, but also curated suite of tools that will make these feel like a really useful addition to pop on and use. But hopefully the ambient part of instinctual computing remains — the last thing you want to see is the use of those screens and AR start to overtake the real-life surroundings too drastically.</p><h2 id="the-real-breakthrough">The real breakthrough</h2><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="zQgTWrovURitAZfU6PbWVo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/zQgTWrovURitAZfU6PbWVo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>One thing that I haven’t fully tested yet is going to be the glue between all your personal context called Specs Intelligence. Essentially this is a proactive move beyond a simple chatbot into an anticipatory engine that works across Mac, iPhone and Specs.</p><p>It works by building an architecture of your personal context:</p><ul><li><strong>Portrait: </strong>Getting a deep understanding of your routines, contacts and working patterns.</li><li><strong>Corners: </strong>Partitioning your life into work, family, fitness and travel.</li><li><strong>Goals: </strong>Keeping long-term objectives at the center of it all as a filter to the noise — keeping you locked in.</li></ul><p>And the idea is to manifest proactive actions in real life: gate changes and terminal directions as you hop out of an airport taxi, pulling up meeting notes before you sit down, even cancelling unused subscriptions — all while staying within strict on-device privacy guardrails.</p><p>And Snap is committing to not use any of this data to train generative AI or run ads. I’m definitely <em>very </em>intrigued to see how effective this is without becoming a nudge monster (like your Apple Watch stand notifications) and how seamless it can be taking your context between devices.</p><h2 id="my-verdict-an-expensive-paradigm-shift">My verdict: an expensive paradigm shift</h2><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="5JQgLWehqG3taJNsL7Ki7" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/5JQgLWehqG3taJNsL7Ki7-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Now I have to acknowledge the friction points that are definitely here. The battery isn’t going to last so long under full AR load (the claim is four hours), at $2,195 it’s a <em>very</em> expensive first-gen device (though with that cellular case and partnerships with Verizon in U.S. and EE in U.K., that cost can be spread out as part of a data plan). </p><p>And then, there’s definitely going to be the social hurdle of wearing bold, geometric frames in everyday coffee shops.</p><p>But I can’t deny that they are damn cool to use. Snap has accomplished what Apple and Meta are still striving for: a self-contained, truly standalone pair of AR glasses that deliver genuine everyday utility. And that utility comes combined with robust developer buy-in, and an anticipatory AI layer that doesn’t feel like a toy.</p><p>It might look divisive, but the experience is the closest thing to real spatial computing that I have seen yet.</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/virtual-reality/pimax-dream-air-review">I’ve played for 100 hours on a VR headset lighter than my iPhone — Pimax Dream Air is an expensive breakthrough</a></li><li><a href="https://www.tomsguide.com/computing/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions">Nvidia’s RTX Spark N1X launches this October: My price predictions for the potential MacBook Pro killer</a></li><li><a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">I’ve worn smart glasses for over 5 years — here’s the best AR and AI glasses in 2026</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/smart-glasses/snap-specs-hands-on-review</link>
                                                                            <description>
                            <![CDATA[ I tested the new standalone Snap Specs in Santa Monica. Divisive design and price aside, here is why its palm-based instinctual AR computing is a triumph. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">DspbJZxfBZRVpZETqNjRLe</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ezuDARtPN2QSUU852P94Qo-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 16 Sep 2026 23:40:00 +0000</pubDate>                                                                                                                                <updated>Thu, 17 Sep 2026 08:24:47 +0000</updated>
                                                                                                                                            <category><![CDATA[Smart Glasses]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[VR & AR]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ezuDARtPN2QSUU852P94Qo-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Snap Specs (2026)]]></media:description>                                                            <media:text><![CDATA[Snap Specs (2026)]]></media:text>
                                <media:title type="plain"><![CDATA[Snap Specs (2026)]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ezuDARtPN2QSUU852P94Qo-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Let’s address the elephant on your face: <a href="https://www.specs.com/smart-glasses/specs-27" target="_blank" rel="nofollow">Snap’s new $2,195 Specs</a> have an unmistakable, thick-framed aesthetic that will inevitably divide opinion. I can hear you through your screen — sharing your take on how I look wearing them — when I saw them at AWE this year, I braced myself for an awkward feeling.</p><p>But then, I put them on and the reality check hit me like a brick in the courtyard of Snap’s Santa Monica HQ: they are shockingly wearable. The weight balance across the bridge and temples avoids the front-heavy lever effect that plagues tethered setups, which makes them much more comfortable for the extended session I had than their bold silhouette suggests.</p><p>And while the tech world has been obsessed over either making simple AI glasses or bulky mixed-reality ski goggles, Snap has quietly built the perfect middle ground — a fully standalone spatial computer with zero cables and zero pocket pucks that actually works in the real world.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7686286448235924749" data-video-id="7686286448235924749" 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="♬ Basement Loop - Justine Cargo" href="https://www.tiktok.com/music/Basement-Loop-7660942236637267978">♬ Basement Loop - Justine Cargo</a></section>                    </blockquote></div>                <h2 id="snap-specs-specs">Snap Specs: Specs</h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Feature</strong></p></td><td  ><p><strong>Snap Specs (2026 Consumer Edition)</strong></p></td><td  ><p><strong>Meta Ray-Ban Display</strong></p></td><td  ><p><strong>Apple Vision Pro</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Form Factor</strong></p></td><td  ><p>Standalone AR Glasses (No Puck)</p></td><td  ><p>Audio/Camera Smart Frames</p></td><td  ><p>Spatial Headset (Tethered Battery)</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>Dual Binocular Waveguide (Electrochromic)</p></td><td  ><p>single 600x600p  full-color display</p></td><td  ><p>Dual 4K Micro-OLED</p></td></tr><tr><td class="firstcol " ><p><strong>Interaction</strong></p></td><td  ><p>Instinctual Palm UI & Hand Tracking</p></td><td  ><p>Voice Control / Touchpad/Hand tracking</p></td><td  ><p>Eye Tracking & Pinch Gestures</p></td></tr><tr><td class="firstcol " ><p><strong>Thermal System</strong></p></td><td  ><p>Dual Vapor Chambers in Temples</p></td><td  ><p>Passive Dissipation</p></td><td  ><p>Active Fan & Dual Heat Exchangers</p></td></tr><tr><td class="firstcol " ><p><strong>Battery Life</strong></p></td><td  ><p>~4 Hours Active AR (20 Hours with Cellular Case)</p></td><td  ><p>6 Hours Mixed use</p></td><td  ><p>~2–2.5 Hours External Pack</p></td></tr><tr><td class="firstcol " ><p><strong>Starting Price</strong></p></td><td  ><p>$2,195 (Carrier Financing Avail.)</p></td><td  ><p>$799</p></td><td  ><p>$3,499</p></td></tr></tbody></table></div><h2 id="pure-standalone-freedom">Pure standalone freedom</h2><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="kuBMZpjE2hCUwNETjKfnXo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/kuBMZpjE2hCUwNETjKfnXo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>No wires, no tether, no pocket pack. Every single bit of compute, sensor fusion and battery architecture is housed directly inside the frame. And through that lens, their size becomes more understandable, but whether this look is your cup of tea or not, one thing I can confirm is they’re <em>surprisingly </em>comfortable to wear.</p><p>I had them on for roughly an hour, and I didn’t feel any serious downward pressure on the tops of my ears. As the guy who took <em>that </em>side profile picture of CEO Evan Spiegel wearing them at AWE (you know the one), I was pleasantly shocked at this weight distribution.</p><p>On top of that, the dual vapor chambers do a great job at keeping things cool on your temples — with only a small bit of warming up when you really put them under pressure. And those two-step electrochromic lenses do a great job of blocking out the LA sun. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="d686Q7GaqVywQHBBnNTJWo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/d686Q7GaqVywQHBBnNTJWo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>One thing worth noting about those lenses with the built-in waveguide displays is that they do add a little chromatic aberration to the real world around you. Nothing too dramatic, but the iridescence does have a definitely noticeable effect on visibility.</p><p>And of course, the design itself is certainly polarizing. Speaking to Spiegel, this is by design to make them stand out, and go against the grain of making glasses that blend in a little <em>too</em> well (sparking the privacy concerns we’ve all seen around the <a href="https://www.tomsguide.com/computing/smart-glasses/ray-ban-meta-gen-2-review">Ray-Ban Metas</a>).</p><p>In that vein, I kinda get it. Everybody will know you’re wearing smart glasses, but as the most visible piece of wearable tech on you, I can appreciate these will split opinions and cause some insecurity wearing them in public. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rjasUexY43aCDDxX5TadWo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/rjasUexY43aCDDxX5TadWo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Opinions in the office ranged from appreciating that brutalist aesthetic to comparisons made to the 3D glasses you got at the cinema. But I’d love to know what you think!</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xm8AEO"></div>                            </div>                            <script src="https://kwizly.com/embed/Xm8AEO.js" async></script><h2 id="the-palmtastic-ui">The “palmtastic” UI</h2><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="hAXAktQKEtuKUmzLYjdrA" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/hAXAktQKEtuKUmzLYjdrA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Yes, Snap has a buzz word for this — calling it “Instinctual computing” — tech that adapts to you, replaces traditional input devices with gestures and voice commands, and keeps people present and connected in their surroundings.</p><p>Rather than trying to teach a new dynamic of gesture control, Specs go the instinctual route and let you reach out and touch things, with opening your palm summoning the quick settings right on your skin.</p><p>I won’t delve too far into this, as you’ve already seen <a href="https://www.tomsguide.com/computing/smart-glasses/i-just-went-eyes-on-with-snap-specs-theyre-a-lot-more-stylish-than-i-feared-at-first">my impressions of Specs OS</a> over the last 12 months leading up to this debut moment for consumers. But the extra layers of polish to get this ready for consumer launch really show in the UI, the rigid tracking of objects (even in travel mode) and the Specs Intelligence AI taking action rapidly on my requests.</p><h2 id="daily-utility-over-gimmicks">Daily utility over gimmicks</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:480px;"><p class="vanilla-image-block" style="padding-top:55.00%;"><img id="6dnfZHuSihBuj5EFwRW4h4" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/6dnfZHuSihBuj5EFwRW4h4-1920-80.gif" mos="" align="middle" fullscreen="" width="480" height="264" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>And that’s because the main thing I do want to focus on here is the just what these many hundreds of thousands of Lenses unlock. It creates a massive ecosystem that can be immensely helpful and impactful.</p><p>The utility can come in the form of live-captioning across 60 languages that’s overlaid directly onto speakers in front of you — turning foreign travel into a foreign language movie with subtitles. </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:480px;"><p class="vanilla-image-block" style="padding-top:54.58%;"><img id="fRWB493yS978oAJKzsFqt3" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/fRWB493yS978oAJKzsFqt3-1920-80.gif" mos="" align="middle" fullscreen="" width="480" height="262" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>You can also measure things in the real world with your hands, TripAdvisor integration gives you spatial reviews, landmark histories and currency conversions on storefronts, and connecting a bluetooth keyboard can take you into a multi-screen UI to get work done.</p><p>And then there’s the entertainment and sports side of things. As you’ve probably already seen, Snap’s partnered up with the HBO remake of "Harry Potter" to make an AR experience that is almost pitch perfect for my millennial-coded self. I put on the sorting hat with my hands and was put into Gryffindor (apologies to the reviewer before me who got put in Hufflepuff).</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:480px;"><p class="vanilla-image-block" style="padding-top:54.58%;"><img id="C6fpBjCoH6yg9og3Be8bQ4" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/C6fpBjCoH6yg9og3Be8bQ4-1920-80.gif" mos="" align="middle" fullscreen="" width="480" height="262" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>Then for sports, being taught proper form for my golf swings, running soccer dribbling drills and practicing my basketball jumpshot revealed just how much of a comfortable revolution this is for those who use VR headsets for fitness.</p><p>And of course, if you remember all those visionaries from the <a href="https://www.tomsguide.com/computing/smart-glasses/heres-what-the-snap-specs-look-like-as-modelled-by-jack-harlow-imogen-heap-and-more">Specs global campaign</a> (Jack Harlow, Imogen Heap, Hoyeon, etc), they all have their own purpose-built lenses based on their own interests.</p><p>For example, Hoyeon’s is a full blown meditation garden to bring guided breathing into AR, Jimmy Butler’s love for dominoes comes to life in a connected AR experience between two Specs owners playing the game, and Imogen Heap’s Sound Space translates your body and your natural physical movements into music.</p><p>All-in-all, this is turning out to be a vast, but also curated suite of tools that will make these feel like a really useful addition to pop on and use. But hopefully the ambient part of instinctual computing remains — the last thing you want to see is the use of those screens and AR start to overtake the real-life surroundings too drastically.</p><h2 id="the-real-breakthrough">The real breakthrough</h2><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="zQgTWrovURitAZfU6PbWVo" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/zQgTWrovURitAZfU6PbWVo-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>One thing that I haven’t fully tested yet is going to be the glue between all your personal context called Specs Intelligence. Essentially this is a proactive move beyond a simple chatbot into an anticipatory engine that works across Mac, iPhone and Specs.</p><p>It works by building an architecture of your personal context:</p><ul><li><strong>Portrait: </strong>Getting a deep understanding of your routines, contacts and working patterns.</li><li><strong>Corners: </strong>Partitioning your life into work, family, fitness and travel.</li><li><strong>Goals: </strong>Keeping long-term objectives at the center of it all as a filter to the noise — keeping you locked in.</li></ul><p>And the idea is to manifest proactive actions in real life: gate changes and terminal directions as you hop out of an airport taxi, pulling up meeting notes before you sit down, even cancelling unused subscriptions — all while staying within strict on-device privacy guardrails.</p><p>And Snap is committing to not use any of this data to train generative AI or run ads. I’m definitely <em>very </em>intrigued to see how effective this is without becoming a nudge monster (like your Apple Watch stand notifications) and how seamless it can be taking your context between devices.</p><h2 id="my-verdict-an-expensive-paradigm-shift">My verdict: an expensive paradigm shift</h2><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="5JQgLWehqG3taJNsL7Ki7" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/5JQgLWehqG3taJNsL7Ki7-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Now I have to acknowledge the friction points that are definitely here. The battery isn’t going to last so long under full AR load (the claim is four hours), at $2,195 it’s a <em>very</em> expensive first-gen device (though with that cellular case and partnerships with Verizon in U.S. and EE in U.K., that cost can be spread out as part of a data plan). </p><p>And then, there’s definitely going to be the social hurdle of wearing bold, geometric frames in everyday coffee shops.</p><p>But I can’t deny that they are damn cool to use. Snap has accomplished what Apple and Meta are still striving for: a self-contained, truly standalone pair of AR glasses that deliver genuine everyday utility. And that utility comes combined with robust developer buy-in, and an anticipatory AI layer that doesn’t feel like a toy.</p><p>It might look divisive, but the experience is the closest thing to real spatial computing that I have seen yet.</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/virtual-reality/pimax-dream-air-review">I’ve played for 100 hours on a VR headset lighter than my iPhone — Pimax Dream Air is an expensive breakthrough</a></li><li><a href="https://www.tomsguide.com/computing/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions">Nvidia’s RTX Spark N1X launches this October: My price predictions for the potential MacBook Pro killer</a></li><li><a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">I’ve worn smart glasses for over 5 years — here’s the best AR and AI glasses in 2026</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Snap Specs Launch LIVE: Updates as CEO Evan Spiegel shares more at the keynote ]]></title>
                                                                                                <dc:content><![CDATA[ <div class="live-content"><p>Snap officially <a href="https://www.tomsguide.com/computing/smart-glasses/really-pushing-the-frontier-of-what-technology-can-deliver-snap-specs-product-head-reveals-the-challenges-in-designing-the-new-ar-glasses">unveiled its Specs</a> AR glasses at AWE 2026 in June, but the official launch was delayed until now. "It’s going to be that shift from phones to glasses," Snap said at the time.</p><p>Today, Snap is holding an official launch event with even more to share about its chunky smart glasses. </p><p>We expect to learn more details about the glasses alongside new Lenses, features and more!</p><p>Stay with Tom's Guide as we attend Snap's event and go hands on with the Specs.</p><p>Here's the latest news:</p><ul><li><a href="https://www.tomsguide.com/computing/smart-glasses/snap-specs-hands-on-review"><strong>I wore the new Snap Specs — the design is wildly polarizing, but the instinctual computing is a genuine breakthrough</strong></a></li><li><a href="https://www.tomsguide.com/computing/smart-glasses/new-type-of-computer-snap-specs-officially-launch-and-heres-what-these-ar-glasses-can-do"><strong>'New type of computer': Snap Specs reveals how its new smart glasses fit into your daily life alongside new AR experiences</strong></a></li><li><a href="https://www.tomsguide.com/ai/snapchat-launches-its-own-ai-and-says-snap-intelligence-will-anticipate-your-needs"><strong>Snapchat launches its own AI — and says Snap Intelligence will 'anticipate your needs'</strong></a><strong></strong></li></ul><h2 id="how-to-watch">How to watch</h2><p>You can follow along at the Experience Specs website where there is a video player.</p><p>Check it out <a href="https://experience.snap.com/specs-launch-livestream" target="_blank">here</a>.</p></div><div class="live-content"><time datetime="2026-09-16T22:30:49+00:00">September 16, 2026 – 6:30 PM</time><h2 id="can-specs-break-through">Can Specs break through?</h2><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="bgk3JYKAvMvGJBXJPxXupf" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/bgk3JYKAvMvGJBXJPxXupf-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Smart glasses have cooled this year with global shipments only rising 35% in 2026 compared to a meteoric 130% increase tracked in Q1 according to IDC. </p><p>But even outside of cooling shipments, the elephant in the room is Meta, which IDC research shows claims 70% of the smart glasses market with its Ray-Ban Meta audio glasses. RayNeo is a distant second at 3.6% of the market.</p><p>That said, a wave of new devices, including the Specs are set to launch this fall. And Meta has its own Connect event next week. IDC believes this will be enough to drive growth and excitement despite concerns surrounding privacy and a dulling of innovation as companies adopt similar business models.</p></div><div class="live-content"><time datetime="2026-09-16T22:32:40+00:00">September 16, 2026 – 6:32 PM</time><h2 id="a-delayed-launch">A delayed launch</h2><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="zNU2z4trydjGTd8uvnypvG" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/zNU2z4trydjGTd8uvnypvG-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Snap officially revealed the Specs <a href="https://www.tomsguide.com/computing/smart-glasses/snap-specs-are-official-and-theyre-a-bold-mash-up-of-ray-ban-metas-and-apple-vision-pro-with-an-eye-watering-price"><u>during AWE 2026</u></a> back in June, promising a nebulous fall release date. </p><p>Today’s launch finally makes the Specs a reality, even if the actual ship date is still unknown. Hopefully, CEO Evan Spiegel announces dates today</p></div><div class="live-content"><time datetime="2026-09-16T22:35:35+00:00">September 16, 2026 – 6:35 PM</time><h2 id="snap-believes-specs-will-be-a-major-shift">Snap believes Specs will be a major shift</h2><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="AStxUqZoTX9GTJyXyDxysf" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/AStxUqZoTX9GTJyXyDxysf-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>“We’ve seen these different shifts in computing happen, and we see a shift is coming,” Russell Patton, product manager for Specs at Snap <a href="https://www.tomsguide.com/computing/smart-glasses/really-pushing-the-frontier-of-what-technology-can-deliver-snap-specs-product-head-reveals-the-challenges-in-designing-the-new-ar-glasses"><u>told Tom’s Guide in an interview</u></a>. “Going forward, it’s going to be that shift from phones to glasses, and I think it’s not just taking the apps that are on our phones and putting them into glasses.” </p><p>In June, Snap highlighted the truly spatial content that Specs is capable of producing. It’s visual AI that actually teaches.</p></div><div class="live-content"><time datetime="2026-09-16T22:39:20+00:00">September 16, 2026 – 6:39 PM</time><h2 id="will-people-wear-specs">Will people wear Specs?</h2><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="wBdo5JowcbrG3UBKEJ7cun" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/wBdo5JowcbrG3UBKEJ7cun-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Compared to the older developer Specs, the official consumer design is svelte, but versus literally any other glasses these things are chunky and thick.</p><p>After some hands-on time, they’re <a href="https://www.tomsguide.com/computing/smart-glasses/i-just-went-eyes-on-with-snap-specs-theyre-a-lot-more-stylish-than-i-feared-at-first"><u>more comfortable than you’d think</u></a>, though I’ve seen ears get squished by the giant arms. </p><p>The glasses are a true breakthrough in AR and wearable tech. The question is whether or not this design will be off-putting to people or if customers are actually willing to try them out.</p></div><div class="live-content"><time datetime="2026-09-16T22:40:06+00:00">September 16, 2026 – 6:40 PM</time><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="dxtWa5Ws3Tim8z5FuSCawF" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/dxtWa5Ws3Tim8z5FuSCawF-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>We just took our seats at the theater. It's pretty cool design space!</p></div><div class="live-content"><time datetime="2026-09-16T22:45:15+00:00">September 16, 2026 – 6:45 PM</time><h2 id="red-carpet-moment">Red carpet moment</h2><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:133.33%;"><img id="JCd42XhvhW4Rqmk6F4wY7o" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/JCd42XhvhW4Rqmk6F4wY7o-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="2560" 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></div><div class="live-content"><time datetime="2026-09-16T22:50:19+00:00">September 16, 2026 – 6:50 PM</time><h2 id="specs-first-rival">Specs’ first rival</h2><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="GprvEQHJvwNBFHC3uBKze4" name="Snap Specs vs Xreal Aura" alt="Snap Specs vs Xreal Aura" src="https://cdn.mos.cms.futurecdn.net/GprvEQHJvwNBFHC3uBKze4-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Meta may own the smart glasses category but Specs first true rival may be the as-yet-unreleased Xreal Aura glasses. Built in collaboration with Google, the Aura is a pair of  XR glasses that offloads its computing power to an attached puck (or brick about the size of a smartphone). </p><p>It offers similar features to the Specs, including AR apps and tools, gesture controls and AI functionality. However, it also has a larger field of view, a crisper display and some connectivity features that Specs can’t match.</p><p><a href="https://www.tomsguide.com/computing/smart-glasses/snap-specs-vs-xreal-aura"><u>Which one is right for most people</u></a>?</p></div><div class="live-content"><time datetime="2026-09-16T22:55:12+00:00">September 16, 2026 – 6:55 PM</time><h2 id="5-minute-countdown">5 minute countdown</h2><p>Snap's keynote kicks off in 5 minutes. </p><p>As a reminder, keep Tom's Guide in your tabs as we'll have hands-on impressions, analysis and more after the keynote and in the coming days. </p></div><div class="live-content"><time datetime="2026-09-16T23:00:35+00:00">September 16, 2026 – 7:00 PM</time><h2 id="are-you-excited-for-specs">Are you excited for Specs?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kE4tGy59iWdNuntSdK37yR" name="Specs LIST_alt2" alt="Snap Specs AWE 2026 reveal" src="https://cdn.mos.cms.futurecdn.net/kE4tGy59iWdNuntSdK37yR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap / Tom's Guide)</span></figcaption></figure><p>We're still about 10 minutes from show start. </p><p>While we wait, are you excited for Specs or intrigued? Let me know in the comments</p></div><div class="live-content"><time datetime="2026-09-16T23:05:44+00:00">September 16, 2026 – 7:05 PM</time><h2 id="eargate-debunked">Eargate debunked</h2><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2067965120353812972"><p lang="en" dir="ltr">Also not to say that eargate may have been blown out of proportion for the memes, but Evan did reply to it...https://t.co/NXbu7fX5PL<a href="https://twitter.com/cantworkitout/status/2067965120353812972">June 19, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>His ears are just like that.</p></div><div class="live-content"><time datetime="2026-09-16T23:08:15+00:00">September 16, 2026 – 7:08 PM</time><h2 id="and-we-39-re-off">...and we're off</h2><p>An existential trailer starts us off.</p></div><div class="live-content"><time datetime="2026-09-16T23:10:14+00:00">September 16, 2026 – 7:10 PM</time><h2 id="a-treatise-on-mortality">A treatise on mortality?</h2><p>Starting us off with a discussion on souls and what we leave behind or don't. </p></div><div class="live-content"><time datetime="2026-09-16T23:10:29+00:00">September 16, 2026 – 7:10 PM</time><p>Evan Spiegel has taken the stage.</p></div><div class="live-content"><time datetime="2026-09-16T23:11:04+00:00">September 16, 2026 – 7:11 PM</time><p>Spiegel says most of the show will be live demos.</p></div><div class="live-content"><time datetime="2026-09-16T23:12:02+00:00">September 16, 2026 – 7:12 PM</time><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="sRfAHHwtfwycjYAYzDHbX" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/sRfAHHwtfwycjYAYzDHbX-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>"Making people irrelevant is not progress. Computers should make us more important not less.</p></div><div class="live-content"><time datetime="2026-09-16T23:13:17+00:00">September 16, 2026 – 7:13 PM</time><h2 id="quot-instinctual-computing-quot">"Instinctual computing"</h2><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="tZx4VgdoFm6iGNNANvypz3" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/tZx4VgdoFm6iGNNANvypz3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Specs are glasses so they can see what you see, understand the world without recording it, just like you. - Spiegel</p></div><div class="live-content"><time datetime="2026-09-16T23:14:53+00:00">September 16, 2026 – 7:14 PM</time><h2 id="native-ai">Native 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:2560px;"><p class="vanilla-image-block" style="padding-top:53.98%;"><img id="FkSqfQwt4kLkcfEtermKjJ" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/FkSqfQwt4kLkcfEtermKjJ-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="1382" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>Spiegel says Snap built the first native AI for glasses. Built shared experiences as a foundational part of operating system.</p><p>Specs help you do what you want to do in the real world like shooting a basketball or cooking.</p></div><div class="live-content"><time datetime="2026-09-16T23:17:42+00:00">September 16, 2026 – 7:17 PM</time><h2 id="specs-intelligence">Specs Intelligence</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1250px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="pipEeYfBWFxhH6upvL4doX" name="SPECS26_SPECS Intelligence crop" alt="Snap Intelligence AI platform" src="https://cdn.mos.cms.futurecdn.net/pipEeYfBWFxhH6upvL4doX-1920-80.png" mos="" align="middle" fullscreen="" width="1250" height="703" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>Spiegel announces that today is the day that people can finally try Specs. </p><p>Says they're not just AR glasses. "Specs are part of an intelligence system that lives across your Mac and IPhone."</p><p>Announces Spec Intelligence.</p><figure><blockquote class="text-post-media" data-text-post-permalink= data-text-post-version="0" id=.d288932e-b224-11f1-9a1f-8f1737d3b635 style=" background:#FFF; border-width: 1px; border-style: solid; border-color: #00000026; border-radius: 16px; max-width:540px; margin: 1px; min-width:270px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"> <a href= style=" background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%; font-family: -apple-system, BlinkMacSystemFont, sans-serif;" target="_blank"> <div style=" padding: 40px; display: flex; flex-direction: column; align-items: center;"><div style=" display:block; height:32px; width:32px; padding-bottom:20px;"> <svg aria-label="Threads" height="32px" role="img" viewBox="0 0 192 192" width="32px" xmlns="http://www.w3.org/2000/svg"> <path d="M141.537 88.9883C140.71 88.5919 139.87 88.2104 139.019 87.8451C137.537 60.5382 122.616 44.905 97.5619 44.745C97.4484 44.7443 97.3355 44.7443 97.222 44.7443C82.2364 44.7443 69.7731 51.1409 62.102 62.7807L75.881 72.2328C81.6116 63.5383 90.6052 61.6848 97.2286 61.6848C97.3051 61.6848 97.3819 61.6848 97.4576 61.6855C105.707 61.7381 111.932 64.1366 115.961 68.814C118.893 72.2193 120.854 76.925 121.825 82.8638C114.511 81.6207 106.601 81.2385 98.145 81.7233C74.3247 83.0954 59.0111 96.9879 60.0396 116.292C60.5615 126.084 65.4397 134.508 73.775 140.011C80.8224 144.663 89.899 146.938 99.3323 146.423C111.79 145.74 121.563 140.987 128.381 132.296C133.559 125.696 136.834 117.143 138.28 106.366C144.217 109.949 148.617 114.664 151.047 120.332C155.179 129.967 155.42 145.8 142.501 158.708C131.182 170.016 117.576 174.908 97.0135 175.059C74.2042 174.89 56.9538 167.575 45.7381 153.317C35.2355 139.966 29.8077 120.682 29.6052 96C29.8077 71.3178 35.2355 52.0336 45.7381 38.6827C56.9538 24.4249 74.2039 17.11 97.0132 16.9405C119.988 17.1113 137.539 24.4614 149.184 38.788C154.894 45.8136 159.199 54.6488 162.037 64.9503L178.184 60.6422C174.744 47.9622 169.331 37.0357 161.965 27.974C147.036 9.60668 125.202 0.195148 97.0695 0H96.9569C68.8816 0.19447 47.2921 9.6418 32.7883 28.0793C19.8819 44.4864 13.2244 67.3157 13.0007 95.9325L13 96L13.0007 96.0675C13.2244 124.684 19.8819 147.514 32.7883 163.921C47.2921 182.358 68.8816 191.806 96.9569 192H97.0695C122.03 191.827 139.624 185.292 154.118 170.811C173.081 151.866 172.51 128.119 166.26 113.541C161.776 103.087 153.227 94.5962 141.537 88.9883ZM98.4405 129.507C88.0005 130.095 77.1544 125.409 76.6196 115.372C76.2232 107.93 81.9158 99.626 99.0812 98.6368C101.047 98.5234 102.976 98.468 104.871 98.468C111.106 98.468 116.939 99.0737 122.242 100.233C120.264 124.935 108.662 128.946 98.4405 129.507Z" /></svg></div> <div style=" font-size: 15px; line-height: 21px; color: #999999; font-weight: 400; padding-bottom: 4px; "><figcaption><cite> Post by </cite><figcaption></div> <div style=" font-size: 15px; line-height: 21px; color: #000000; font-weight: 600; "> View on Threads</div></div></a></blockquote></figure></div><div class="live-content"><time datetime="2026-09-16T23:18:50+00:00">September 16, 2026 – 7:18 PM</time><h2 id="three-pillars">Three pillars</h2><p>The video being shown shows three pillars:</p><p>Portrait - Specs understanding of you</p><p>Corners - Organizing your life like work, family and travel</p><p>Goals - An understanding of the things you're working towatrds.</p></div><div class="live-content"><time datetime="2026-09-16T23:19:24+00:00">September 16, 2026 – 7:19 PM</time><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:52.97%;"><img id="ef2a7M9PNxREBA6BAzkzSj" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/ef2a7M9PNxREBA6BAzkzSj-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="1356" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap Specs)</span></figcaption></figure></div><div class="live-content"><time datetime="2026-09-16T23:20:28+00:00">September 16, 2026 – 7:20 PM</time><h2 id="privacy-and-consent">Privacy and consent</h2><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:58.67%;"><img id="EBhsptTHw4W7gSfaNto7yn" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/EBhsptTHw4W7gSfaNto7yn-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="1502" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap Specs)</span></figcaption></figure><p>Specs Intelligence lets you choose what it has to access to and you have to approve prompts that it proffers. </p><p>Spiegel says that privacy is built-in to the platform.</p></div><div class="live-content"><time datetime="2026-09-16T23:22:20+00:00">September 16, 2026 – 7:22 PM</time><h2 id="first-live-demo">First live demo</h2><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="Mns9WUDUCyw4bfJkZiprsL" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/Mns9WUDUCyw4bfJkZiprsL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Evan is live demoing the Specs showing off the home menu on the palm of his hands.</p><p>The menu can be accessed in either palm.</p></div><div class="live-content"><time datetime="2026-09-16T23:24:16+00:00">September 16, 2026 – 7:24 PM</time><h2 id="snapchat-on-specs">Snapchat on Specs</h2><p>Spiegel takes some pretty instantaneous images using the glasses to send a Snapchat to a friend.</p></div><div class="live-content"><time datetime="2026-09-16T23:27:13+00:00">September 16, 2026 – 7:27 PM</time><h2 id="watching-videos-and-technical-difficulties">Watching videos and technical difficulties</h2><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:52.81%;"><img id="z62WwPoQi6eUqA5hkfeNp5" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/z62WwPoQi6eUqA5hkfeNp5-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="1352" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap Specs)</span></figcaption></figure><p>Spiegel highlights entertainment options like YouTube, HBO Max or Spotify.</p><p>He navigated to YouTube in an attempt to show off watching videos. There are some technical difficulties as the videos won't load.</p><p>In attempt number 2 it finally seemed to work with a cheeky joke a the expense of Meta.</p></div><div class="live-content"><time datetime="2026-09-16T23:30:02+00:00">September 16, 2026 – 7:30 PM</time><h2 id="quot-an-opportunity-to-change-the-way-people-shop-quot">"An opportunity to change the way people shop"</h2><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="uNVbHUv6F6opsS3bxKprVR" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/uNVbHUv6F6opsS3bxKprVR-1920-80.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: Snap Specs)</span></figcaption></figure><p>Specs are AR glasses in that you can shop on sites like Amazon and pull an item of interest in the "real world" to see how it would fit in your space.</p><p>Impressively, he pulled a sauna out of the demo and was able to walk inside the hut.</p></div><div class="live-content"><time datetime="2026-09-16T23:32:09+00:00">September 16, 2026 – 7:32 PM</time><h2 id="specs-for-work">Specs for work</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="trncWJQzVJTkJcBYkqjVTb" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/trncWJQzVJTkJcBYkqjVTb-1920-80.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: Snap Specs)</span></figcaption></figure><p>Spiegel is moving into an enterprise discussion or how businesses might use Specs with employees in the field.</p><p>Partners include Salesforce, AWS, and Nvidia. </p><p>Using Specs they can do things like look up guides witout pulling out their phone or laptop. Retail associates can quickly discover if a product is available. Those are just a couple exampes.</p></div><div class="live-content"><time datetime="2026-09-16T23:33:17+00:00">September 16, 2026 – 7:33 PM</time><h2 id="spatial-workstation">Spatial workstation</h2><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="Umo3gNiquknUd4YF2yKAyk" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/Umo3gNiquknUd4YF2yKAyk-1920-80.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: Snap Specs)</span></figcaption></figure><p>An app called Hololight enables spatial computing including working with multiple monitors, and interacting with 3D objects. </p><p>This could be useful for more than just businesses but also artists and multitaskers.</p></div><div class="live-content"><time datetime="2026-09-16T23:36:00+00:00">September 16, 2026 – 7:36 PM</time><h2 id="using-specs-to-learn">Using Specs to learn</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:480px;"><p class="vanilla-image-block" style="padding-top:54.58%;"><img id="fRWB493yS978oAJKzsFqt3" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/fRWB493yS978oAJKzsFqt3-1920-80.gif" mos="" align="middle" fullscreen="" width="480" height="262" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>We've seen some of these ideas before like the basketball training lens that teaches you how to shoot with AR overlays.</p><p>Other examples include soccer training or working on your golf swing.</p></div><div class="live-content"><time datetime="2026-09-16T23:37:30+00:00">September 16, 2026 – 7:37 PM</time><h2 id="nba-star-jimmy-butler">NBA star Jimmy Butler</h2><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="fZRBgck9uaDthgShxNoPqG" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/fZRBgck9uaDthgShxNoPqG-1920-80.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: Snap Specs)</span></figcaption></figure><p>NBA Star Jimmy Butler is here. He's one of several celebrity partners that have created unique lenses for Specs that show different ways to use the glasses from games to music and meditation.</p></div><div class="live-content"><time datetime="2026-09-16T23:38:50+00:00">September 16, 2026 – 7:38 PM</time><p>Tracing live demo</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="PwPFdMJ6jLAo3XurAzhPmR" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/PwPFdMJ6jLAo3XurAzhPmR-1920-80.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: Snap Specs)</span></figcaption></figure><p>The second live demo involved Spiegel tracing a Specs mascot using an overlay from the glasses. </p></div><div class="live-content"><time datetime="2026-09-16T23:41:20+00:00">September 16, 2026 – 7:41 PM</time><h2 id="to-space">To space</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="g4qxqYxJwGoy9GQnobJE2o" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/g4qxqYxJwGoy9GQnobJE2o-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>My favorite demo so far is the Apollo launch that shows how the launch worked in stages giving you an understanding of the history and process of the launch.</p></div><div class="live-content"><time datetime="2026-09-16T23:43:20+00:00">September 16, 2026 – 7:43 PM</time><h2 id="navigation">Navigation</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:480px;"><p class="vanilla-image-block" style="padding-top:55.00%;"><img id="6dnfZHuSihBuj5EFwRW4h4" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/6dnfZHuSihBuj5EFwRW4h4-1920-80.gif" mos="" align="middle" fullscreen="" width="480" height="264" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>One of the promises of AR glasses is the ability to navigate the world through directions, live translation, and more.</p></div><div class="live-content"><time datetime="2026-09-16T23:43:53+00:00">September 16, 2026 – 7:43 PM</time><p>Harry Potter has a lens in partnership with HBO Max.</p></div><div class="live-content"><time datetime="2026-09-16T23:47:33+00:00">September 16, 2026 – 7:47 PM</time><h2 id="hands-on">Hands-on</h2><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="5JQgLWehqG3taJNsL7Ki7" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/5JQgLWehqG3taJNsL7Ki7-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While Spiegel plays with Harry Potter stuff, let me remind you that we've gone hands-on with Specs. </p><p>You can find our <a href="https://www.tomsguide.com/computing/smart-glasses/snap-specs-hands-on-review">first impressions right here</a></p></div><div class="live-content"><time datetime="2026-09-16T23:48:05+00:00">September 16, 2026 – 7:48 PM</time><p>If you're in Los Angeles or visiting you can check out a Snap pop up at the Westfield Century City mall where the glasses will be available to try out.</p></div><div class="live-content"><time datetime="2026-09-16T23:49:03+00:00">September 16, 2026 – 7:49 PM</time><h2 id="cellular-plans-available">Cellular plans available</h2><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="riGKdu5FYwbMc2moarAUV5" name="snap specs" alt="snap specs" src="https://cdn.mos.cms.futurecdn.net/riGKdu5FYwbMc2moarAUV5-1920-80.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: snap specs)</span></figcaption></figure><p>Spiegel just announced a cellular charging case for Specs.</p><p>Cellular plans can be purchased through Verizon at $10 a month for Verizon customers and $20 a month for non-customers. </p></div><div class="live-content"><time datetime="2026-09-16T23:51:22+00:00">September 16, 2026 – 7:51 PM</time><h2 id="specs-visionaries">Specs visionaries</h2><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="yATd7qXn3Eiiioihced3sJ" name="snap specs" alt="snap specs" src="https://cdn.mos.cms.futurecdn.net/yATd7qXn3Eiiioihced3sJ-1920-80.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: snap specs)</span></figcaption></figure><p>As mentioned, Specs has partnered with celebrities like Kaia Gerber, Jimmy Butler and Jack Harlow for bespoke apps.</p><p>Gerber's is a book club that lets you take notes, look up a note or learn more about the book as you read. </p><p>Butler's is a dominoes game that you can play with other Specs players. </p><p>Ho-yeon's is a meditation practice with fun graphical touches.</p></div><div class="live-content"><time datetime="2026-09-16T23:57:11+00:00">September 16, 2026 – 7:57 PM</time><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="DoDCTAjNs2rTx4dc2NCSxh" name="Snap Specs worn by Imogen Heap" alt="Snap Specs worn by Imogen Heap" src="https://cdn.mos.cms.futurecdn.net/DoDCTAjNs2rTx4dc2NCSxh-1920-80.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: Snap)</span></figcaption></figure><p>Performance by Imogen Heap.</p><p>Heap designed a lens with a soundspace that lets her build songs using virtual tools she likes. </p><p>She shows gesture controls like panning her voice by moving her head side to side and using her arm to create reverb. </p></div><div class="live-content"><time datetime="2026-09-17T00:00:15+00:00">September 16, 2026 – 8:00 PM</time><h2 id="improvised-music-in-action">Improvised music in action</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/PGRmqc8hzoqNeg4Y7zjxFX-1920-80.png" alt="snap specs" /><figcaption><small role="credit">snap specs</small></figcaption></figure></figure></div><div class="live-content"><time datetime="2026-09-17T00:03:45+00:00">September 16, 2026 – 8:03 PM</time><h2 id="that-39-s-a-wrap-on-the-stage-but-stay-tuned">That's a wrap on the stage, but stay tuned</h2><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:75.00%;"><img id="s7WemwV8UqHfJhiCxQqgS5" name="snap specs" alt="snap specs" src="https://cdn.mos.cms.futurecdn.net/s7WemwV8UqHfJhiCxQqgS5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1920" 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 stage show is over but we are hitting up hands on demos. Stay tuned and we'll share more.</p></div><div class="live-content"><time datetime="2026-09-17T00:38:14+00:00">September 16, 2026 – 8:38 PM</time><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.29%;"><img id="htno8mifDPtux28stDaY7" name="20260916_172222" alt="Speccsy (sp?) Mascot at the specs event" src="https://cdn.mos.cms.futurecdn.net/htno8mifDPtux28stDaY7-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1441" 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 event for hands on demos.</p></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/news/live/snap-specs-launch-live</link>
                                                                            <description>
                            <![CDATA[ Snap Specs are finally officially launching alongside a new AI platform that is meant to "anticipate" your needs. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4dm9L69q3NWzVFeHCPELta</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/d686Q7GaqVywQHBBnNTJWo-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 16 Sep 2026 22:29:20 +0000</pubDate>                                                                                                                                <updated>Thu, 17 Sep 2026 00:38:17 +0000</updated>
                                                                                                                                            <category><![CDATA[Smart Glasses]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[VR & AR]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;br&gt;Send secure tips on Signal: scyo1.55.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/d686Q7GaqVywQHBBnNTJWo-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Snap Specs (2026)]]></media:description>                                                            <media:text><![CDATA[Snap Specs (2026)]]></media:text>
                                <media:title type="plain"><![CDATA[Snap Specs (2026)]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/d686Q7GaqVywQHBBnNTJWo-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div class="live-content"><p>Snap officially <a href="https://www.tomsguide.com/computing/smart-glasses/really-pushing-the-frontier-of-what-technology-can-deliver-snap-specs-product-head-reveals-the-challenges-in-designing-the-new-ar-glasses">unveiled its Specs</a> AR glasses at AWE 2026 in June, but the official launch was delayed until now. "It’s going to be that shift from phones to glasses," Snap said at the time.</p><p>Today, Snap is holding an official launch event with even more to share about its chunky smart glasses. </p><p>We expect to learn more details about the glasses alongside new Lenses, features and more!</p><p>Stay with Tom's Guide as we attend Snap's event and go hands on with the Specs.</p><p>Here's the latest news:</p><ul><li><a href="https://www.tomsguide.com/computing/smart-glasses/snap-specs-hands-on-review"><strong>I wore the new Snap Specs — the design is wildly polarizing, but the instinctual computing is a genuine breakthrough</strong></a></li><li><a href="https://www.tomsguide.com/computing/smart-glasses/new-type-of-computer-snap-specs-officially-launch-and-heres-what-these-ar-glasses-can-do"><strong>'New type of computer': Snap Specs reveals how its new smart glasses fit into your daily life alongside new AR experiences</strong></a></li><li><a href="https://www.tomsguide.com/ai/snapchat-launches-its-own-ai-and-says-snap-intelligence-will-anticipate-your-needs"><strong>Snapchat launches its own AI — and says Snap Intelligence will 'anticipate your needs'</strong></a><strong></strong></li></ul><h2 id="how-to-watch">How to watch</h2><p>You can follow along at the Experience Specs website where there is a video player.</p><p>Check it out <a href="https://experience.snap.com/specs-launch-livestream" target="_blank">here</a>.</p></div><div class="live-content"><time datetime="2026-09-16T22:30:49+00:00">September 16, 2026 – 6:30 PM</time><h2 id="can-specs-break-through">Can Specs break through?</h2><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="bgk3JYKAvMvGJBXJPxXupf" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/bgk3JYKAvMvGJBXJPxXupf-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Smart glasses have cooled this year with global shipments only rising 35% in 2026 compared to a meteoric 130% increase tracked in Q1 according to IDC. </p><p>But even outside of cooling shipments, the elephant in the room is Meta, which IDC research shows claims 70% of the smart glasses market with its Ray-Ban Meta audio glasses. RayNeo is a distant second at 3.6% of the market.</p><p>That said, a wave of new devices, including the Specs are set to launch this fall. And Meta has its own Connect event next week. IDC believes this will be enough to drive growth and excitement despite concerns surrounding privacy and a dulling of innovation as companies adopt similar business models.</p></div><div class="live-content"><time datetime="2026-09-16T22:32:40+00:00">September 16, 2026 – 6:32 PM</time><h2 id="a-delayed-launch">A delayed launch</h2><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="zNU2z4trydjGTd8uvnypvG" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/zNU2z4trydjGTd8uvnypvG-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Snap officially revealed the Specs <a href="https://www.tomsguide.com/computing/smart-glasses/snap-specs-are-official-and-theyre-a-bold-mash-up-of-ray-ban-metas-and-apple-vision-pro-with-an-eye-watering-price"><u>during AWE 2026</u></a> back in June, promising a nebulous fall release date. </p><p>Today’s launch finally makes the Specs a reality, even if the actual ship date is still unknown. Hopefully, CEO Evan Spiegel announces dates today</p></div><div class="live-content"><time datetime="2026-09-16T22:35:35+00:00">September 16, 2026 – 6:35 PM</time><h2 id="snap-believes-specs-will-be-a-major-shift">Snap believes Specs will be a major shift</h2><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="AStxUqZoTX9GTJyXyDxysf" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/AStxUqZoTX9GTJyXyDxysf-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>“We’ve seen these different shifts in computing happen, and we see a shift is coming,” Russell Patton, product manager for Specs at Snap <a href="https://www.tomsguide.com/computing/smart-glasses/really-pushing-the-frontier-of-what-technology-can-deliver-snap-specs-product-head-reveals-the-challenges-in-designing-the-new-ar-glasses"><u>told Tom’s Guide in an interview</u></a>. “Going forward, it’s going to be that shift from phones to glasses, and I think it’s not just taking the apps that are on our phones and putting them into glasses.” </p><p>In June, Snap highlighted the truly spatial content that Specs is capable of producing. It’s visual AI that actually teaches.</p></div><div class="live-content"><time datetime="2026-09-16T22:39:20+00:00">September 16, 2026 – 6:39 PM</time><h2 id="will-people-wear-specs">Will people wear Specs?</h2><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="wBdo5JowcbrG3UBKEJ7cun" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/wBdo5JowcbrG3UBKEJ7cun-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Compared to the older developer Specs, the official consumer design is svelte, but versus literally any other glasses these things are chunky and thick.</p><p>After some hands-on time, they’re <a href="https://www.tomsguide.com/computing/smart-glasses/i-just-went-eyes-on-with-snap-specs-theyre-a-lot-more-stylish-than-i-feared-at-first"><u>more comfortable than you’d think</u></a>, though I’ve seen ears get squished by the giant arms. </p><p>The glasses are a true breakthrough in AR and wearable tech. The question is whether or not this design will be off-putting to people or if customers are actually willing to try them out.</p></div><div class="live-content"><time datetime="2026-09-16T22:40:06+00:00">September 16, 2026 – 6:40 PM</time><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="dxtWa5Ws3Tim8z5FuSCawF" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/dxtWa5Ws3Tim8z5FuSCawF-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>We just took our seats at the theater. It's pretty cool design space!</p></div><div class="live-content"><time datetime="2026-09-16T22:45:15+00:00">September 16, 2026 – 6:45 PM</time><h2 id="red-carpet-moment">Red carpet moment</h2><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:133.33%;"><img id="JCd42XhvhW4Rqmk6F4wY7o" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/JCd42XhvhW4Rqmk6F4wY7o-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="2560" 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></div><div class="live-content"><time datetime="2026-09-16T22:50:19+00:00">September 16, 2026 – 6:50 PM</time><h2 id="specs-first-rival">Specs’ first rival</h2><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="GprvEQHJvwNBFHC3uBKze4" name="Snap Specs vs Xreal Aura" alt="Snap Specs vs Xreal Aura" src="https://cdn.mos.cms.futurecdn.net/GprvEQHJvwNBFHC3uBKze4-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Meta may own the smart glasses category but Specs first true rival may be the as-yet-unreleased Xreal Aura glasses. Built in collaboration with Google, the Aura is a pair of  XR glasses that offloads its computing power to an attached puck (or brick about the size of a smartphone). </p><p>It offers similar features to the Specs, including AR apps and tools, gesture controls and AI functionality. However, it also has a larger field of view, a crisper display and some connectivity features that Specs can’t match.</p><p><a href="https://www.tomsguide.com/computing/smart-glasses/snap-specs-vs-xreal-aura"><u>Which one is right for most people</u></a>?</p></div><div class="live-content"><time datetime="2026-09-16T22:55:12+00:00">September 16, 2026 – 6:55 PM</time><h2 id="5-minute-countdown">5 minute countdown</h2><p>Snap's keynote kicks off in 5 minutes. </p><p>As a reminder, keep Tom's Guide in your tabs as we'll have hands-on impressions, analysis and more after the keynote and in the coming days. </p></div><div class="live-content"><time datetime="2026-09-16T23:00:35+00:00">September 16, 2026 – 7:00 PM</time><h2 id="are-you-excited-for-specs">Are you excited for Specs?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kE4tGy59iWdNuntSdK37yR" name="Specs LIST_alt2" alt="Snap Specs AWE 2026 reveal" src="https://cdn.mos.cms.futurecdn.net/kE4tGy59iWdNuntSdK37yR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap / Tom's Guide)</span></figcaption></figure><p>We're still about 10 minutes from show start. </p><p>While we wait, are you excited for Specs or intrigued? Let me know in the comments</p></div><div class="live-content"><time datetime="2026-09-16T23:05:44+00:00">September 16, 2026 – 7:05 PM</time><h2 id="eargate-debunked">Eargate debunked</h2><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2067965120353812972"><p lang="en" dir="ltr">Also not to say that eargate may have been blown out of proportion for the memes, but Evan did reply to it...https://t.co/NXbu7fX5PL<a href="https://twitter.com/cantworkitout/status/2067965120353812972">June 19, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>His ears are just like that.</p></div><div class="live-content"><time datetime="2026-09-16T23:08:15+00:00">September 16, 2026 – 7:08 PM</time><h2 id="and-we-39-re-off">...and we're off</h2><p>An existential trailer starts us off.</p></div><div class="live-content"><time datetime="2026-09-16T23:10:14+00:00">September 16, 2026 – 7:10 PM</time><h2 id="a-treatise-on-mortality">A treatise on mortality?</h2><p>Starting us off with a discussion on souls and what we leave behind or don't. </p></div><div class="live-content"><time datetime="2026-09-16T23:10:29+00:00">September 16, 2026 – 7:10 PM</time><p>Evan Spiegel has taken the stage.</p></div><div class="live-content"><time datetime="2026-09-16T23:11:04+00:00">September 16, 2026 – 7:11 PM</time><p>Spiegel says most of the show will be live demos.</p></div><div class="live-content"><time datetime="2026-09-16T23:12:02+00:00">September 16, 2026 – 7:12 PM</time><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="sRfAHHwtfwycjYAYzDHbX" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/sRfAHHwtfwycjYAYzDHbX-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>"Making people irrelevant is not progress. Computers should make us more important not less.</p></div><div class="live-content"><time datetime="2026-09-16T23:13:17+00:00">September 16, 2026 – 7:13 PM</time><h2 id="quot-instinctual-computing-quot">"Instinctual computing"</h2><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="tZx4VgdoFm6iGNNANvypz3" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/tZx4VgdoFm6iGNNANvypz3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Specs are glasses so they can see what you see, understand the world without recording it, just like you. - Spiegel</p></div><div class="live-content"><time datetime="2026-09-16T23:14:53+00:00">September 16, 2026 – 7:14 PM</time><h2 id="native-ai">Native 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:2560px;"><p class="vanilla-image-block" style="padding-top:53.98%;"><img id="FkSqfQwt4kLkcfEtermKjJ" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/FkSqfQwt4kLkcfEtermKjJ-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="1382" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>Spiegel says Snap built the first native AI for glasses. Built shared experiences as a foundational part of operating system.</p><p>Specs help you do what you want to do in the real world like shooting a basketball or cooking.</p></div><div class="live-content"><time datetime="2026-09-16T23:17:42+00:00">September 16, 2026 – 7:17 PM</time><h2 id="specs-intelligence">Specs Intelligence</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1250px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="pipEeYfBWFxhH6upvL4doX" name="SPECS26_SPECS Intelligence crop" alt="Snap Intelligence AI platform" src="https://cdn.mos.cms.futurecdn.net/pipEeYfBWFxhH6upvL4doX-1920-80.png" mos="" align="middle" fullscreen="" width="1250" height="703" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>Spiegel announces that today is the day that people can finally try Specs. </p><p>Says they're not just AR glasses. "Specs are part of an intelligence system that lives across your Mac and IPhone."</p><p>Announces Spec Intelligence.</p><figure><blockquote class="text-post-media" data-text-post-permalink= data-text-post-version="0" id=.d288932e-b224-11f1-9a1f-8f1737d3b635 style=" background:#FFF; border-width: 1px; border-style: solid; border-color: #00000026; border-radius: 16px; max-width:540px; margin: 1px; min-width:270px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"> <a href= style=" background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%; font-family: -apple-system, BlinkMacSystemFont, sans-serif;" target="_blank"> <div style=" padding: 40px; display: flex; flex-direction: column; align-items: center;"><div style=" display:block; height:32px; width:32px; padding-bottom:20px;"> <svg aria-label="Threads" height="32px" role="img" viewBox="0 0 192 192" width="32px" xmlns="http://www.w3.org/2000/svg"> <path d="M141.537 88.9883C140.71 88.5919 139.87 88.2104 139.019 87.8451C137.537 60.5382 122.616 44.905 97.5619 44.745C97.4484 44.7443 97.3355 44.7443 97.222 44.7443C82.2364 44.7443 69.7731 51.1409 62.102 62.7807L75.881 72.2328C81.6116 63.5383 90.6052 61.6848 97.2286 61.6848C97.3051 61.6848 97.3819 61.6848 97.4576 61.6855C105.707 61.7381 111.932 64.1366 115.961 68.814C118.893 72.2193 120.854 76.925 121.825 82.8638C114.511 81.6207 106.601 81.2385 98.145 81.7233C74.3247 83.0954 59.0111 96.9879 60.0396 116.292C60.5615 126.084 65.4397 134.508 73.775 140.011C80.8224 144.663 89.899 146.938 99.3323 146.423C111.79 145.74 121.563 140.987 128.381 132.296C133.559 125.696 136.834 117.143 138.28 106.366C144.217 109.949 148.617 114.664 151.047 120.332C155.179 129.967 155.42 145.8 142.501 158.708C131.182 170.016 117.576 174.908 97.0135 175.059C74.2042 174.89 56.9538 167.575 45.7381 153.317C35.2355 139.966 29.8077 120.682 29.6052 96C29.8077 71.3178 35.2355 52.0336 45.7381 38.6827C56.9538 24.4249 74.2039 17.11 97.0132 16.9405C119.988 17.1113 137.539 24.4614 149.184 38.788C154.894 45.8136 159.199 54.6488 162.037 64.9503L178.184 60.6422C174.744 47.9622 169.331 37.0357 161.965 27.974C147.036 9.60668 125.202 0.195148 97.0695 0H96.9569C68.8816 0.19447 47.2921 9.6418 32.7883 28.0793C19.8819 44.4864 13.2244 67.3157 13.0007 95.9325L13 96L13.0007 96.0675C13.2244 124.684 19.8819 147.514 32.7883 163.921C47.2921 182.358 68.8816 191.806 96.9569 192H97.0695C122.03 191.827 139.624 185.292 154.118 170.811C173.081 151.866 172.51 128.119 166.26 113.541C161.776 103.087 153.227 94.5962 141.537 88.9883ZM98.4405 129.507C88.0005 130.095 77.1544 125.409 76.6196 115.372C76.2232 107.93 81.9158 99.626 99.0812 98.6368C101.047 98.5234 102.976 98.468 104.871 98.468C111.106 98.468 116.939 99.0737 122.242 100.233C120.264 124.935 108.662 128.946 98.4405 129.507Z" /></svg></div> <div style=" font-size: 15px; line-height: 21px; color: #999999; font-weight: 400; padding-bottom: 4px; "><figcaption><cite> Post by </cite><figcaption></div> <div style=" font-size: 15px; line-height: 21px; color: #000000; font-weight: 600; "> View on Threads</div></div></a></blockquote></figure></div><div class="live-content"><time datetime="2026-09-16T23:18:50+00:00">September 16, 2026 – 7:18 PM</time><h2 id="three-pillars">Three pillars</h2><p>The video being shown shows three pillars:</p><p>Portrait - Specs understanding of you</p><p>Corners - Organizing your life like work, family and travel</p><p>Goals - An understanding of the things you're working towatrds.</p></div><div class="live-content"><time datetime="2026-09-16T23:19:24+00:00">September 16, 2026 – 7:19 PM</time><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:52.97%;"><img id="ef2a7M9PNxREBA6BAzkzSj" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/ef2a7M9PNxREBA6BAzkzSj-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="1356" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap Specs)</span></figcaption></figure></div><div class="live-content"><time datetime="2026-09-16T23:20:28+00:00">September 16, 2026 – 7:20 PM</time><h2 id="privacy-and-consent">Privacy and consent</h2><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:58.67%;"><img id="EBhsptTHw4W7gSfaNto7yn" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/EBhsptTHw4W7gSfaNto7yn-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="1502" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap Specs)</span></figcaption></figure><p>Specs Intelligence lets you choose what it has to access to and you have to approve prompts that it proffers. </p><p>Spiegel says that privacy is built-in to the platform.</p></div><div class="live-content"><time datetime="2026-09-16T23:22:20+00:00">September 16, 2026 – 7:22 PM</time><h2 id="first-live-demo">First live demo</h2><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="Mns9WUDUCyw4bfJkZiprsL" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/Mns9WUDUCyw4bfJkZiprsL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Evan is live demoing the Specs showing off the home menu on the palm of his hands.</p><p>The menu can be accessed in either palm.</p></div><div class="live-content"><time datetime="2026-09-16T23:24:16+00:00">September 16, 2026 – 7:24 PM</time><h2 id="snapchat-on-specs">Snapchat on Specs</h2><p>Spiegel takes some pretty instantaneous images using the glasses to send a Snapchat to a friend.</p></div><div class="live-content"><time datetime="2026-09-16T23:27:13+00:00">September 16, 2026 – 7:27 PM</time><h2 id="watching-videos-and-technical-difficulties">Watching videos and technical difficulties</h2><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:52.81%;"><img id="z62WwPoQi6eUqA5hkfeNp5" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/z62WwPoQi6eUqA5hkfeNp5-1920-80.png" mos="" align="middle" fullscreen="" width="2560" height="1352" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap Specs)</span></figcaption></figure><p>Spiegel highlights entertainment options like YouTube, HBO Max or Spotify.</p><p>He navigated to YouTube in an attempt to show off watching videos. There are some technical difficulties as the videos won't load.</p><p>In attempt number 2 it finally seemed to work with a cheeky joke a the expense of Meta.</p></div><div class="live-content"><time datetime="2026-09-16T23:30:02+00:00">September 16, 2026 – 7:30 PM</time><h2 id="quot-an-opportunity-to-change-the-way-people-shop-quot">"An opportunity to change the way people shop"</h2><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="uNVbHUv6F6opsS3bxKprVR" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/uNVbHUv6F6opsS3bxKprVR-1920-80.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: Snap Specs)</span></figcaption></figure><p>Specs are AR glasses in that you can shop on sites like Amazon and pull an item of interest in the "real world" to see how it would fit in your space.</p><p>Impressively, he pulled a sauna out of the demo and was able to walk inside the hut.</p></div><div class="live-content"><time datetime="2026-09-16T23:32:09+00:00">September 16, 2026 – 7:32 PM</time><h2 id="specs-for-work">Specs for work</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="trncWJQzVJTkJcBYkqjVTb" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/trncWJQzVJTkJcBYkqjVTb-1920-80.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: Snap Specs)</span></figcaption></figure><p>Spiegel is moving into an enterprise discussion or how businesses might use Specs with employees in the field.</p><p>Partners include Salesforce, AWS, and Nvidia. </p><p>Using Specs they can do things like look up guides witout pulling out their phone or laptop. Retail associates can quickly discover if a product is available. Those are just a couple exampes.</p></div><div class="live-content"><time datetime="2026-09-16T23:33:17+00:00">September 16, 2026 – 7:33 PM</time><h2 id="spatial-workstation">Spatial workstation</h2><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="Umo3gNiquknUd4YF2yKAyk" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/Umo3gNiquknUd4YF2yKAyk-1920-80.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: Snap Specs)</span></figcaption></figure><p>An app called Hololight enables spatial computing including working with multiple monitors, and interacting with 3D objects. </p><p>This could be useful for more than just businesses but also artists and multitaskers.</p></div><div class="live-content"><time datetime="2026-09-16T23:36:00+00:00">September 16, 2026 – 7:36 PM</time><h2 id="using-specs-to-learn">Using Specs to learn</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:480px;"><p class="vanilla-image-block" style="padding-top:54.58%;"><img id="fRWB493yS978oAJKzsFqt3" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/fRWB493yS978oAJKzsFqt3-1920-80.gif" mos="" align="middle" fullscreen="" width="480" height="262" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>We've seen some of these ideas before like the basketball training lens that teaches you how to shoot with AR overlays.</p><p>Other examples include soccer training or working on your golf swing.</p></div><div class="live-content"><time datetime="2026-09-16T23:37:30+00:00">September 16, 2026 – 7:37 PM</time><h2 id="nba-star-jimmy-butler">NBA star Jimmy Butler</h2><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="fZRBgck9uaDthgShxNoPqG" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/fZRBgck9uaDthgShxNoPqG-1920-80.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: Snap Specs)</span></figcaption></figure><p>NBA Star Jimmy Butler is here. He's one of several celebrity partners that have created unique lenses for Specs that show different ways to use the glasses from games to music and meditation.</p></div><div class="live-content"><time datetime="2026-09-16T23:38:50+00:00">September 16, 2026 – 7:38 PM</time><p>Tracing live demo</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="PwPFdMJ6jLAo3XurAzhPmR" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/PwPFdMJ6jLAo3XurAzhPmR-1920-80.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: Snap Specs)</span></figcaption></figure><p>The second live demo involved Spiegel tracing a Specs mascot using an overlay from the glasses. </p></div><div class="live-content"><time datetime="2026-09-16T23:41:20+00:00">September 16, 2026 – 7:41 PM</time><h2 id="to-space">To space</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="g4qxqYxJwGoy9GQnobJE2o" name="Snap Specs" alt="Snap Specs" src="https://cdn.mos.cms.futurecdn.net/g4qxqYxJwGoy9GQnobJE2o-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>My favorite demo so far is the Apollo launch that shows how the launch worked in stages giving you an understanding of the history and process of the launch.</p></div><div class="live-content"><time datetime="2026-09-16T23:43:20+00:00">September 16, 2026 – 7:43 PM</time><h2 id="navigation">Navigation</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:480px;"><p class="vanilla-image-block" style="padding-top:55.00%;"><img id="6dnfZHuSihBuj5EFwRW4h4" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/6dnfZHuSihBuj5EFwRW4h4-1920-80.gif" mos="" align="middle" fullscreen="" width="480" height="264" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Snap)</span></figcaption></figure><p>One of the promises of AR glasses is the ability to navigate the world through directions, live translation, and more.</p></div><div class="live-content"><time datetime="2026-09-16T23:43:53+00:00">September 16, 2026 – 7:43 PM</time><p>Harry Potter has a lens in partnership with HBO Max.</p></div><div class="live-content"><time datetime="2026-09-16T23:47:33+00:00">September 16, 2026 – 7:47 PM</time><h2 id="hands-on">Hands-on</h2><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="5JQgLWehqG3taJNsL7Ki7" name="Snap Specs (2026)" alt="Snap Specs (2026)" src="https://cdn.mos.cms.futurecdn.net/5JQgLWehqG3taJNsL7Ki7-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While Spiegel plays with Harry Potter stuff, let me remind you that we've gone hands-on with Specs. </p><p>You can find our <a href="https://www.tomsguide.com/computing/smart-glasses/snap-specs-hands-on-review">first impressions right here</a></p></div><div class="live-content"><time datetime="2026-09-16T23:48:05+00:00">September 16, 2026 – 7:48 PM</time><p>If you're in Los Angeles or visiting you can check out a Snap pop up at the Westfield Century City mall where the glasses will be available to try out.</p></div><div class="live-content"><time datetime="2026-09-16T23:49:03+00:00">September 16, 2026 – 7:49 PM</time><h2 id="cellular-plans-available">Cellular plans available</h2><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="riGKdu5FYwbMc2moarAUV5" name="snap specs" alt="snap specs" src="https://cdn.mos.cms.futurecdn.net/riGKdu5FYwbMc2moarAUV5-1920-80.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: snap specs)</span></figcaption></figure><p>Spiegel just announced a cellular charging case for Specs.</p><p>Cellular plans can be purchased through Verizon at $10 a month for Verizon customers and $20 a month for non-customers. </p></div><div class="live-content"><time datetime="2026-09-16T23:51:22+00:00">September 16, 2026 – 7:51 PM</time><h2 id="specs-visionaries">Specs visionaries</h2><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="yATd7qXn3Eiiioihced3sJ" name="snap specs" alt="snap specs" src="https://cdn.mos.cms.futurecdn.net/yATd7qXn3Eiiioihced3sJ-1920-80.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: snap specs)</span></figcaption></figure><p>As mentioned, Specs has partnered with celebrities like Kaia Gerber, Jimmy Butler and Jack Harlow for bespoke apps.</p><p>Gerber's is a book club that lets you take notes, look up a note or learn more about the book as you read. </p><p>Butler's is a dominoes game that you can play with other Specs players. </p><p>Ho-yeon's is a meditation practice with fun graphical touches.</p></div><div class="live-content"><time datetime="2026-09-16T23:57:11+00:00">September 16, 2026 – 7:57 PM</time><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="DoDCTAjNs2rTx4dc2NCSxh" name="Snap Specs worn by Imogen Heap" alt="Snap Specs worn by Imogen Heap" src="https://cdn.mos.cms.futurecdn.net/DoDCTAjNs2rTx4dc2NCSxh-1920-80.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: Snap)</span></figcaption></figure><p>Performance by Imogen Heap.</p><p>Heap designed a lens with a soundspace that lets her build songs using virtual tools she likes. </p><p>She shows gesture controls like panning her voice by moving her head side to side and using her arm to create reverb. </p></div><div class="live-content"><time datetime="2026-09-17T00:00:15+00:00">September 16, 2026 – 8:00 PM</time><h2 id="improvised-music-in-action">Improvised music in action</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/PGRmqc8hzoqNeg4Y7zjxFX-1920-80.png" alt="snap specs" /><figcaption><small role="credit">snap specs</small></figcaption></figure></figure></div><div class="live-content"><time datetime="2026-09-17T00:03:45+00:00">September 16, 2026 – 8:03 PM</time><h2 id="that-39-s-a-wrap-on-the-stage-but-stay-tuned">That's a wrap on the stage, but stay tuned</h2><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:75.00%;"><img id="s7WemwV8UqHfJhiCxQqgS5" name="snap specs" alt="snap specs" src="https://cdn.mos.cms.futurecdn.net/s7WemwV8UqHfJhiCxQqgS5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1920" 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 stage show is over but we are hitting up hands on demos. Stay tuned and we'll share more.</p></div><div class="live-content"><time datetime="2026-09-17T00:38:14+00:00">September 16, 2026 – 8:38 PM</time><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.29%;"><img id="htno8mifDPtux28stDaY7" name="20260916_172222" alt="Speccsy (sp?) Mascot at the specs event" src="https://cdn.mos.cms.futurecdn.net/htno8mifDPtux28stDaY7-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1441" 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 event for hands on demos.</p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'Pervert glasses' antidote? Meta reportedly launching camera-free smart glasses next week ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Meta makes some of the most <a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">popular smart glasses</a> on the market, which has led to some issues for the company. Namely, it's dealing with people using them as "<a href="https://www.tomsguide.com/computing/smart-glasses/im-worried-smart-glasses-might-ruin-wearable-displays-and-of-course-its-the-cameras">pervert glasses</a>" to photograph and record people without their permission.</p><p>Sure, the glasses have a light that shows when they're capturing, but some users have <a href="https://www.tomsguide.com/ai/less-pervert-y-meta-ai-glasses-will-now-stop-recording-if-you-cover-the-warning-light">modified them to hide the light</a>.  </p><p>Meta has attempted to stem the backlash by rolling out updates, including one that <a href="https://www.tomsguide.com/ai/less-pervert-y-meta-ai-glasses-will-now-stop-recording-if-you-cover-the-warning-light">disables the camera if the LED has been covered or tampered with</a>. And now it appears it has a plan B in mind.</p><p>According to a report from <a href="https://www.theinformation.com/articles/meta-launch-camera-free-smart-glasses-amid-mounting-privacy-concerns" target="_blank">The Information</a>, Mark Zuckerberg and company could launch a pair of Meta glasses without cameras as soon as next week at Meta Connect.</p><p>Does anyone actually want <a href="https://www.tomsguide.com/computing/smart-glasses/xgimi-memomind-one-skip-camera-and-i-dont-think-thats-a-bad-thing">smart glasses without cameras</a>? Personally, my main use case for my Meta Glasses is recording videos and taking photos while golfing, so taking that away would render the glasses all but useless to me.</p><h2 id="meta-glasses-without-cameras">Meta Glasses without cameras</h2><p>Meta is currently calling the glasses-free smart glasses Luna internally. According to the The Information report, it's expected to announce them at Meta Connect on Sept. 23, so we won't have to wait.</p><p>Apparently, the glasses will launch in Clubmaster and Burbank styles. They'll still have the audio features offered by <a href="https://www.tomsguide.com/reviews/ray-ban-meta-smart-glasses">current Meta Glasses</a>. They'll reportedly have six microphones, which means you can ask them for directions and do all other kinds of AI-based tasks without taking your phone out of your pocket.</p><p>The practicality of these new glasses will depend heavily on how useful you find those audio features (I do listen to music on my Meta Glasses, but I almost never use any of the "Hey Meta" features). </p><p>If the report is accurate, Meta will ship the camera-free glasses in October. It'll be interesting to see whether these are popular, or whether they're strictly an attempt by Meta to show it's taking steps to prevent people from using the glasses inappropriately. </p><p>This feels like a move Meta needs to make to keep its smart glasses business moving forward, as some jurisdictions are starting to ban the current camera-toting models in public places. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/perplexitys-new-local-first-ai-runs-on-your-pc-and-asks-before-using-the-cloud">Perplexity’s new local-first AI runs on your PC — and asks before using the cloud</a></li><li><a href="https://www.tomsguide.com/ai/chatgpt/chatgpt-can-learn-your-repetitive-tasks-by-watching-you-here-are-7-prompts-to-try">ChatGPT can learn your repetitive tasks by watching you — here are 7 prompts to try</a></li><li><a href="https://www.tomsguide.com/ai/chatgpt/the-best-way-to-use-chatgpt-for-writing-isnt-writing-7-prompts-i-use-to-make-it-my-creative-partner">The best way to use ChatGPT for writing isn't writing — 7 prompts I use to make it my creative partner</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/smart-glasses/pervert-glasses-antidote-meta-reportedly-launching-camera-free-smart-glasses-next-week</link>
                                                                            <description>
                            <![CDATA[ Meta may be working on smart glasses without a camera because of the 'pervert glasses' issue, but who actually wants them? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">TiEJ5t97GCfuyNrSNfABcC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ZF6rUeAvoWGyx4upUyveW8-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 16 Sep 2026 12:23:06 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smart Glasses]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[VR & AR]]></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-320-70.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Dave LeClair is the Managing News Editor for Tom&#039;s Guide, keeping his finger on the pulse of all things technology. He loves taking the complicated happenings in the tech world and explaining why they matter. Whether Apple is announcing the next big thing in the mobile space or a small startup advancing generative AI, Dave will apply his experience to help you figure out what&#039;s happening and why it&#039;s relevant to your life.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Before Tom&#039;s Guide, Dave worked for publications like PCMag, Pocket-lint, MUO, How-To Geek, Digital Trends, and others. He started writing about technology professionally for MUO in 2011 and hasn&#039;t looked back since. In addition to news, you can find reviews, how-to pieces, shopping guides, and many other types of content with Dave&#039;s name attached.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ZF6rUeAvoWGyx4upUyveW8-1920-80.jpg">
                                                            <media:credit><![CDATA[ David Paul Morris/Bloomberg via Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Mark Zuckerberg wearing Orion glasses]]></media:description>                                                            <media:text><![CDATA[Mark Zuckerberg wearing Orion glasses]]></media:text>
                                <media:title type="plain"><![CDATA[Mark Zuckerberg wearing Orion glasses]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ZF6rUeAvoWGyx4upUyveW8-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Meta makes some of the most <a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">popular smart glasses</a> on the market, which has led to some issues for the company. Namely, it's dealing with people using them as "<a href="https://www.tomsguide.com/computing/smart-glasses/im-worried-smart-glasses-might-ruin-wearable-displays-and-of-course-its-the-cameras">pervert glasses</a>" to photograph and record people without their permission.</p><p>Sure, the glasses have a light that shows when they're capturing, but some users have <a href="https://www.tomsguide.com/ai/less-pervert-y-meta-ai-glasses-will-now-stop-recording-if-you-cover-the-warning-light">modified them to hide the light</a>.  </p><p>Meta has attempted to stem the backlash by rolling out updates, including one that <a href="https://www.tomsguide.com/ai/less-pervert-y-meta-ai-glasses-will-now-stop-recording-if-you-cover-the-warning-light">disables the camera if the LED has been covered or tampered with</a>. And now it appears it has a plan B in mind.</p><p>According to a report from <a href="https://www.theinformation.com/articles/meta-launch-camera-free-smart-glasses-amid-mounting-privacy-concerns" target="_blank">The Information</a>, Mark Zuckerberg and company could launch a pair of Meta glasses without cameras as soon as next week at Meta Connect.</p><p>Does anyone actually want <a href="https://www.tomsguide.com/computing/smart-glasses/xgimi-memomind-one-skip-camera-and-i-dont-think-thats-a-bad-thing">smart glasses without cameras</a>? Personally, my main use case for my Meta Glasses is recording videos and taking photos while golfing, so taking that away would render the glasses all but useless to me.</p><h2 id="meta-glasses-without-cameras">Meta Glasses without cameras</h2><p>Meta is currently calling the glasses-free smart glasses Luna internally. According to the The Information report, it's expected to announce them at Meta Connect on Sept. 23, so we won't have to wait.</p><p>Apparently, the glasses will launch in Clubmaster and Burbank styles. They'll still have the audio features offered by <a href="https://www.tomsguide.com/reviews/ray-ban-meta-smart-glasses">current Meta Glasses</a>. They'll reportedly have six microphones, which means you can ask them for directions and do all other kinds of AI-based tasks without taking your phone out of your pocket.</p><p>The practicality of these new glasses will depend heavily on how useful you find those audio features (I do listen to music on my Meta Glasses, but I almost never use any of the "Hey Meta" features). </p><p>If the report is accurate, Meta will ship the camera-free glasses in October. It'll be interesting to see whether these are popular, or whether they're strictly an attempt by Meta to show it's taking steps to prevent people from using the glasses inappropriately. </p><p>This feels like a move Meta needs to make to keep its smart glasses business moving forward, as some jurisdictions are starting to ban the current camera-toting models in public places. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/perplexitys-new-local-first-ai-runs-on-your-pc-and-asks-before-using-the-cloud">Perplexity’s new local-first AI runs on your PC — and asks before using the cloud</a></li><li><a href="https://www.tomsguide.com/ai/chatgpt/chatgpt-can-learn-your-repetitive-tasks-by-watching-you-here-are-7-prompts-to-try">ChatGPT can learn your repetitive tasks by watching you — here are 7 prompts to try</a></li><li><a href="https://www.tomsguide.com/ai/chatgpt/the-best-way-to-use-chatgpt-for-writing-isnt-writing-7-prompts-i-use-to-make-it-my-creative-partner">The best way to use ChatGPT for writing isn't writing — 7 prompts I use to make it my creative partner</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Tom's Guide Awards 2026: All our favorite laptops, tablets, AR glasses and more ]]></title>
                                                                                                <dc:content><![CDATA[ <p>This year has been a rollercoaster for the computing industry, with undeniably awesome new products marred by the ongoing RAM crisis. If you're looking for your next powerful laptop, blazing-fast Wi-Fi 7 router or first pair of AR glasses, the landscape has changed. That's why our team of experts has been busy testing out the best computing and home office gear from the last twelve months. </p><p>We've seen laptops deliver twin OLED screens without missing a beat of battery,  peripherals that genuinely make your work life easier and the explosion of AR glasses that are currently redefining what computing even means.</p><p>Below you'll find our picks for the Tom's Guide Awards 2026, with each and every one worthy of a permanent position on your desk.</p><h3 class="article-body__section" id="section-best-laptop"><span>Best laptop</span></h3><h2 id="dell-xps-13">Dell XPS 13</h2><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="mR6kk58fayN9kqjKWjNJ2P" name="TGA26-Dell-XPS-13" alt="The Dell XPS 13 with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/mR6kk58fayN9kqjKWjNJ2P-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/laptops/dell-xps-13-2026-review">Dell XPS 13</a> is the best answer to the MacBook Neo. Don’t let its $699 starting price fool you; it’s far from a shoddy budget laptop. The sturdy CNC aluminum chassis makes it feel like a premium notebook, while the sharp 13.4-inch 2.5K touchscreen display outshines the dim panels on most budget Windows laptops. The XPS 13 is also the lightest XPS laptop ever, and it can last nearly 14 and a half hours — both of which make it an ideal travel partner.</p><p>Thanks to all of that, along with its impressive Wildcat Lake performance for everyday work, this year’s Dell XPS 13 is hard to top (unless you’re married to the Apple ecosystem). As such, the XPS 13 is an easy choice for the best laptop.</p><p><em>— Tony Polanco, Senior Writer</em></p><h3 class="article-body__section" id="section-best-ai-laptop"><span>Best AI laptop</span></h3><h2 id="asus-proart-gopro-edition-px13">Asus ProArt GoPro Edition PX13</h2><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="kasktdzVGLUx57u67C7XCW" name="TGA26-Asus-ProArt-GoPro-Edition-PX13" alt="The Asus ProArt GoPro Edition PX13 with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/kasktdzVGLUx57u67C7XCW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There were many definitions of what makes a good AI laptop, but one is becoming clear: something with the raw GPU power and memory to do the work entirely locally on device. And out of everything I tested this year, the <a href="https://www.tomsguide.com/computing/laptops/asus-proart-gopro-edition-px13-review">Asus ProArt GoPro Edition PX13</a> stood tall. </p><p>The laptop fundamentals are there — a gorgeous utilitarian aesthetic, beautiful OLED display, strong ergonomics and battery life. But with an AMD Ryzen AI MAX+ 395 chip in here and up to 128GB of RAM, you can run massive LLMs and agentic models with ease. Things like OpenAI’s GPT-OSS 120B, Google Gemma 3 27B Vision model or Stable Diffusion.</p><p>I’ve always said that the future of AI is local, not cloud-based. This machine proves it.</p><p><em>— Jason England, Managing Editor</em></p><h3 class="article-body__section" id="section-best-keyboard"><span>Best keyboard</span></h3><h2 id="epomaker-glyph">Epomaker Glyph</h2><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="zU6pQGHHBqkTfTd8eqcpcb" name="TGA26-Epomaker-Glyph" alt="The Epomaker Glyph keyboard with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/zU6pQGHHBqkTfTd8eqcpcb-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-review">Epomaker Glyph</a> is easily the best mechanical keyboard I;ve tested this year, and it’s <em>the </em>deck for speed demons and hardcore typists. Its typewriter-like aesthetics, beautiful RGB lighting, dual screens that display useful keyboard and OS stats, a creamy sound profile, and a typing experience that’s nothing short of stunning — the Glyph does it all.</p><p>It makes a regular day at the office feel more fun, and its accompanying silicone and PVC palm rest ensures all-day comfort, too. I called the Glyph my “<a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-prime-day-2026-deal">dream keyboard</a>,” and after having tested nearly 100 keyboards, it’s my daily driver and one I haven’t stopped using since testing it.</p><p><em>— Nikita Achanta, Senior Reviews Writer</em></p><h3 class="article-body__section" id="section-best-gaming-laptop"><span>Best gaming laptop</span></h3><h2 id="razer-blade-16-2026">Razer Blade 16 (2026)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ncakGEuGRAf8nxcWV77M7N" name="Razer Blade 16 (2026)" alt="The Razer Blade 16 (2026) with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/ncakGEuGRAf8nxcWV77M7N-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/gaming-laptops/razer-blade-16-2026-review">Razer Blade 16 </a>is very expensive but worth every penny, delivering a superlative gaming laptop experience. Inside, it packs an Intel Core Ultra 9 CPU and up to an RTX 5090 for serious horsepower. It looks good doing it, thanks to its classy aluminum chassis, which is as comfortable in an office as it is in a gaming den. Games look as good as they perform, thanks to the gorgeous 16-inch 240Hz OLED panel.</p><p>At 4.7 pounds, you’ll definitely feel it in your bag when you’re traveling. This is offset by its exceptional battery life, which can last upwards of 13 hours for basic productivity tasks. However, it can run hot and loud when gaming or rendering videos—not to mention that it lasts less than two hours on a charge when gaming. Those quibbles aside, this is a brilliant gaming laptop, so long as you can afford it.</p><p><em>— Tony Polanco, Senior Writer</em></p><h3 class="article-body__section" id="section-best-2-in-1-laptop"><span>Best 2-in-1 laptop</span></h3><h2 id="asus-zenbook-duo">Asus Zenbook Duo</h2><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="TrDa9XcFc8fGwgJGRQnVzR" name="TGA26-Asus-Zenbook-Duo" alt="The Asus Zenbook Duo with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/TrDa9XcFc8fGwgJGRQnVzR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I mean, this one was kind of expected! The <a href="https://www.tomsguide.com/computing/laptops/asus-zenbook-duo-2026-review">Asus Zenbook Duo</a> rewrote the rules on what to expect from a 2-in-1 a couple years ago, and now with this redesign and Intel Core Ultra Series 3 pumping through its veins, it’s the first real time that this dual-screen laptop form factor feels truly ready for prime time.</p><p>That monster chip keeps everything running oh so smoothly, while offering a beasty GPU to pull off some shockingly good gaming performance. And Asus has really paid attention to overhauling the design here with a sturdier hinge, a great-feeling keyboard and touchpad, and those dual 14-inch OLED touchscreens are a mesmerizing joy to use.</p><p><em>— Jason England,  Managing Editor</em></p><h3 class="article-body__section" id="section-best-mini-pc"><span>Best mini PC</span></h3><h2 id="minisforum-g1-pro">Minisforum G1 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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JBV4vo7kk5veBQuzodrUTe" name="TGA26-Minisforum-G1-Pro" alt="The Minisforum G1 Pro with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/JBV4vo7kk5veBQuzodrUTe-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The days of dragging a big, old desktop computer over to your living room to play on your TV are over now that we have full-featured mini PCs built for gaming like the <a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/minisforum-g1-pro-review">Minisforum G1 Pro</a>. Although it’s smaller than a PS5 Pro, this mini PC still comes packed with powerful internals like an AMD Ryzen 9 8945HX processor and a discrete Nvidia RTX 5060 GPU.</p><p>Moving the G1 Pro from room to room is a breeze too thanks to the fact that it has a built-in, 350W power supply instead of a bulky power brick. Despite its small size, you can easily open the G1 Pro to upgrade its memory, storage and potentially even its graphics card down the line. Minisforum has been making excellent mini PCs for years but the G1 Pro is the closest we’ve come yet to a true console replacement, and it easily beats Valve’s Steam Machine when it comes to performance.</p><p><em>— Anthony Spadafora, Managing Editor</em></p><h3 class="article-body__section" id="section-best-monitor"><span>Best monitor</span></h3><h2 id="alienware-aw3926qw">Alienware AW3926QW</h2><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="Es2s2VDz52FgRe3GBTUWz6" name="TGA26-Alienware-AW3926QW" alt="The Alienware 39 5K2K OLED monitor with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/Es2s2VDz52FgRe3GBTUWz6-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Wait, why are we choosing a gaming monitor for “best monitor”? That’s because the <a href="https://www.tomsguide.com/computing/monitors/alienware-39-5k2k-oled-aw3926qw-review">Alienware AW3926QW</a> is also ideal for everyday work. The curved 39-inch 21:9 tandem OLED panel is not only immersive but also bright and colorful for gaming and reading text documents. You can even switch between 165Hz at 5K for cinematic games and 330Hz at 1080p for competitive titles.</p><p>The expansive 21:9 aspect ratio lets you easily place two or three full-size windows side by side without stacking, boosting your productivity. Thanks to its relatively subdued design and dark color, it looks at home in both professional and casual environments. While the $1,099 asking price might be a tad steep and 39 inches won’t fit every setup, this is about as perfect as a monitor can get—so much so that I gave it a perfect 5 out of 5 score. The AW3926QW is definitely deserving of our best monitor award.</p><p><em>— Tony Polanco, Senior Writer</em></p><h3 class="article-body__section" id="section-best-ar-glasses"><span>Best AR Glasses</span></h3><h2 id="viture-beast">Viture Beast</h2><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="9XYZMifrVqaDKQViLAzmrB" name="TGA26-Razer-Blade-16-(2026)" alt="A person wearing the Viture Beast AR glasses with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/9XYZMifrVqaDKQViLAzmrB-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>After an initially bumpy launch, <a href="https://www.tomsguide.com/computing/smart-glasses/viture-beast-review#section-viture-beast-the-ups">Viture saved the Beast</a> with solid firmware updates that turned an also-ran into the best AR glasses you can buy today. At $549, it’s a premium price, but you’re getting a pair of premium, well-built spectacles that outclass every other set. It starts with a sharp 1200p picture quality thanks to Sony Micro OLED lenses tuned with Viture’s color science.</p><p>These are vivid glasses with great fidelity, spatial anchoring, and a comfortable, adjustable design, meaning you can wear the Beast for longer sessions.</p><p>I like these glasses not just because of what they are, but because Viture took the time to make them better after a poor start. It’s hard to be patient, especially at these prices, but the Viture Beast was worth the wait.</p><p><em>— Scott Younker, News Writer</em></p><h3 class="article-body__section" id="section-best-webcam"><span>Best webcam</span></h3><h2 id="insta360-link-2-pro">Insta360 Link 2 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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DtoYHysbyHJtCin6smAomG" name="TGA26-Insta360_Link_2_Pro-3" alt="The Insta360 Link 2 Pro with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/DtoYHysbyHJtCin6smAomG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/peripherals/insta360-link-2-pro-review">Insta360 Link 2 Pro</a> does everything you could possibly need, from being a helping hand with framing, making presenting a dream, to an impressive low-light performance, so looking good is never an issue. </p><p>It’s an outstanding 4K webcam that has superb autofocus and subject tracking to keep individuals and groups in frame. It uses a two-axis gimbal to follow you around the frame, zooming in so you’re always clear to the viewer. The gesture controls, desk view and whiteboard sharing features completely streamline presentations and make setting up for calls a breeze. It may be expensive and unnecessary for basic calls, but its smart features justify the cost.</p><p><em>— Ashley Thieme, Reviews Staff Writer</em></p><h3 class="article-body__section" id="section-best-tablet"><span>Best tablet</span></h3><h2 id="lenovo-tab-plus-gen-2">Lenovo Tab Plus Gen 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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YaEqmePr6D6aha3ampSGkK" name="TGA26-Lenovo-Tab-Plus-Gen-2" alt="The Lenovo Tab Plus Gen 2 with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/YaEqmePr6D6aha3ampSGkK-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/tablets/lenovo-tab-plus-gen-2-review">Lenovo Tab Plus Gen 2 </a>wins Best Tablet because it does the impossible—delivering exceptional sound for a slate. That’s thanks to the giant JBL 9-unit speaker on its back, which not only gives the tablet a distinctive look but also pumps out rich, loud Dolby Atmos sound. Whether it’s movies, podcasts, or music, everything sounds incredible, a far cry from the thin, tinny mess you’d normally get from other Android tablets.</p><p>In addition to the exceptional sound, the Tab Plus Gen 2 features a 12.1-inch 2.5K 120Hz panel that is bright and sharp. The built-in 360-degree kickstand lets you orient the slate to better suit whatever you’re watching or reading, while the nearly 16-hour battery life ensures you can enjoy your content for as long as you want. While this isn’t a workhorse tablet due to its so-so performance, and it’s a bit cumbersome to hold because of that bulky speaker, it’s a steal of an entertainment-focused slate for $399.</p><p><em>— Tony Polanco, Senior Writer</em></p><h3 class="article-body__section" id="section-best-router"><span>Best router</span></h3><h2 id="asus-rog-rapture-gt-be19000ai">Asus ROG Rapture GT-BE19000AI</h2><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="vzH8EuLPmZ5pkGQ89JNxRk" name="TGA26-Asus-ROG-Rapture-GT-BE19000AI" alt="The Asus ROG Rapture GT-BE19000AI router with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/vzH8EuLPmZ5pkGQ89JNxRk-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Asus continues to push the limits of what’s possible with Wi-Fi 7 and its <a href="https://www.tomsguide.com/computing/routers/asus-rog-rapture-gt-be19000ai-review">ROG Rapture GT-BE19000AI</a> gaming router takes things a step further. In our real world testing, we reached speeds of over 2.5 Gbps at close range but even at 50 feet, we still saw gigabit speeds over Wi-Fi which is almost unheard of at that distance.</p><p>The ROG Rapture GT-BE19000AI comes packed with high-speed multi-gig ports but it’s the router’s built-in AI core and NPU that boost online game performance while securing data and blocking trackers. To top it all off, you get a clear window to see the device’s internals, customizable RGB lighting on top and eight repositionable antennas to guarantee a strong signal in any room.</p><p><em>— Anthony Spadafora, Managing Editor</em></p><h3 class="article-body__section" id="section-best-mesh-router"><span>Best mesh router</span></h3><h2 id="msi-roami-be-pro">MSI Roami BE 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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CBQBRY6YrceXxyBNByV8c3" name="TGA26-MSI-Roami-BE-Pro" alt="The MSI Roami BE Pro with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/CBQBRY6YrceXxyBNByV8c3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Still a relative newcomer in the world of home networking, MSI quickly went from releasing its first gaming router to making mesh Wi-Fi systems for whole home connectivity. The <a href="https://www.tomsguide.com/computing/routers/msi-roamii-be-pro-review">MSI Roamii BE Pro</a> takes the design of its <a href="https://www.tomsguide.com/computing/routers/msi-roamii-be-lite-review">Roamii Be Lite</a> mesh kit and gives it a full-featured Wi-Fi 7 upgrade for even faster speeds. In fact, in our real world testing, we saw speeds of up to 1.8 Gbps at close range.</p><p>The Roamii BE Pro features plenty of multi-gig Ethernet ports on the back of its triangular design and even a USB one for sharing data across your network. However, it’s the very affordable $300 price for a two-pack that really impressed us along with the inclusion of the 6 GHz band for full tri-band connectivity. The MSI Roamii BE Pro offers a quick and easy way to upgrade to Wi-Fi 7 with all the bells and whistles without putting a dent in your wallet.</p><p><em>—- Anthony Spadafora, Managing Editor</em></p><h3 class="article-body__section" id="section-best-antivirus"><span>Best antivirus</span></h3><h2 id="bitdefender">Bitdefender</h2><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="kLHpbTVNZh7C4NY8eyS4n7" name="TGA26-Bitdefender" alt="Bitdefender running on a PC with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/kLHpbTVNZh7C4NY8eyS4n7-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>We’ve tested many antivirus suites, but <a href="https://www.tomsguide.com/computing/antivirus/bitdefender-review">Bitdefender</a> comes out on top for several reasons. It offers extensive protection thanks to anti-theft and anti-scam features which are more important than ever in the age of sophisticated AI-powered scams. Bitdefender sports a clean interface that makes the numerous settings easy to understand, whether you’re on mobile or desktop.</p><p>The included VPN is fantastic, as is the comprehensive Identity Protection. What’s great about Bitdefender is that it doesn’t have a negative impact on system resources either, even when you’re playing intensive games like Cyberpunk 2077. If you prioritize peace of mind against evolving AI and malware threats, Bitdefender is simply exceptional.</p><p><em>— Nikita Achanta, Senior Reviews Writer</em> </p><h3 class="article-body__section" id="section-best-silicon"><span>Best Silicon</span></h3><h2 id="intel-arc-g3-extreme">Intel Arc G3 Extreme</h2><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="HB5j3kC7ieH8iovc38thJG" name="TGA26-Intel-Arc-G3-Extreme" alt="An Intel Arc G3 Extreme chip with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/HB5j3kC7ieH8iovc38thJG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>All kinds of companies have been making impressive moves with new silicon in 2026, so to pick this, I asked one question: which chip made the biggest transformational impact? Through that lens, the answer is simple — <a href="https://www.tomsguide.com/gaming/handheld-gaming/intel-arc-g3-is-here-to-shake-up-handheld-gaming-and-amd-should-be-terrified-acer-predator-atlas-8-is-the-first-out-the-gate">Intel Arc G3 Extreme</a>.</p><p>PC gaming handhelds have been going through this slow, iterative pace with AMD’s chips, and Team Blue just busted through the wall like the Kool-Aid man and brought that monster GPU from its Panther Lake silicon and all the XeSS optimizations that come with it like multi-frame generation.</p><p>The end result is a generational leapfrog moment for handheld gaming that this space has needed for the past few years. It’s highly performant, super power-efficient, and a joy to play on.</p><p>— <em>Jason England, Managing Editor</em></p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/toms-guide-awards-2026</link>
                                                                            <description>
                            <![CDATA[ Here are our Tom's Guide Awards 2026 computing winners, including everything from laptops and monitors to routers and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">odwHv8rD8x5w6vGmbJP6pM</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/gwuJB7VbT78fdzR6ELkpCe-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 16 Sep 2026 06:00:00 +0000</pubDate>                                                                                                                                <updated>Wed, 16 Sep 2026 08:17:58 +0000</updated>
                                                                                                                                            <category><![CDATA[Computing]]></category>
                                                                                                                    <dc:creator><![CDATA[ Tom&#039;s Guide Staff ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/6hCNi5TkwpnQYs6nUTtoPc-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/gwuJB7VbT78fdzR6ELkpCe-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tom&#039;s Guide Awards 2026 Computing]]></media:description>                                                            <media:text><![CDATA[Tom&#039;s Guide Awards 2026 Computing]]></media:text>
                                <media:title type="plain"><![CDATA[Tom&#039;s Guide Awards 2026 Computing]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/gwuJB7VbT78fdzR6ELkpCe-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>This year has been a rollercoaster for the computing industry, with undeniably awesome new products marred by the ongoing RAM crisis. If you're looking for your next powerful laptop, blazing-fast Wi-Fi 7 router or first pair of AR glasses, the landscape has changed. That's why our team of experts has been busy testing out the best computing and home office gear from the last twelve months. </p><p>We've seen laptops deliver twin OLED screens without missing a beat of battery,  peripherals that genuinely make your work life easier and the explosion of AR glasses that are currently redefining what computing even means.</p><p>Below you'll find our picks for the Tom's Guide Awards 2026, with each and every one worthy of a permanent position on your desk.</p><h3 class="article-body__section" id="section-best-laptop"><span>Best laptop</span></h3><h2 id="dell-xps-13">Dell XPS 13</h2><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="mR6kk58fayN9kqjKWjNJ2P" name="TGA26-Dell-XPS-13" alt="The Dell XPS 13 with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/mR6kk58fayN9kqjKWjNJ2P-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/laptops/dell-xps-13-2026-review">Dell XPS 13</a> is the best answer to the MacBook Neo. Don’t let its $699 starting price fool you; it’s far from a shoddy budget laptop. The sturdy CNC aluminum chassis makes it feel like a premium notebook, while the sharp 13.4-inch 2.5K touchscreen display outshines the dim panels on most budget Windows laptops. The XPS 13 is also the lightest XPS laptop ever, and it can last nearly 14 and a half hours — both of which make it an ideal travel partner.</p><p>Thanks to all of that, along with its impressive Wildcat Lake performance for everyday work, this year’s Dell XPS 13 is hard to top (unless you’re married to the Apple ecosystem). As such, the XPS 13 is an easy choice for the best laptop.</p><p><em>— Tony Polanco, Senior Writer</em></p><h3 class="article-body__section" id="section-best-ai-laptop"><span>Best AI laptop</span></h3><h2 id="asus-proart-gopro-edition-px13">Asus ProArt GoPro Edition PX13</h2><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="kasktdzVGLUx57u67C7XCW" name="TGA26-Asus-ProArt-GoPro-Edition-PX13" alt="The Asus ProArt GoPro Edition PX13 with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/kasktdzVGLUx57u67C7XCW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There were many definitions of what makes a good AI laptop, but one is becoming clear: something with the raw GPU power and memory to do the work entirely locally on device. And out of everything I tested this year, the <a href="https://www.tomsguide.com/computing/laptops/asus-proart-gopro-edition-px13-review">Asus ProArt GoPro Edition PX13</a> stood tall. </p><p>The laptop fundamentals are there — a gorgeous utilitarian aesthetic, beautiful OLED display, strong ergonomics and battery life. But with an AMD Ryzen AI MAX+ 395 chip in here and up to 128GB of RAM, you can run massive LLMs and agentic models with ease. Things like OpenAI’s GPT-OSS 120B, Google Gemma 3 27B Vision model or Stable Diffusion.</p><p>I’ve always said that the future of AI is local, not cloud-based. This machine proves it.</p><p><em>— Jason England, Managing Editor</em></p><h3 class="article-body__section" id="section-best-keyboard"><span>Best keyboard</span></h3><h2 id="epomaker-glyph">Epomaker Glyph</h2><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="zU6pQGHHBqkTfTd8eqcpcb" name="TGA26-Epomaker-Glyph" alt="The Epomaker Glyph keyboard with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/zU6pQGHHBqkTfTd8eqcpcb-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-review">Epomaker Glyph</a> is easily the best mechanical keyboard I;ve tested this year, and it’s <em>the </em>deck for speed demons and hardcore typists. Its typewriter-like aesthetics, beautiful RGB lighting, dual screens that display useful keyboard and OS stats, a creamy sound profile, and a typing experience that’s nothing short of stunning — the Glyph does it all.</p><p>It makes a regular day at the office feel more fun, and its accompanying silicone and PVC palm rest ensures all-day comfort, too. I called the Glyph my “<a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-prime-day-2026-deal">dream keyboard</a>,” and after having tested nearly 100 keyboards, it’s my daily driver and one I haven’t stopped using since testing it.</p><p><em>— Nikita Achanta, Senior Reviews Writer</em></p><h3 class="article-body__section" id="section-best-gaming-laptop"><span>Best gaming laptop</span></h3><h2 id="razer-blade-16-2026">Razer Blade 16 (2026)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ncakGEuGRAf8nxcWV77M7N" name="Razer Blade 16 (2026)" alt="The Razer Blade 16 (2026) with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/ncakGEuGRAf8nxcWV77M7N-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/gaming-laptops/razer-blade-16-2026-review">Razer Blade 16 </a>is very expensive but worth every penny, delivering a superlative gaming laptop experience. Inside, it packs an Intel Core Ultra 9 CPU and up to an RTX 5090 for serious horsepower. It looks good doing it, thanks to its classy aluminum chassis, which is as comfortable in an office as it is in a gaming den. Games look as good as they perform, thanks to the gorgeous 16-inch 240Hz OLED panel.</p><p>At 4.7 pounds, you’ll definitely feel it in your bag when you’re traveling. This is offset by its exceptional battery life, which can last upwards of 13 hours for basic productivity tasks. However, it can run hot and loud when gaming or rendering videos—not to mention that it lasts less than two hours on a charge when gaming. Those quibbles aside, this is a brilliant gaming laptop, so long as you can afford it.</p><p><em>— Tony Polanco, Senior Writer</em></p><h3 class="article-body__section" id="section-best-2-in-1-laptop"><span>Best 2-in-1 laptop</span></h3><h2 id="asus-zenbook-duo">Asus Zenbook Duo</h2><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="TrDa9XcFc8fGwgJGRQnVzR" name="TGA26-Asus-Zenbook-Duo" alt="The Asus Zenbook Duo with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/TrDa9XcFc8fGwgJGRQnVzR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I mean, this one was kind of expected! The <a href="https://www.tomsguide.com/computing/laptops/asus-zenbook-duo-2026-review">Asus Zenbook Duo</a> rewrote the rules on what to expect from a 2-in-1 a couple years ago, and now with this redesign and Intel Core Ultra Series 3 pumping through its veins, it’s the first real time that this dual-screen laptop form factor feels truly ready for prime time.</p><p>That monster chip keeps everything running oh so smoothly, while offering a beasty GPU to pull off some shockingly good gaming performance. And Asus has really paid attention to overhauling the design here with a sturdier hinge, a great-feeling keyboard and touchpad, and those dual 14-inch OLED touchscreens are a mesmerizing joy to use.</p><p><em>— Jason England,  Managing Editor</em></p><h3 class="article-body__section" id="section-best-mini-pc"><span>Best mini PC</span></h3><h2 id="minisforum-g1-pro">Minisforum G1 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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JBV4vo7kk5veBQuzodrUTe" name="TGA26-Minisforum-G1-Pro" alt="The Minisforum G1 Pro with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/JBV4vo7kk5veBQuzodrUTe-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The days of dragging a big, old desktop computer over to your living room to play on your TV are over now that we have full-featured mini PCs built for gaming like the <a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/minisforum-g1-pro-review">Minisforum G1 Pro</a>. Although it’s smaller than a PS5 Pro, this mini PC still comes packed with powerful internals like an AMD Ryzen 9 8945HX processor and a discrete Nvidia RTX 5060 GPU.</p><p>Moving the G1 Pro from room to room is a breeze too thanks to the fact that it has a built-in, 350W power supply instead of a bulky power brick. Despite its small size, you can easily open the G1 Pro to upgrade its memory, storage and potentially even its graphics card down the line. Minisforum has been making excellent mini PCs for years but the G1 Pro is the closest we’ve come yet to a true console replacement, and it easily beats Valve’s Steam Machine when it comes to performance.</p><p><em>— Anthony Spadafora, Managing Editor</em></p><h3 class="article-body__section" id="section-best-monitor"><span>Best monitor</span></h3><h2 id="alienware-aw3926qw">Alienware AW3926QW</h2><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="Es2s2VDz52FgRe3GBTUWz6" name="TGA26-Alienware-AW3926QW" alt="The Alienware 39 5K2K OLED monitor with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/Es2s2VDz52FgRe3GBTUWz6-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Wait, why are we choosing a gaming monitor for “best monitor”? That’s because the <a href="https://www.tomsguide.com/computing/monitors/alienware-39-5k2k-oled-aw3926qw-review">Alienware AW3926QW</a> is also ideal for everyday work. The curved 39-inch 21:9 tandem OLED panel is not only immersive but also bright and colorful for gaming and reading text documents. You can even switch between 165Hz at 5K for cinematic games and 330Hz at 1080p for competitive titles.</p><p>The expansive 21:9 aspect ratio lets you easily place two or three full-size windows side by side without stacking, boosting your productivity. Thanks to its relatively subdued design and dark color, it looks at home in both professional and casual environments. While the $1,099 asking price might be a tad steep and 39 inches won’t fit every setup, this is about as perfect as a monitor can get—so much so that I gave it a perfect 5 out of 5 score. The AW3926QW is definitely deserving of our best monitor award.</p><p><em>— Tony Polanco, Senior Writer</em></p><h3 class="article-body__section" id="section-best-ar-glasses"><span>Best AR Glasses</span></h3><h2 id="viture-beast">Viture Beast</h2><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="9XYZMifrVqaDKQViLAzmrB" name="TGA26-Razer-Blade-16-(2026)" alt="A person wearing the Viture Beast AR glasses with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/9XYZMifrVqaDKQViLAzmrB-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>After an initially bumpy launch, <a href="https://www.tomsguide.com/computing/smart-glasses/viture-beast-review#section-viture-beast-the-ups">Viture saved the Beast</a> with solid firmware updates that turned an also-ran into the best AR glasses you can buy today. At $549, it’s a premium price, but you’re getting a pair of premium, well-built spectacles that outclass every other set. It starts with a sharp 1200p picture quality thanks to Sony Micro OLED lenses tuned with Viture’s color science.</p><p>These are vivid glasses with great fidelity, spatial anchoring, and a comfortable, adjustable design, meaning you can wear the Beast for longer sessions.</p><p>I like these glasses not just because of what they are, but because Viture took the time to make them better after a poor start. It’s hard to be patient, especially at these prices, but the Viture Beast was worth the wait.</p><p><em>— Scott Younker, News Writer</em></p><h3 class="article-body__section" id="section-best-webcam"><span>Best webcam</span></h3><h2 id="insta360-link-2-pro">Insta360 Link 2 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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DtoYHysbyHJtCin6smAomG" name="TGA26-Insta360_Link_2_Pro-3" alt="The Insta360 Link 2 Pro with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/DtoYHysbyHJtCin6smAomG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/peripherals/insta360-link-2-pro-review">Insta360 Link 2 Pro</a> does everything you could possibly need, from being a helping hand with framing, making presenting a dream, to an impressive low-light performance, so looking good is never an issue. </p><p>It’s an outstanding 4K webcam that has superb autofocus and subject tracking to keep individuals and groups in frame. It uses a two-axis gimbal to follow you around the frame, zooming in so you’re always clear to the viewer. The gesture controls, desk view and whiteboard sharing features completely streamline presentations and make setting up for calls a breeze. It may be expensive and unnecessary for basic calls, but its smart features justify the cost.</p><p><em>— Ashley Thieme, Reviews Staff Writer</em></p><h3 class="article-body__section" id="section-best-tablet"><span>Best tablet</span></h3><h2 id="lenovo-tab-plus-gen-2">Lenovo Tab Plus Gen 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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YaEqmePr6D6aha3ampSGkK" name="TGA26-Lenovo-Tab-Plus-Gen-2" alt="The Lenovo Tab Plus Gen 2 with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/YaEqmePr6D6aha3ampSGkK-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/tablets/lenovo-tab-plus-gen-2-review">Lenovo Tab Plus Gen 2 </a>wins Best Tablet because it does the impossible—delivering exceptional sound for a slate. That’s thanks to the giant JBL 9-unit speaker on its back, which not only gives the tablet a distinctive look but also pumps out rich, loud Dolby Atmos sound. Whether it’s movies, podcasts, or music, everything sounds incredible, a far cry from the thin, tinny mess you’d normally get from other Android tablets.</p><p>In addition to the exceptional sound, the Tab Plus Gen 2 features a 12.1-inch 2.5K 120Hz panel that is bright and sharp. The built-in 360-degree kickstand lets you orient the slate to better suit whatever you’re watching or reading, while the nearly 16-hour battery life ensures you can enjoy your content for as long as you want. While this isn’t a workhorse tablet due to its so-so performance, and it’s a bit cumbersome to hold because of that bulky speaker, it’s a steal of an entertainment-focused slate for $399.</p><p><em>— Tony Polanco, Senior Writer</em></p><h3 class="article-body__section" id="section-best-router"><span>Best router</span></h3><h2 id="asus-rog-rapture-gt-be19000ai">Asus ROG Rapture GT-BE19000AI</h2><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="vzH8EuLPmZ5pkGQ89JNxRk" name="TGA26-Asus-ROG-Rapture-GT-BE19000AI" alt="The Asus ROG Rapture GT-BE19000AI router with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/vzH8EuLPmZ5pkGQ89JNxRk-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Asus continues to push the limits of what’s possible with Wi-Fi 7 and its <a href="https://www.tomsguide.com/computing/routers/asus-rog-rapture-gt-be19000ai-review">ROG Rapture GT-BE19000AI</a> gaming router takes things a step further. In our real world testing, we reached speeds of over 2.5 Gbps at close range but even at 50 feet, we still saw gigabit speeds over Wi-Fi which is almost unheard of at that distance.</p><p>The ROG Rapture GT-BE19000AI comes packed with high-speed multi-gig ports but it’s the router’s built-in AI core and NPU that boost online game performance while securing data and blocking trackers. To top it all off, you get a clear window to see the device’s internals, customizable RGB lighting on top and eight repositionable antennas to guarantee a strong signal in any room.</p><p><em>— Anthony Spadafora, Managing Editor</em></p><h3 class="article-body__section" id="section-best-mesh-router"><span>Best mesh router</span></h3><h2 id="msi-roami-be-pro">MSI Roami BE 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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CBQBRY6YrceXxyBNByV8c3" name="TGA26-MSI-Roami-BE-Pro" alt="The MSI Roami BE Pro with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/CBQBRY6YrceXxyBNByV8c3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Still a relative newcomer in the world of home networking, MSI quickly went from releasing its first gaming router to making mesh Wi-Fi systems for whole home connectivity. The <a href="https://www.tomsguide.com/computing/routers/msi-roamii-be-pro-review">MSI Roamii BE Pro</a> takes the design of its <a href="https://www.tomsguide.com/computing/routers/msi-roamii-be-lite-review">Roamii Be Lite</a> mesh kit and gives it a full-featured Wi-Fi 7 upgrade for even faster speeds. In fact, in our real world testing, we saw speeds of up to 1.8 Gbps at close range.</p><p>The Roamii BE Pro features plenty of multi-gig Ethernet ports on the back of its triangular design and even a USB one for sharing data across your network. However, it’s the very affordable $300 price for a two-pack that really impressed us along with the inclusion of the 6 GHz band for full tri-band connectivity. The MSI Roamii BE Pro offers a quick and easy way to upgrade to Wi-Fi 7 with all the bells and whistles without putting a dent in your wallet.</p><p><em>—- Anthony Spadafora, Managing Editor</em></p><h3 class="article-body__section" id="section-best-antivirus"><span>Best antivirus</span></h3><h2 id="bitdefender">Bitdefender</h2><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="kLHpbTVNZh7C4NY8eyS4n7" name="TGA26-Bitdefender" alt="Bitdefender running on a PC with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/kLHpbTVNZh7C4NY8eyS4n7-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>We’ve tested many antivirus suites, but <a href="https://www.tomsguide.com/computing/antivirus/bitdefender-review">Bitdefender</a> comes out on top for several reasons. It offers extensive protection thanks to anti-theft and anti-scam features which are more important than ever in the age of sophisticated AI-powered scams. Bitdefender sports a clean interface that makes the numerous settings easy to understand, whether you’re on mobile or desktop.</p><p>The included VPN is fantastic, as is the comprehensive Identity Protection. What’s great about Bitdefender is that it doesn’t have a negative impact on system resources either, even when you’re playing intensive games like Cyberpunk 2077. If you prioritize peace of mind against evolving AI and malware threats, Bitdefender is simply exceptional.</p><p><em>— Nikita Achanta, Senior Reviews Writer</em> </p><h3 class="article-body__section" id="section-best-silicon"><span>Best Silicon</span></h3><h2 id="intel-arc-g3-extreme">Intel Arc G3 Extreme</h2><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="HB5j3kC7ieH8iovc38thJG" name="TGA26-Intel-Arc-G3-Extreme" alt="An Intel Arc G3 Extreme chip with a TG Awards 2026 badge" src="https://cdn.mos.cms.futurecdn.net/HB5j3kC7ieH8iovc38thJG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>All kinds of companies have been making impressive moves with new silicon in 2026, so to pick this, I asked one question: which chip made the biggest transformational impact? Through that lens, the answer is simple — <a href="https://www.tomsguide.com/gaming/handheld-gaming/intel-arc-g3-is-here-to-shake-up-handheld-gaming-and-amd-should-be-terrified-acer-predator-atlas-8-is-the-first-out-the-gate">Intel Arc G3 Extreme</a>.</p><p>PC gaming handhelds have been going through this slow, iterative pace with AMD’s chips, and Team Blue just busted through the wall like the Kool-Aid man and brought that monster GPU from its Panther Lake silicon and all the XeSS optimizations that come with it like multi-frame generation.</p><p>The end result is a generational leapfrog moment for handheld gaming that this space has needed for the past few years. It’s highly performant, super power-efficient, and a joy to play on.</p><p>— <em>Jason England, Managing Editor</em></p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The Tom's Guide Awards 2026 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Welcome to the 2026 Tom's Guide Awards! Our annual awards celebrate the best tech, tools, gear, and services we've used over the past year, culminating with our Hero awards, which celebrate the very best innovation, company, and product design, among others.</p><p>Without further ado, here are all the winners of this year's Tom's Guide Awards.</p><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/tech-events/toms-guide-hero-awards-2026"><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/cDMdRfidYEwszGb7xdjmLE.jpg" alt="Tom's Guide Awards 2026"></p></div><div class="card__content"><h3 class="card__title">TG Hero Awards</h3><div class="card__description-wrapper"><div class="card__description"><p><strong>The brands, innovations and products that excite us most</strong></p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/phones/toms-guide-awards-2026"><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/tRjsMHd8hKNf5Se3YPveFg.jpg" alt="Tom's Guide Awards 2026 Phones"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Phones</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite phones of the year </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/tvs/toms-guide-awards-2026"><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/PKDeUngVQpQwehWohuZnJL.jpg" alt="Tom's Guide Awards 2026 TVs"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: TVs</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite OLED, Mini-LED, RGB TVs and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/wellness/fitness/toms-guide-awards-2026"><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/DsS3VdzYDMuYEU9QcvW6pi.jpg" alt="Tom's Guide Awards 2026 Active Life"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Active Life</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite fitness trackers, workout headphones, recovery tools and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/computing/toms-guide-awards-2026"><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/gwuJB7VbT78fdzR6ELkpCe.jpg" alt="Tom's Guide Awards 2026 Computing"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Computing</h3><div class="card__description-wrapper"><div class="card__description"><p>All our favorite laptops, tablets, AR glasses and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/audio/toms-guide-awards-2026"><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/whkD8Gh5uHn8bPNnG2rM2M.jpg" alt="Tom's Guide Awards 2026 Audio"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Audio</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite headphones, earbuds, speakers and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/ai/toms-guide-awards-2026"><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/k6rknMfVrBs6eK8KtzQFRE.jpg" alt="Tom's Guide Awards 2026 AI"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: AI</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite AI tools, devices and features </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/gaming/toms-guide-awards-2026"><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/8fBXAu3nU9FhPKZsswNDDa.jpg" alt="Tom's Guide Awards 2026 Gaming"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Gaming</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite gaming accessories, consoles, controllers and more</p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/home/toms-guide-awards-2026"><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/zGZFHNMWutFoAVjdYGosXF.jpg" alt="Tom's Guide Awards 2026 logo and winning products for the Homes category"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Homes</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite robot vacuums, coffee machines, air fryers and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/wellness/sleep/toms-guide-awards-2026"><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/KTLabKKQnNuTnmmfTBtfX5.jpg" alt="TG Awards 2026 Sleep"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Sleep</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite mattresses, toppers, pillows and more for getting a good night's sleep </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/vehicle-tech/toms-guide-awards-2026"><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/9g6QHtxVQVmYLGPvEXiLPT.jpg" alt="Tom's Guide Awards 2026 Automotive"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Autos</h3><div class="card__description-wrapper"><div class="card__description"><p>All our favorite cars of the year from EVs to hybrids and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/cameras-photography/toms-guide-awards-2026"><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/BaG3gmjXLA8coeFauDjmd5.jpg" alt="Tom's Guide Awards 2026 Photography"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Photography</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite action cameras, film cameras, drones and more </p></div></div></div></a> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/tech-events/the-toms-guide-awards-2026</link>
                                                                            <description>
                            <![CDATA[ The Tom's Guide Awards are back and here you'll find all the winners across 12 categories from phones and TVs to sleep and cars. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ksVD8heDw8UVHxoshvrqWo</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/meJJzGfNmwUx4DydNoXNwh-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 15 Sep 2026 21:02:31 +0000</pubDate>                                                                                                                                <updated>Thu, 17 Sep 2026 14:22:58 +0000</updated>
                                                                                                                                            <category><![CDATA[Tech Events]]></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/meJJzGfNmwUx4DydNoXNwh-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tom&#039;s Guide Awards 2026 logo on a glowing blue background]]></media:description>                                                            <media:text><![CDATA[Tom&#039;s Guide Awards 2026 logo on a glowing blue background]]></media:text>
                                <media:title type="plain"><![CDATA[Tom&#039;s Guide Awards 2026 logo on a glowing blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/meJJzGfNmwUx4DydNoXNwh-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Welcome to the 2026 Tom's Guide Awards! Our annual awards celebrate the best tech, tools, gear, and services we've used over the past year, culminating with our Hero awards, which celebrate the very best innovation, company, and product design, among others.</p><p>Without further ado, here are all the winners of this year's Tom's Guide Awards.</p><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/tech-events/toms-guide-hero-awards-2026"><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/cDMdRfidYEwszGb7xdjmLE.jpg" alt="Tom's Guide Awards 2026"></p></div><div class="card__content"><h3 class="card__title">TG Hero Awards</h3><div class="card__description-wrapper"><div class="card__description"><p><strong>The brands, innovations and products that excite us most</strong></p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/phones/toms-guide-awards-2026"><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/tRjsMHd8hKNf5Se3YPveFg.jpg" alt="Tom's Guide Awards 2026 Phones"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Phones</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite phones of the year </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/tvs/toms-guide-awards-2026"><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/PKDeUngVQpQwehWohuZnJL.jpg" alt="Tom's Guide Awards 2026 TVs"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: TVs</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite OLED, Mini-LED, RGB TVs and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/wellness/fitness/toms-guide-awards-2026"><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/DsS3VdzYDMuYEU9QcvW6pi.jpg" alt="Tom's Guide Awards 2026 Active Life"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Active Life</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite fitness trackers, workout headphones, recovery tools and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/computing/toms-guide-awards-2026"><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/gwuJB7VbT78fdzR6ELkpCe.jpg" alt="Tom's Guide Awards 2026 Computing"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Computing</h3><div class="card__description-wrapper"><div class="card__description"><p>All our favorite laptops, tablets, AR glasses and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/audio/toms-guide-awards-2026"><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/whkD8Gh5uHn8bPNnG2rM2M.jpg" alt="Tom's Guide Awards 2026 Audio"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Audio</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite headphones, earbuds, speakers and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/ai/toms-guide-awards-2026"><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/k6rknMfVrBs6eK8KtzQFRE.jpg" alt="Tom's Guide Awards 2026 AI"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: AI</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite AI tools, devices and features </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/gaming/toms-guide-awards-2026"><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/8fBXAu3nU9FhPKZsswNDDa.jpg" alt="Tom's Guide Awards 2026 Gaming"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Gaming</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite gaming accessories, consoles, controllers and more</p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/home/toms-guide-awards-2026"><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/zGZFHNMWutFoAVjdYGosXF.jpg" alt="Tom's Guide Awards 2026 logo and winning products for the Homes category"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Homes</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite robot vacuums, coffee machines, air fryers and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/wellness/sleep/toms-guide-awards-2026"><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/KTLabKKQnNuTnmmfTBtfX5.jpg" alt="TG Awards 2026 Sleep"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Sleep</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite mattresses, toppers, pillows and more for getting a good night's sleep </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/vehicle-tech/toms-guide-awards-2026"><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/9g6QHtxVQVmYLGPvEXiLPT.jpg" alt="Tom's Guide Awards 2026 Automotive"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Autos</h3><div class="card__description-wrapper"><div class="card__description"><p>All our favorite cars of the year from EVs to hybrids and more </p></div></div></div></a><a class="card card--standard card--rows-3 card--align-inline" href="https://www.tomsguide.com/cameras-photography/toms-guide-awards-2026"><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/BaG3gmjXLA8coeFauDjmd5.jpg" alt="Tom's Guide Awards 2026 Photography"></p></div><div class="card__content"><h3 class="card__title">TG Awards 2026: Photography</h3><div class="card__description-wrapper"><div class="card__description"><p>Our favorite action cameras, film cameras, drones and more </p></div></div></div></a>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Microsoft just patched over 1,000 flaws in Windows, but you might want to wait to update your PC — here's why ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Earlier this month, Microsoft released a massive <a href="https://support.microsoft.com/en-us/servicing/os/windows-11/2026/09/kb5129194-windows-11-26h1-security-update">September patch Tuesday update</a> that fixed nearly 1,000 flaws in Windows 11. Unfortunately, that huge patch also introduced several bugs that are seriously affecting some PCs. </p><p>The company has started issuing some "<a href="https://support.microsoft.com/en-us/servicing/os/windows-11/2026/09/kb5129194-windows-11-26h1-security-update" target="_blank">out-of-band" emergency patches</a> to fix things like Remote Desktop, USB audio and Hyper-V issues. Here's what you need to know if you're thinking about upgrading your Windows PC.</p><h2 id="what-the-patches-do-and-don-39-t-fix">What the patches do and don't fix</h2><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="BFLGkjXo46Xy3iTjDojpeC" name="server rack with internet patch cord cables.jpg" alt="Close up of networks server rack with internet patch cord cables connected to patch panel." src="https://cdn.mos.cms.futurecdn.net/BFLGkjXo46Xy3iTjDojpeC-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>The 25H2 brings back the return of the movable taskbar and a more configurable Start menu. </p><p>The emergency patches address issues with folder shares on Hyper-V-based Linux virtual machines, Remote Desktop Services sessions and some USB audio devices.</p><p>However, Explorer could display a black screen after logging in. The computer is usable-ish, but you won't be able to see the UI. Also, File History backup may not detect external drives, which makes that useless.</p><h2 id="why-you-may-not-want-to-upgrade">Why you may not want to upgrade</h2><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="FvokEXxfdYN76P6RzwemuZ" name="AMD Radeon RX 9070" alt="AMD Radeon RX 9070" src="https://cdn.mos.cms.futurecdn.net/FvokEXxfdYN76P6RzwemuZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>As reported by <a href="https://www.windowslatest.com/2026/09/12/microsoft-admits-windows-11s-biggest-september-update-is-breaking-multiple-features-days-after-it-warned-users-not-to-delay-updates/" target="_blank">Windows Latest</a>, the <strong>Patch Tuesday update appears to be breaking some PCs with AMD Radeon GPUs</strong>, causing them to crash. This is apparently due to the update causing driver instability. </p><p>Uninstalling and reinstalling the driver does not appear to help and apparently affects most current AMD cards. Reading through the emergency patches, Microsoft did not mention any fixes for AMD GPUs.</p><p>If you've already updated, you may want to rollback your PC to before the August Patch Tuesday, if you can. You can do this by going to <strong>Settings - Recovery </strong>and going to <strong>Go Back </strong>or <strong>Point-in-time restore</strong>. </p><p>Reportedly, <strong>HP and Lenovo PCs should also consider holding off</strong>. For HP PCs, the update can apparently trigger BIOS corruption, leading to a failed install, meaning you can't recover the operating system. Per <a href="https://www.neowin.net/news/windows-11-kb5121003-allegedly-corrupts-bios-leading-to-installation-fails-on-hp-systems/" target="_blank">Neowin</a>, HP is introducing a BIOS revision, so it's not clear whether the patch is to blame or it's something on HP's side of the fence.</p><p>For Lenovo machines, the <a href="https://www.neowin.net/news/user-finds-why-windows-11-kb5121003-may-automatically-cut-power-on-lenovo-pcs/" target="_blank">computer might shut down</a> randomly or black-screen, which is being blamed on power mismanagement.</p><p>Have you experienced issues with your Windows PC after updating? Let us know in the comments, and how you resolved it.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/ai-is-turning-ordinary-photos-of-kids-into-sexual-abuse-imagery-heres-how-to-protect-your-family">AI is turning ordinary photos of kids into sexual abuse imagery — here's how to protect your family</a></li><li><a href="https://www.tomsguide.com/computing/online-security/over-150-million-drivers-licenses-stolen-in-massive-data-breach-after-hackers-reportedly-hit-major-identity-verification-company-what-to-do-now">Over 150 million driver's licenses stolen in massive data breach after hackers reportedly hit major identity verification company — what to do now</a></li><li><a href="https://www.tomsguide.com/computing/password-managers/keeper-password-manager-safeguards-your-online-accounts-and-its-50-percent-off">Keeper password manager safeguards your online accounts and it's 50% off</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/windows-operating-systems/microsoft-just-patched-over-1-000-flaws-in-windows-but-you-might-want-to-wait-to-update-your-pc-heres-why</link>
                                                                            <description>
                            <![CDATA[ Microsoft's September Patch Tuesday fixed over 1,000 flaws but introduced some serious new ones. Should you upgrade? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">THD7wvfKTNdZpGGsiZAnLT</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/PQDoij7pbihTEcxmBY7ni4-1920-80.jpeg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 15 Sep 2026 18:33:34 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;br&gt;Send secure tips on Signal: scyo1.55.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/PQDoij7pbihTEcxmBY7ni4-1920-80.jpeg">
                                                            <media:credit><![CDATA[Albacore on Twitter]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Windows 11]]></media:description>                                                            <media:text><![CDATA[Windows 11]]></media:text>
                                <media:title type="plain"><![CDATA[Windows 11]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/PQDoij7pbihTEcxmBY7ni4-1920-80.jpeg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Earlier this month, Microsoft released a massive <a href="https://support.microsoft.com/en-us/servicing/os/windows-11/2026/09/kb5129194-windows-11-26h1-security-update">September patch Tuesday update</a> that fixed nearly 1,000 flaws in Windows 11. Unfortunately, that huge patch also introduced several bugs that are seriously affecting some PCs. </p><p>The company has started issuing some "<a href="https://support.microsoft.com/en-us/servicing/os/windows-11/2026/09/kb5129194-windows-11-26h1-security-update" target="_blank">out-of-band" emergency patches</a> to fix things like Remote Desktop, USB audio and Hyper-V issues. Here's what you need to know if you're thinking about upgrading your Windows PC.</p><h2 id="what-the-patches-do-and-don-39-t-fix">What the patches do and don't fix</h2><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="BFLGkjXo46Xy3iTjDojpeC" name="server rack with internet patch cord cables.jpg" alt="Close up of networks server rack with internet patch cord cables connected to patch panel." src="https://cdn.mos.cms.futurecdn.net/BFLGkjXo46Xy3iTjDojpeC-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>The 25H2 brings back the return of the movable taskbar and a more configurable Start menu. </p><p>The emergency patches address issues with folder shares on Hyper-V-based Linux virtual machines, Remote Desktop Services sessions and some USB audio devices.</p><p>However, Explorer could display a black screen after logging in. The computer is usable-ish, but you won't be able to see the UI. Also, File History backup may not detect external drives, which makes that useless.</p><h2 id="why-you-may-not-want-to-upgrade">Why you may not want to upgrade</h2><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="FvokEXxfdYN76P6RzwemuZ" name="AMD Radeon RX 9070" alt="AMD Radeon RX 9070" src="https://cdn.mos.cms.futurecdn.net/FvokEXxfdYN76P6RzwemuZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>As reported by <a href="https://www.windowslatest.com/2026/09/12/microsoft-admits-windows-11s-biggest-september-update-is-breaking-multiple-features-days-after-it-warned-users-not-to-delay-updates/" target="_blank">Windows Latest</a>, the <strong>Patch Tuesday update appears to be breaking some PCs with AMD Radeon GPUs</strong>, causing them to crash. This is apparently due to the update causing driver instability. </p><p>Uninstalling and reinstalling the driver does not appear to help and apparently affects most current AMD cards. Reading through the emergency patches, Microsoft did not mention any fixes for AMD GPUs.</p><p>If you've already updated, you may want to rollback your PC to before the August Patch Tuesday, if you can. You can do this by going to <strong>Settings - Recovery </strong>and going to <strong>Go Back </strong>or <strong>Point-in-time restore</strong>. </p><p>Reportedly, <strong>HP and Lenovo PCs should also consider holding off</strong>. For HP PCs, the update can apparently trigger BIOS corruption, leading to a failed install, meaning you can't recover the operating system. Per <a href="https://www.neowin.net/news/windows-11-kb5121003-allegedly-corrupts-bios-leading-to-installation-fails-on-hp-systems/" target="_blank">Neowin</a>, HP is introducing a BIOS revision, so it's not clear whether the patch is to blame or it's something on HP's side of the fence.</p><p>For Lenovo machines, the <a href="https://www.neowin.net/news/user-finds-why-windows-11-kb5121003-may-automatically-cut-power-on-lenovo-pcs/" target="_blank">computer might shut down</a> randomly or black-screen, which is being blamed on power mismanagement.</p><p>Have you experienced issues with your Windows PC after updating? Let us know in the comments, and how you resolved it.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/ai-is-turning-ordinary-photos-of-kids-into-sexual-abuse-imagery-heres-how-to-protect-your-family">AI is turning ordinary photos of kids into sexual abuse imagery — here's how to protect your family</a></li><li><a href="https://www.tomsguide.com/computing/online-security/over-150-million-drivers-licenses-stolen-in-massive-data-breach-after-hackers-reportedly-hit-major-identity-verification-company-what-to-do-now">Over 150 million driver's licenses stolen in massive data breach after hackers reportedly hit major identity verification company — what to do now</a></li><li><a href="https://www.tomsguide.com/computing/password-managers/keeper-password-manager-safeguards-your-online-accounts-and-its-50-percent-off">Keeper password manager safeguards your online accounts and it's 50% off</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Googlebook laptops finally have a pre-order date — 3 reasons why it could replace my MacBook ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Google is finally ready to let everyone get their hands on the new <a href="https://www.tomsguide.com/computing/laptops/google-announces-high-end-googlebook-laptops-to-compete-with-macbooks-heres-what-you-need-to-know">Googlebook</a> laptops. Sporting a combination of Android and ChromeOS, these premium devices could be what we've always hoped the <a href="https://www.tomsguide.com/best-picks/best-chromebooks">best Chromebooks</a> would be. </p><p>The company says these devices are "a new category of laptops built with Gemini’s helpfulness at its core, designed to work seamlessly with the devices in your life and powered by premium hardware." Whether they can compete with the <a href="https://www.tomsguide.com/best-picks/best-macbook">top MacBooks</a> and <a href="https://www.tomsguide.com/computing/laptops/best-windows-laptops">premium Windows laptops</a> remains to be seen, but I'm definitely excited to give one a shot, since it sounds like a streamlined laptop with some cool features.</p><p>And now that Google has announced that the laptops will be available for pre-order on September 21, I don't have to wait too long to get my hands on one. </p><p>Could it be my new daily laptop, <a href="https://www.tomsguide.com/computing/i-switched-from-my-laptop-to-the-ipad-pro-m5-and-its-now-a-tablet-i-can-finally-work-on">replacing my MacBook Air</a>? Maybe. Here are three reasons why I think it's possible and why I can't wait to add one of these to my daily workflow.</p><h2 id="google-39-s-magic-pointer">Google's Magic Pointer</h2><div class="looped-video"><video class="lazyload-in-view lazyloading" data-src="https://storage.googleapis.com/gweb-uniblog-publish-prod/original_videos/Magic_Pointer.mp4" autoplay loop muted playsinline src="https://storage.googleapis.com/gweb-uniblog-publish-prod/original_videos/Magic_Pointer.mp4"></video></div><p>For my money, the coolest feature of Googlebooks is the <a href="https://www.tomsguide.com/computing/laptops/googlebooks-vs-chromebooks">Magic Pointer</a>. The mouse cursor has stayed pretty much the same over the years, which makes sense, since it does its job well. </p><p>But with all the AI features baked into Googlebooks, it's finally getting a useful tweak. When you give it a wiggle, the laptop will show you contextual information about what it's pointing at (a bit like <a href="https://www.tomsguide.com/ai/ai-image-video/chatgpt-vision-vs-google-lens-i-tested-7-prompts-and-one-was-the-clear-winner">Google Lens</a> or <a href="https://www.tomsguide.com/ai/i-use-googles-ai-to-thrift-for-my-big-family-these-are-the-5-features-that-actually-save-me-money">Circle to Search</a> for your laptop).</p><p>I don't know about you, but I feel like I'm constantly stumbling upon things I'd like to know more about online, and this feature sounds like a nice time-saver for looking up information. Plus, it's a very visually appealing cursor.</p><h2 id="android-integration">Android integration</h2><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="WMPZAZij5g6FrzYrc2kJDM" name="🎬 Watch The Android Show _ I_O Edition 2026 39-49 screenshot" alt="Googlebook fact sheet" src="https://cdn.mos.cms.futurecdn.net/WMPZAZij5g6FrzYrc2kJDM-1920-80.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: Google)</span></figcaption></figure><p>This is a no-brainer for anyone who's ever used a Chromebook. Web apps are great, but in most cases, Android apps offer vastly superior features. And while ChromeOS emulates Android apps, it doesn't always work well. With Googlebooks, the apps are native. </p><p>In fact, in an interview with <a href="https://chromeunboxed.com/google-confirms-native-premium-apps-will-be-ready-for-googlebook-launch/#google_vignette" target="_blank">Chrome Unboxed</a>, Google VP John Maletis said, “We now have an ability to run truly native Android applications, not emulated. So performance of these apps is incredible.” That sounds like a vast improvement over Chromebooks.</p><p>You'll also be able to cast apps from your Android phone to your Googlebook, which will fill in the gaps for any apps that aren't natively supported.</p><h2 id="custom-widgets">Custom widgets</h2><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="crbw8G4bMg5Rf67xcqSckj" name="🎬 Watch The Android Show _ I_O Edition 2026 36-56 screenshot" alt="Custom Widget on Googlebook" src="https://cdn.mos.cms.futurecdn.net/crbw8G4bMg5Rf67xcqSckj-1920-80.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: Google)</span></figcaption></figure><p>What's so exciting about widgets? Just about every laptop in recent memory has had widget support for apps in one form or another. </p><p>Well, what makes these so cool is that you can create them on the fly using Gemini, so you're not limited to a bunch of predetermined functions. If you want something specific, you can describe the widget and make it exist.</p><p>Google shows an example of someone asking for a custom tracker for an upcoming trip, but there are tons of potential use cases, like live-tracking a package, controlling your music across multiple platforms and so on.</p><h2 id="what-39-s-missing">What's missing</h2><p>While September 21 at 9 a.m. ET is right around the corner, and we know brands like Acer, ASUS, Dell, HP and Lenovo are on board; the big unknown is the final price of the new Googlebooks. </p><p>The anticipated price is between $700 and $1,000, positioning these as premium laptops. Stay tuned for our hands-on impressions to see if these Googlebooks live up to the hype.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/google-just-revealed-gemini-intelligence-and-it-could-change-android-forever">Google just revealed ‘Gemini Intelligence’</a></li><li><a href="https://www.tomsguide.com/phones/android-auto-is-about-to-change-the-way-you-drive-3d-google-maps-redesigned-interface-video-support-gemini-and-more">Android Auto is about to change the way you drive</a></li><li><a href="https://www.tomsguide.com/ai/i-gave-chatgpt-permission-to-disagree-with-me-with-this-prompt-and-its-responses-became-dramatically-better">I gave ChatGPT permission to disagree with me with this prompt</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/googlebook-laptops-finally-have-a-pre-order-date-3-reasons-why-it-could-replace-my-macbook</link>
                                                                            <description>
                            <![CDATA[ The long-awaited Googlebook from Google finally has a pre-order date, and you can lock one in sooner than you might think. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">VVRv2pv2t7LESMZ89eHHv6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/LmeePyFfScRBwtPjJKrxA9-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 15 Sep 2026 12:32:32 +0000</pubDate>                                                                                                                                <updated>Tue, 15 Sep 2026 12:34:19 +0000</updated>
                                                                                                                                            <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></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-320-70.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Dave LeClair is the Managing News Editor for Tom&#039;s Guide, keeping his finger on the pulse of all things technology. He loves taking the complicated happenings in the tech world and explaining why they matter. Whether Apple is announcing the next big thing in the mobile space or a small startup advancing generative AI, Dave will apply his experience to help you figure out what&#039;s happening and why it&#039;s relevant to your life.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Before Tom&#039;s Guide, Dave worked for publications like PCMag, Pocket-lint, MUO, How-To Geek, Digital Trends, and others. He started writing about technology professionally for MUO in 2011 and hasn&#039;t looked back since. In addition to news, you can find reviews, how-to pieces, shopping guides, and many other types of content with Dave&#039;s name attached.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/LmeePyFfScRBwtPjJKrxA9-1920-80.jpg">
                                                            <media:credit><![CDATA[Google]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Googlebook image]]></media:description>                                                            <media:text><![CDATA[Googlebook image]]></media:text>
                                <media:title type="plain"><![CDATA[Googlebook image]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/LmeePyFfScRBwtPjJKrxA9-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Google is finally ready to let everyone get their hands on the new <a href="https://www.tomsguide.com/computing/laptops/google-announces-high-end-googlebook-laptops-to-compete-with-macbooks-heres-what-you-need-to-know">Googlebook</a> laptops. Sporting a combination of Android and ChromeOS, these premium devices could be what we've always hoped the <a href="https://www.tomsguide.com/best-picks/best-chromebooks">best Chromebooks</a> would be. </p><p>The company says these devices are "a new category of laptops built with Gemini’s helpfulness at its core, designed to work seamlessly with the devices in your life and powered by premium hardware." Whether they can compete with the <a href="https://www.tomsguide.com/best-picks/best-macbook">top MacBooks</a> and <a href="https://www.tomsguide.com/computing/laptops/best-windows-laptops">premium Windows laptops</a> remains to be seen, but I'm definitely excited to give one a shot, since it sounds like a streamlined laptop with some cool features.</p><p>And now that Google has announced that the laptops will be available for pre-order on September 21, I don't have to wait too long to get my hands on one. </p><p>Could it be my new daily laptop, <a href="https://www.tomsguide.com/computing/i-switched-from-my-laptop-to-the-ipad-pro-m5-and-its-now-a-tablet-i-can-finally-work-on">replacing my MacBook Air</a>? Maybe. Here are three reasons why I think it's possible and why I can't wait to add one of these to my daily workflow.</p><h2 id="google-39-s-magic-pointer">Google's Magic Pointer</h2><div class="looped-video"><video class="lazyload-in-view lazyloading" data-src="https://storage.googleapis.com/gweb-uniblog-publish-prod/original_videos/Magic_Pointer.mp4" autoplay loop muted playsinline src="https://storage.googleapis.com/gweb-uniblog-publish-prod/original_videos/Magic_Pointer.mp4"></video></div><p>For my money, the coolest feature of Googlebooks is the <a href="https://www.tomsguide.com/computing/laptops/googlebooks-vs-chromebooks">Magic Pointer</a>. The mouse cursor has stayed pretty much the same over the years, which makes sense, since it does its job well. </p><p>But with all the AI features baked into Googlebooks, it's finally getting a useful tweak. When you give it a wiggle, the laptop will show you contextual information about what it's pointing at (a bit like <a href="https://www.tomsguide.com/ai/ai-image-video/chatgpt-vision-vs-google-lens-i-tested-7-prompts-and-one-was-the-clear-winner">Google Lens</a> or <a href="https://www.tomsguide.com/ai/i-use-googles-ai-to-thrift-for-my-big-family-these-are-the-5-features-that-actually-save-me-money">Circle to Search</a> for your laptop).</p><p>I don't know about you, but I feel like I'm constantly stumbling upon things I'd like to know more about online, and this feature sounds like a nice time-saver for looking up information. Plus, it's a very visually appealing cursor.</p><h2 id="android-integration">Android integration</h2><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="WMPZAZij5g6FrzYrc2kJDM" name="🎬 Watch The Android Show _ I_O Edition 2026 39-49 screenshot" alt="Googlebook fact sheet" src="https://cdn.mos.cms.futurecdn.net/WMPZAZij5g6FrzYrc2kJDM-1920-80.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: Google)</span></figcaption></figure><p>This is a no-brainer for anyone who's ever used a Chromebook. Web apps are great, but in most cases, Android apps offer vastly superior features. And while ChromeOS emulates Android apps, it doesn't always work well. With Googlebooks, the apps are native. </p><p>In fact, in an interview with <a href="https://chromeunboxed.com/google-confirms-native-premium-apps-will-be-ready-for-googlebook-launch/#google_vignette" target="_blank">Chrome Unboxed</a>, Google VP John Maletis said, “We now have an ability to run truly native Android applications, not emulated. So performance of these apps is incredible.” That sounds like a vast improvement over Chromebooks.</p><p>You'll also be able to cast apps from your Android phone to your Googlebook, which will fill in the gaps for any apps that aren't natively supported.</p><h2 id="custom-widgets">Custom widgets</h2><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="crbw8G4bMg5Rf67xcqSckj" name="🎬 Watch The Android Show _ I_O Edition 2026 36-56 screenshot" alt="Custom Widget on Googlebook" src="https://cdn.mos.cms.futurecdn.net/crbw8G4bMg5Rf67xcqSckj-1920-80.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: Google)</span></figcaption></figure><p>What's so exciting about widgets? Just about every laptop in recent memory has had widget support for apps in one form or another. </p><p>Well, what makes these so cool is that you can create them on the fly using Gemini, so you're not limited to a bunch of predetermined functions. If you want something specific, you can describe the widget and make it exist.</p><p>Google shows an example of someone asking for a custom tracker for an upcoming trip, but there are tons of potential use cases, like live-tracking a package, controlling your music across multiple platforms and so on.</p><h2 id="what-39-s-missing">What's missing</h2><p>While September 21 at 9 a.m. ET is right around the corner, and we know brands like Acer, ASUS, Dell, HP and Lenovo are on board; the big unknown is the final price of the new Googlebooks. </p><p>The anticipated price is between $700 and $1,000, positioning these as premium laptops. Stay tuned for our hands-on impressions to see if these Googlebooks live up to the hype.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/google-just-revealed-gemini-intelligence-and-it-could-change-android-forever">Google just revealed ‘Gemini Intelligence’</a></li><li><a href="https://www.tomsguide.com/phones/android-auto-is-about-to-change-the-way-you-drive-3d-google-maps-redesigned-interface-video-support-gemini-and-more">Android Auto is about to change the way you drive</a></li><li><a href="https://www.tomsguide.com/ai/i-gave-chatgpt-permission-to-disagree-with-me-with-this-prompt-and-its-responses-became-dramatically-better">I gave ChatGPT permission to disagree with me with this prompt</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ AppleCare One Family now live for $50 a month in time for iPhone 18 Pro launch — here's what it actually covers ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Whether you're picking up an iPhone, iPad or some other Apple device, you'll know that official repairs can get very expensive. Heck, a simple screen repair on the<a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-hands-on-sneaky-awesome-upgrades-but-worth-the-price-hike"> iPhone 18 Pro Max</a> is going to<a href="https://support.apple.com/iphone/repair?services=applecare" target="_blank" rel="nofollow"> cost $379</a>, which is almost a third of the cost of the phone itself. AppleCare+ makes those fees a little more palatable, so long as you're willing to subscribe and pay a monthly fee.</p><p>The problem is that paying for AppleCare on multiple devices can get pretty expensive, especially if you're part of a whole family of Apple users. AppleCare One already offers the chance to cover up to three devices on a single plan, and now<a href="https://www.apple.com/applecare/" target="_blank" rel="nofollow"> AppleCare One Family</a> offers that same coverage for up to six people — for $50 a month.</p><h2 id="what-devices-you-can-add">What devices you can add</h2><p>There are surprisingly few limits on the number of devices you can add to this plan. All devices that are covered by AppleCare will be automatically added to the Family plan when you sign up, as will any devices purchased within the previous 60 days. </p><p>However, devices that are over four years old, or AirPods and Beats that are over a year old, will need to undergo a device check to ensure they're in good condition. This can be done remotely, or by visiting your nearest Apple Store. Apple has also made it clear that you can't add more than six<a href="https://www.tomsguide.com/computing/smart-glasses/apple-vision-pro-review"> Vision Pro </a>headsets to the plan — not that anyone would. </p><p>The usual AppleCare+ service fees still apply. Battery servicing is totally free under the plan, while repairs to the screen and back glass are $29. Other accidental damage is $99, while theft or loss claims come with a $149 deductible. You're also limited to six loss and theft claims over the course of a year.</p><h2 id=""></h2><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exgE3X"></div>                            </div>                            <script src="https://kwizly.com/embed/exgE3X.js" async></script><p>Devices will remain covered so long as you keep your AppleCare One Family Plan active, and provided they connect to an Apple server at least once every 12 months. However, Apple does note that devices can be removed from the plan if it runs out of the necessary parts to service and make repairs.</p><p>Coverage is also dependent on the devices being signed into a family member's Apple Account. If they sign out, and a non-family member later signs in, coverage will end. </p><h2 id="how-to-set-up-applecare-one-family">How to set up AppleCare One Family</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3WLpJBKQTbfhFZ8Lhc8bZ9" name="Apple CareOne 2" alt="AppleCare One with multiple Apple devices" src="https://cdn.mos.cms.futurecdn.net/3WLpJBKQTbfhFZ8Lhc8bZ9-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>AppleCare One Family is currently only available in the United States, and the setup process can be initiated by any adult member of a Family Sharing Group. Payments are automatically made by the family organizer, regardless of which adult actually signs up. However, the person who initiated the subscription can choose their own payment method if they prefer. Other family members will be restricted from signing up for a different AppleCare plan unless they leave the family group.</p><p>If you're part of a family or friendship group that's big on using Apple products, signing up for an AppleCare One Family plan feels like a no-brainer. A simple <a href="https://www.tomsguide.com/phones/iphones/apple-announces-applecare-one-for-covering-multiple-devices-under-one-plan-starts-at-usd19-a-month">AppleCare One plan</a> costs $20 a month, and coverage for up to three devices is included in the cost plus $6 a month for each additional product.</p><p>The Family plan with a full six people means that you're paying $8.33 per person, and without any major device limitations. All you have to do is make sure the participants actually pay you their dues, which should be a lot easier considering <a href="https://www.tomsguide.com/phones/iphones/ios-18-wallet">sharing money is now as easy as bumping phones together.</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/phones/iphones/your-phone-may-run-ios-27-but-only-these-devices-run-everything-siri-ai-can-do">Your phone may run iOS 27, but only these devices support the new Siri AI</a></li><li><a href="https://www.tomsguide.com/phones/why-your-iphone-says-optimizing-search-and-siri-in-ios-27-and-how-to-speed-it-up">Why your iPhone says 'Optimizing Search and Siri' in iOS 27 — and how to speed it up</a></li><li><a href="https://www.tomsguide.com/computing/macos/macos-golden-gate-review">I’ve used macOS Golden Gate for 3 months — and here’s what I think</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/applecare-one-family-now-live-for-usd50-a-month-in-time-for-iphone-18-pro-launch-heres-what-it-actually-covers</link>
                                                                            <description>
                            <![CDATA[ Up to six people can get full AppleCare coverage on all their devices, and it only costs $50 a month. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">BsLfx4LwAt7FxRyPrXmrXk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EVijA7pZz2QcghNcincgHk-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 15 Sep 2026 11:00:56 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[iPads]]></category>
                                                    <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/EVijA7pZz2QcghNcincgHk-1920-80.jpg">
                                                            <media:credit><![CDATA[Hadrian | Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple Care plus settings app on new iPhone 12 Pro Max 5G smartphone model by Apple Computers close-up of Pacific Blue mobile phone device]]></media:description>                                                            <media:text><![CDATA[Apple Care plus settings app on new iPhone 12 Pro Max 5G smartphone model by Apple Computers close-up of Pacific Blue mobile phone device]]></media:text>
                                <media:title type="plain"><![CDATA[Apple Care plus settings app on new iPhone 12 Pro Max 5G smartphone model by Apple Computers close-up of Pacific Blue mobile phone device]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EVijA7pZz2QcghNcincgHk-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Whether you're picking up an iPhone, iPad or some other Apple device, you'll know that official repairs can get very expensive. Heck, a simple screen repair on the<a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-hands-on-sneaky-awesome-upgrades-but-worth-the-price-hike"> iPhone 18 Pro Max</a> is going to<a href="https://support.apple.com/iphone/repair?services=applecare" target="_blank" rel="nofollow"> cost $379</a>, which is almost a third of the cost of the phone itself. AppleCare+ makes those fees a little more palatable, so long as you're willing to subscribe and pay a monthly fee.</p><p>The problem is that paying for AppleCare on multiple devices can get pretty expensive, especially if you're part of a whole family of Apple users. AppleCare One already offers the chance to cover up to three devices on a single plan, and now<a href="https://www.apple.com/applecare/" target="_blank" rel="nofollow"> AppleCare One Family</a> offers that same coverage for up to six people — for $50 a month.</p><h2 id="what-devices-you-can-add">What devices you can add</h2><p>There are surprisingly few limits on the number of devices you can add to this plan. All devices that are covered by AppleCare will be automatically added to the Family plan when you sign up, as will any devices purchased within the previous 60 days. </p><p>However, devices that are over four years old, or AirPods and Beats that are over a year old, will need to undergo a device check to ensure they're in good condition. This can be done remotely, or by visiting your nearest Apple Store. Apple has also made it clear that you can't add more than six<a href="https://www.tomsguide.com/computing/smart-glasses/apple-vision-pro-review"> Vision Pro </a>headsets to the plan — not that anyone would. </p><p>The usual AppleCare+ service fees still apply. Battery servicing is totally free under the plan, while repairs to the screen and back glass are $29. Other accidental damage is $99, while theft or loss claims come with a $149 deductible. You're also limited to six loss and theft claims over the course of a year.</p><h2 id=""></h2><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exgE3X"></div>                            </div>                            <script src="https://kwizly.com/embed/exgE3X.js" async></script><p>Devices will remain covered so long as you keep your AppleCare One Family Plan active, and provided they connect to an Apple server at least once every 12 months. However, Apple does note that devices can be removed from the plan if it runs out of the necessary parts to service and make repairs.</p><p>Coverage is also dependent on the devices being signed into a family member's Apple Account. If they sign out, and a non-family member later signs in, coverage will end. </p><h2 id="how-to-set-up-applecare-one-family">How to set up AppleCare One Family</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3WLpJBKQTbfhFZ8Lhc8bZ9" name="Apple CareOne 2" alt="AppleCare One with multiple Apple devices" src="https://cdn.mos.cms.futurecdn.net/3WLpJBKQTbfhFZ8Lhc8bZ9-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>AppleCare One Family is currently only available in the United States, and the setup process can be initiated by any adult member of a Family Sharing Group. Payments are automatically made by the family organizer, regardless of which adult actually signs up. However, the person who initiated the subscription can choose their own payment method if they prefer. Other family members will be restricted from signing up for a different AppleCare plan unless they leave the family group.</p><p>If you're part of a family or friendship group that's big on using Apple products, signing up for an AppleCare One Family plan feels like a no-brainer. A simple <a href="https://www.tomsguide.com/phones/iphones/apple-announces-applecare-one-for-covering-multiple-devices-under-one-plan-starts-at-usd19-a-month">AppleCare One plan</a> costs $20 a month, and coverage for up to three devices is included in the cost plus $6 a month for each additional product.</p><p>The Family plan with a full six people means that you're paying $8.33 per person, and without any major device limitations. All you have to do is make sure the participants actually pay you their dues, which should be a lot easier considering <a href="https://www.tomsguide.com/phones/iphones/ios-18-wallet">sharing money is now as easy as bumping phones together.</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/phones/iphones/your-phone-may-run-ios-27-but-only-these-devices-run-everything-siri-ai-can-do">Your phone may run iOS 27, but only these devices support the new Siri AI</a></li><li><a href="https://www.tomsguide.com/phones/why-your-iphone-says-optimizing-search-and-siri-in-ios-27-and-how-to-speed-it-up">Why your iPhone says 'Optimizing Search and Siri' in iOS 27 — and how to speed it up</a></li><li><a href="https://www.tomsguide.com/computing/macos/macos-golden-gate-review">I’ve used macOS Golden Gate for 3 months — and here’s what I think</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPadOS 27 review: The iPad gets smarter ]]></title>
                                                                                                <dc:content><![CDATA[ <p>iPadOS 27 is here for the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a> that support it! Like <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a> and <a href="https://www.tomsguide.com/computing/macos/macos-27">macOS 27</a>, iPadOS 27 focuses on overall system refinements and deeper AI integration. That last bit is especially noteworthy, as there’s now a dedicated <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI app</a> that functions like a standard chatbot. Beyond answering questions, Siri AI can also take actions on your behalf since it’s integrated into the operating system and works with Apple’s applications.</p><p>I’ve been using iPadOS 27 since the beta launched over the summer, and have generally had a smooth experience with the latest OS update. Though I’m not a big AI user, the updated Siri can be handy — especially as it can do things on your behalf. And if you have kids, I’m sure you’ll appreciate the new child safety features.</p><p>iPadOS 27 isn’t a game-changer, but features like the overhauled Siri AI, the Liquid-Glass slider, and other quality-of-life improvements make using Apple’s tablets feel smoother and more personalized. Here is my full review of iPadOS 27.</p><h3 class="article-body__section" id="section-ipados-27-review-compatible-ipads"><span>iPadOS 27 review: Compatible iPads</span></h3><p>Here are all the iPads that support iPadOS 27.</p><ul><li><strong>iPad Pro (M4 and later)</strong></li><li><strong>iPad Pro 12.9‑inch (4th generation and later)</strong></li><li><strong>iPad Pro 11‑inch (2nd generation and later)</strong></li><li><strong>iPad Air 13-inch (M2 and later)</strong></li><li><strong>iPad Air 11-inch (M2, M3, and M4)</strong></li><li><strong>iPad Air 11-inch (4th generation and later)</strong></li><li><strong>iPad (A16)</strong></li><li><strong>iPad (9th generation and later)</strong></li><li><strong>iPad mini (A17 Pro)</strong></li><li><strong>iPad mini (6th generation)</strong></li></ul><h3 class="article-body__section" id="section-ipados-27-review-biggest-features"><span>iPadOS 27 review: Biggest features</span></h3><h2 id="the-new-siri">The new Siri</h2><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.23%;"><img id="bUdvQNBSqmfRLjfKDiytsJ" name="iPadOS 27-3" alt="iPadOS 27" src="https://cdn.mos.cms.futurecdn.net/bUdvQNBSqmfRLjfKDiytsJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3000" height="1687" 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/ai/apple-intelligence-unveiled-all-the-new-ai-features-coming-to-ios-18-ipados-18-and-macos-sequoia">Apple Intelligence</a> is finally ready for prime time on the company’s devices. Thanks to the new Siri AI app, you can now interact with Apple’s virtual assistant the same way you would with a chatbot like ChatGPT or <a href="https://www.tomsguide.com/ai/google-gemini/google-gemini-everything-you-need-to-know">Google Gemini</a>. Apple Intelligence runs on both servers and your device to offer better image understanding and more.</p><p>There is now a dedicated Siri AI app, which looks and functions like a regular chatbot app. In this window, you can ask Siri questions or have it perform tasks for you. For example, I used Siri to send a message to one of my iMessage group chats, and it did so after I approved it. Sure, I could have just done this directly in the group chat, but it’s a good demonstration of what the new Siri can do.</p><p>Siri AI also understands what's on your screen. When I had the Tom’s Guide homepage open on Google Chrome, it correctly detailed what was on the screen, including all the articles. It couldn’t open the articles or read them aloud (despite saying it could), but since I’m testing a beta version, I’ll give it an A for effort, even if it failed to complete the task.</p><p>Siri is most useful when you’re using Apple’s own apps and programs. It can create calendar events, set reminders, play music, and more. For example, when you’re looking at a schedule, you’ll see an “add to calendar” button pop up. When you right-click certain folders, files, or apps, you’ll see an “Ask Siri” option at the bottom. Selecting this will open a window where you can start texting or talking with Siri.</p><p>Though Siri can’t yet interact with many third-party applications (such as those from Google), it’s a huge improvement over the old Siri.</p><h2 id="liquid-glass-improvements">Liquid Glass improvements</h2><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="o8qwJZchHVow7pwSPrizSQ" name="iPadOS 27-2" alt="iPadOS 27" src="https://cdn.mos.cms.futurecdn.net/o8qwJZchHVow7pwSPrizSQ-1920-80.jpg" 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: Tom's Guide)</span></figcaption></figure><p>Liquid Glass hasn’t gone anywhere, as Apple is leaning more into the UI with its latest operating system updates. However, Apple is now giving you more control over how it looks with a new slider that adjusts opacity. You can’t eliminate the Liquid Glass look, but you can minimize it significantly. </p><p>Other improvements include more diffuse, complex background visuals, so text stands out more. You’ll also notice that the edges of icons are more pronounced to help further separate them from the background. The uniform corner radius of all app windows also helps them stand out more.</p><p>Even if Liquid Glass hasn’t gone anywhere, even detractors should find the updates tolerable since they do greatly improve overall readability and visibility. The Liquid Glass slider is a nice touch.</p><p>I've never had a problem with Liquid Glass because I think it’s an interesting visual effect. That said, I’m glad that folks can now fine-tune it to their liking. The slider is especially neat because it’s easy to use and clearly shows how much of a difference there is when you go from one extreme to the other.</p><h2 id="child-safety-features">Child safety features</h2><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="scMkVXfiwMUYV5YeEAw5JV" name="iPadOS 27" alt="iPadOS 27" src="https://cdn.mos.cms.futurecdn.net/scMkVXfiwMUYV5YeEAw5JV-1920-80.jpg" 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: Tom's Guide)</span></figcaption></figure><p>If you’re a parent, you’ll be happy to know that Apple is expanding its parental control features with iPadOS 27. This way, you can let the kiddo use Apple’s tablet without worrying too much about the kind of content they’re watching and for how long they’re using the slate.</p><p>These updates include a redesigned, more intuitive Screen Time Dashboard with one-tap controls and expanded safeguards. There are also Time Allowances for app categories, Ask to Browse website approval, Communication Safety that blurs gore or violence, and one-tap access management. You can tailor these features to suit your child.</p><p>I don’t have kids, but I did find the child safety features simple enough to use and customize. Given how much kids love iPads, it’s smart for Apple to keep refining these safety features.</p><h3 class="article-body__section" id="section-ipados-27-review-other-features"><span>iPadOS 27 review: Other 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:3000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="7oXYaT7tBAEw2Bpdcym2Ab" name="iPadOS 27-4" alt="iPadOS 27" src="https://cdn.mos.cms.futurecdn.net/7oXYaT7tBAEw2Bpdcym2Ab-1920-80.jpg" 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: Tom's Guide)</span></figcaption></figure><ul><li><strong>Spatial Reframing</strong>: As the name suggests, you can now reframe a photo after it’s been taken thanks to this feature. You can also expand your shots with the Extend Tool and remove objects with the Clean Up tool.</li><li><strong>Upgraded Image Playground</strong>: Image Playground can now generate higher-quality images. You can also modify and transform existing images by describing what you want.</li><li><strong>Siri in Notes</strong>: Siri AI can assist with your handwritten or typed notes in the Notes app by (for example) organizing bullet points into a formatted agenda or turning handwritten lectures into a detailed study guide.</li><li><strong>Safari updates</strong>: In Safari, tabs can now be automatically grouped by topic, making related pages easier to find. With Safari Notify Me, you can receive an alert if there’s a price change or a restock for an item you’ve been eyeing.</li><li><strong>Describe Shortcuts</strong>: Instead of manually building complex workflows, you can now describe what you need, and Shortcuts connects actions across multiple apps to make it happen. This is useful if you want to set specific routines, such as launching a specific app when you connect a peripheral.</li></ul><h3 class="article-body__section" id="section-ipados-27-review-verdict"><span>iPadOS 27 review: Verdict</span></h3><p>I use an iPad Pro every single day and have largely been pleased with iPadOS 27. Again, it won’t set the world on fire with revolutionary new features, but the upgraded Siri AI and deeper Apple Intelligence integrations help make iPads that support the update more useful. This is especially true if you use Apple’s own apps often.</p><p>As I said in my macOS Golden Gate review, iPadOS 27 feels like a holding-pattern update for whatever big OS refresh the folks in Cupertino are cooking. But there’s also nothing wrong with not fixing what isn’t broken, so it’s fine that this isn’t a huge update. If you own a compatible iPad, you should update as soon as you can to test the new features yourself!</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/ipads/ipados-27-review</link>
                                                                            <description>
                            <![CDATA[ iPadOS 27 puts AI front and center, thanks to the new Siri AI and deeper app integration. Though not revolutionary, this update is solid for iPad users. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">kkdJ7BJ2EZGgBZv4nofUWD</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/A8DQehgx8ELZdgM9JyFu7H-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 15 Sep 2026 10:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPads]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/A8DQehgx8ELZdgM9JyFu7H-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPadOS 27]]></media:description>                                                            <media:text><![CDATA[iPadOS 27]]></media:text>
                                <media:title type="plain"><![CDATA[iPadOS 27]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/A8DQehgx8ELZdgM9JyFu7H-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>iPadOS 27 is here for the <a href="https://www.tomsguide.com/best-picks/best-ipad">best iPads</a> that support it! Like <a href="https://www.tomsguide.com/phones/iphones/ios-27-is-official-all-the-new-upgrades-and-features-announced-at-wwdc-2026">iOS 27</a> and <a href="https://www.tomsguide.com/computing/macos/macos-27">macOS 27</a>, iPadOS 27 focuses on overall system refinements and deeper AI integration. That last bit is especially noteworthy, as there’s now a dedicated <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI app</a> that functions like a standard chatbot. Beyond answering questions, Siri AI can also take actions on your behalf since it’s integrated into the operating system and works with Apple’s applications.</p><p>I’ve been using iPadOS 27 since the beta launched over the summer, and have generally had a smooth experience with the latest OS update. Though I’m not a big AI user, the updated Siri can be handy — especially as it can do things on your behalf. And if you have kids, I’m sure you’ll appreciate the new child safety features.</p><p>iPadOS 27 isn’t a game-changer, but features like the overhauled Siri AI, the Liquid-Glass slider, and other quality-of-life improvements make using Apple’s tablets feel smoother and more personalized. Here is my full review of iPadOS 27.</p><h3 class="article-body__section" id="section-ipados-27-review-compatible-ipads"><span>iPadOS 27 review: Compatible iPads</span></h3><p>Here are all the iPads that support iPadOS 27.</p><ul><li><strong>iPad Pro (M4 and later)</strong></li><li><strong>iPad Pro 12.9‑inch (4th generation and later)</strong></li><li><strong>iPad Pro 11‑inch (2nd generation and later)</strong></li><li><strong>iPad Air 13-inch (M2 and later)</strong></li><li><strong>iPad Air 11-inch (M2, M3, and M4)</strong></li><li><strong>iPad Air 11-inch (4th generation and later)</strong></li><li><strong>iPad (A16)</strong></li><li><strong>iPad (9th generation and later)</strong></li><li><strong>iPad mini (A17 Pro)</strong></li><li><strong>iPad mini (6th generation)</strong></li></ul><h3 class="article-body__section" id="section-ipados-27-review-biggest-features"><span>iPadOS 27 review: Biggest features</span></h3><h2 id="the-new-siri">The new Siri</h2><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.23%;"><img id="bUdvQNBSqmfRLjfKDiytsJ" name="iPadOS 27-3" alt="iPadOS 27" src="https://cdn.mos.cms.futurecdn.net/bUdvQNBSqmfRLjfKDiytsJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3000" height="1687" 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/ai/apple-intelligence-unveiled-all-the-new-ai-features-coming-to-ios-18-ipados-18-and-macos-sequoia">Apple Intelligence</a> is finally ready for prime time on the company’s devices. Thanks to the new Siri AI app, you can now interact with Apple’s virtual assistant the same way you would with a chatbot like ChatGPT or <a href="https://www.tomsguide.com/ai/google-gemini/google-gemini-everything-you-need-to-know">Google Gemini</a>. Apple Intelligence runs on both servers and your device to offer better image understanding and more.</p><p>There is now a dedicated Siri AI app, which looks and functions like a regular chatbot app. In this window, you can ask Siri questions or have it perform tasks for you. For example, I used Siri to send a message to one of my iMessage group chats, and it did so after I approved it. Sure, I could have just done this directly in the group chat, but it’s a good demonstration of what the new Siri can do.</p><p>Siri AI also understands what's on your screen. When I had the Tom’s Guide homepage open on Google Chrome, it correctly detailed what was on the screen, including all the articles. It couldn’t open the articles or read them aloud (despite saying it could), but since I’m testing a beta version, I’ll give it an A for effort, even if it failed to complete the task.</p><p>Siri is most useful when you’re using Apple’s own apps and programs. It can create calendar events, set reminders, play music, and more. For example, when you’re looking at a schedule, you’ll see an “add to calendar” button pop up. When you right-click certain folders, files, or apps, you’ll see an “Ask Siri” option at the bottom. Selecting this will open a window where you can start texting or talking with Siri.</p><p>Though Siri can’t yet interact with many third-party applications (such as those from Google), it’s a huge improvement over the old Siri.</p><h2 id="liquid-glass-improvements">Liquid Glass improvements</h2><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="o8qwJZchHVow7pwSPrizSQ" name="iPadOS 27-2" alt="iPadOS 27" src="https://cdn.mos.cms.futurecdn.net/o8qwJZchHVow7pwSPrizSQ-1920-80.jpg" 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: Tom's Guide)</span></figcaption></figure><p>Liquid Glass hasn’t gone anywhere, as Apple is leaning more into the UI with its latest operating system updates. However, Apple is now giving you more control over how it looks with a new slider that adjusts opacity. You can’t eliminate the Liquid Glass look, but you can minimize it significantly. </p><p>Other improvements include more diffuse, complex background visuals, so text stands out more. You’ll also notice that the edges of icons are more pronounced to help further separate them from the background. The uniform corner radius of all app windows also helps them stand out more.</p><p>Even if Liquid Glass hasn’t gone anywhere, even detractors should find the updates tolerable since they do greatly improve overall readability and visibility. The Liquid Glass slider is a nice touch.</p><p>I've never had a problem with Liquid Glass because I think it’s an interesting visual effect. That said, I’m glad that folks can now fine-tune it to their liking. The slider is especially neat because it’s easy to use and clearly shows how much of a difference there is when you go from one extreme to the other.</p><h2 id="child-safety-features">Child safety features</h2><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="scMkVXfiwMUYV5YeEAw5JV" name="iPadOS 27" alt="iPadOS 27" src="https://cdn.mos.cms.futurecdn.net/scMkVXfiwMUYV5YeEAw5JV-1920-80.jpg" 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: Tom's Guide)</span></figcaption></figure><p>If you’re a parent, you’ll be happy to know that Apple is expanding its parental control features with iPadOS 27. This way, you can let the kiddo use Apple’s tablet without worrying too much about the kind of content they’re watching and for how long they’re using the slate.</p><p>These updates include a redesigned, more intuitive Screen Time Dashboard with one-tap controls and expanded safeguards. There are also Time Allowances for app categories, Ask to Browse website approval, Communication Safety that blurs gore or violence, and one-tap access management. You can tailor these features to suit your child.</p><p>I don’t have kids, but I did find the child safety features simple enough to use and customize. Given how much kids love iPads, it’s smart for Apple to keep refining these safety features.</p><h3 class="article-body__section" id="section-ipados-27-review-other-features"><span>iPadOS 27 review: Other 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:3000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="7oXYaT7tBAEw2Bpdcym2Ab" name="iPadOS 27-4" alt="iPadOS 27" src="https://cdn.mos.cms.futurecdn.net/7oXYaT7tBAEw2Bpdcym2Ab-1920-80.jpg" 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: Tom's Guide)</span></figcaption></figure><ul><li><strong>Spatial Reframing</strong>: As the name suggests, you can now reframe a photo after it’s been taken thanks to this feature. You can also expand your shots with the Extend Tool and remove objects with the Clean Up tool.</li><li><strong>Upgraded Image Playground</strong>: Image Playground can now generate higher-quality images. You can also modify and transform existing images by describing what you want.</li><li><strong>Siri in Notes</strong>: Siri AI can assist with your handwritten or typed notes in the Notes app by (for example) organizing bullet points into a formatted agenda or turning handwritten lectures into a detailed study guide.</li><li><strong>Safari updates</strong>: In Safari, tabs can now be automatically grouped by topic, making related pages easier to find. With Safari Notify Me, you can receive an alert if there’s a price change or a restock for an item you’ve been eyeing.</li><li><strong>Describe Shortcuts</strong>: Instead of manually building complex workflows, you can now describe what you need, and Shortcuts connects actions across multiple apps to make it happen. This is useful if you want to set specific routines, such as launching a specific app when you connect a peripheral.</li></ul><h3 class="article-body__section" id="section-ipados-27-review-verdict"><span>iPadOS 27 review: Verdict</span></h3><p>I use an iPad Pro every single day and have largely been pleased with iPadOS 27. Again, it won’t set the world on fire with revolutionary new features, but the upgraded Siri AI and deeper Apple Intelligence integrations help make iPads that support the update more useful. This is especially true if you use Apple’s own apps often.</p><p>As I said in my macOS Golden Gate review, iPadOS 27 feels like a holding-pattern update for whatever big OS refresh the folks in Cupertino are cooking. But there’s also nothing wrong with not fixing what isn’t broken, so it’s fine that this isn’t a huge update. If you own a compatible iPad, you should update as soon as you can to test the new features yourself!</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ This bold, anime-themed MelGeek Centauri60 keyboard just became my daily driver — here’s why ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Having recently spent time with MelGeek’s Made68 Ultra V2 keyboard, I came away declaring my love for its <a href="https://www.tomsguide.com/computing/keyboards/ive-been-using-melgeeks-made68-ultra-v2-for-three-weeks-and-im-in-love-with-its-magnetic-switches-slick-styling-and-clean-sound">magnetic switches, slick styling and clean sound</a>. With those things fresh in my mind, I approached the <a href="https://www.melgeek.com/en-eu/pages/melgeek-x-evangelion-centauri60-asuka-edition" target="_blank" rel="nofollow">Centauri60 Evangelion ‘Asuka Edition’</a> expecting a familiar experience. What I found instead was a keyboard that carries over everything I liked about the Ultra V2 while improving the parts that matter most to me in everyday use.</p><p>The Asuka Edition isn’t exactly subtle — it leans into its Evangelion theme and makes no effort to hide it. You get a ‘dominant’ red case, sharp angled edges, lighting strips on both sides, a hidden engraving of Asuka’s most iconic line, a Prog‑Knife motif, a metal nameplate built into the frame, and a laser‑etched EVA‑02 insignia. It’s unapologetically bold and openly geeky, far more so than the Made68 Ultra V2 I tested earlier, and that personality hits you straight away.</p><p>And yes, the volume knob is still one of those small touches that makes a big impact. On a 60% board, having a tactile media control feels like a luxury, and it’s one I’m thankful for given its absence from the Made 68 Ultra V2. Of course, there’s more to the Centauri60 than its theme —  it’s a keyboard which so resoundingly nails its build, sound, feel, gaming features and typing experience, that it’s now become my daily driver at home — here’s why.</p><h2 id="a-thocking-spectacular-sound-profile">A thocking spectacular sound profile</h2><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="hbjiSdJGBPczWwBjHoMfLM" name="9365" alt="MelGeek x Evangelion Centauri60 'Asuka Edition' keyboard" src="https://cdn.mos.cms.futurecdn.net/hbjiSdJGBPczWwBjHoMfLM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The acoustic profile is where the Centauri60 surprised me most. The Ultra V2 I tested sounded super clean, but it used KOM Lite switches which resulted in a brighter, snappier sound signature. The Centauri60, by contrast, comes installed with TTC Flip King magnetic switches, which I instantly preferred for their deeper, more muted tone. </p><p>Another major contributor has to be its CNC aluminium unibody, which weighs a hefty 1.32kg and provides a dense, vibration‑absorbing foundation. Compared to some of the more plastic-centric keyboards I’ve used in the past, this heavy-duty body noticeably suppresses higher‑frequency noise while letting lower tones develop more fully, giving the board a richer, more grounded sound. </p><p>The Centauri60 also uses a five‑layer acoustic dampening system — a combination of Poron foam, PET film, and a leaf‑spring gasket mount — designed to eliminate hollow cavities and absorb unwanted resonance. The result, in my estimation, is a keyboard that minimises harsh clacks for a smoother, more “creamy” signature</p><p>The magnetic switches certainly help with consistency, but the case design and acoustic layering are doing most of the heavy lifting, resulting in a sound profile that makes you want to keep typing simply because it sounds so great.</p><h2 id="easily-the-sturdiest-keyboard-i-ve-ever-tested">Easily the sturdiest keyboard I’ve ever tested</h2><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="Z93GN4BHw4o7fHsXbdT29M" name="9357" alt="MelGeek x Evangelion Centauri60 'Asuka Edition' keyboard" src="https://cdn.mos.cms.futurecdn.net/Z93GN4BHw4o7fHsXbdT29M-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The build quality on the last MelGeek board I tested was already impressive, but the Centauri60 feels like a step up in every direction. Its machined aluminium chassis has that dense, rigid character you’d expect from a well‑cut block of metal, and there’s genuinely no flex anywhere in the frame. The tighter tolerances, cleaner seams, and more even weight distribution give it a more confident, premium feel — even compared to the already excellent Made68 Ultra V2.</p><p>Granted, I’ve only used two MelGeek keyboards to date, but it feels like there’s very little room for improvement when it comes to the Centauri60’s build quality. Compared to the Made68 Ultra V2, there’s a more deliberate weight to the board when you pick it up — 1.32kg (2.91 lbs) to be exact — so you know it won’t slide around your desk in the heat of online battle.</p><p>That weight distribution also contributes to a “single‑piece” feel in hand, something that really sells the mecha‑like character of the board. Nothing shifts, nothing creaks, and the chassis feels impeccably engineered in true Evangelion fashion. It’s so good, it could almost make Shinji’s father smile — if he were capable of such a thing.</p><h2 id="immaculate-styling-for-evangelion-fans">Immaculate styling for Evangelion fans</h2><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="xhZJFo89dpnr2EtosLooDM" name="9356" alt="MelGeek x Evangelion Centauri60 'Asuka Edition' keyboard" src="https://cdn.mos.cms.futurecdn.net/xhZJFo89dpnr2EtosLooDM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As mentioned earlier, the Asuka Edition’s red colourway is easily its standout feature. It’s a saturated, confident red that really drives home its Evangelion inspiration. It’s unashamedly geeky, and its lighting helps amplify that personality: the south‑facing RGB shines cleanly through the keycaps. That bothered me somewhat on the Made68 Ultra V2, largely due to the dark purple text which made the keys hard to read. Here, the characters are white, making them far easier to make out at a glance.</p><p>Speaking of keycaps, the Asuka Edition employs a mix of red, orange and charcoal caps that mirror Asuka’s Unit‑02 palette, and the legends use Evangelion‑inspired typography that give the board a cool, futuristic vibe. The accent keys — particularly the green escape key and the darker modifiers — continues the anime‑driven look in a way that feels cohesive. Even the bottom of the case carries EVA‑specific detailing — the aforementioned “hidden” engraving — making the board feel like a collectible rather than just a themed variant.</p><p>The biggest downside of the entire keyboard sits right at the back: the USB‑C port. The port itself is recessed, but the real issue is the extra lip on MelGeek’s own USB‑C cable, which is designed to slot perfectly into that recess for a snug fit. Because of that proprietary lip, almost no third‑party cable can seat properly. So if you were hoping to pair the board with a coiled cable or any non‑MelGeek option, you’ll have to let that idea go or start thinking in terms of soldering irons. For a board that otherwise nails its visual identity, this restrictive setup feels out of place — and it’s the one styling choice that genuinely frustrated me.</p><h2 id="fully-specced-for-modern-gaming">Fully specced for modern gaming</h2><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="iVfXBzmR645Z94LWunNCAM" name="20260818_163331" alt="MelGeek x Evangelion Centauri60 'Asuka Edition' keyboard" src="https://cdn.mos.cms.futurecdn.net/iVfXBzmR645Z94LWunNCAM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Centauri60’s magnetic switch system performs on par with any Hall‑effect board I’ve tested, delivering consistent, predictable keystrokes that can be tuned to impressively fine sensitivity. All the core features — rapid trigger, SOCD cleaning, adjustable actuation, analog‑style travel sensing, NKRO and zero‑dead‑zone behaviour — run smoothly and without any fuss.</p><p>Actuation can be adjusted from 0.1mm all the way to 3.4mm, giving you plenty of control whether you prefer hair‑trigger responsiveness or a more deliberate typing feel. Rapid Trigger is adjustable from 0.01mm to 2.5mm, resetting the moment a key starts to rise, which makes repeated inputs feel snappy and effortless. SOCD cleaning is handled in firmware and follows standard competitive rules, ensuring clean directional behaviour when opposite keys are pressed.</p><p>The switches also support full analog‑style travel sensing, with 0.01mm precision, allowing the board to read the exact depth of each keypress rather than just on/off states. In practice, this enables multi‑stage actions, variable movement speeds and pressure‑sensitive inputs in supported games. The keyboard runs at an 8,000Hz polling rate with a 0.125ms latency, and key response feels immediate whether you’re typing or gaming.</p><h2 id="man-s-ultimate-fighting-machine">Man’s ultimate fighting machine</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="StCvVfYNLdofq4uxrcRrDM" name="20260818_091708" alt="MelGeek x Evangelion Centauri60 'Asuka Edition' keyboard" src="https://cdn.mos.cms.futurecdn.net/StCvVfYNLdofq4uxrcRrDM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While I loved almost everything about MelGeek’s Made68 Ultra V2, the Centauri60 Evangelion ‘Asuka Edition’ improves on it in several of the areas which are most important to me. It’s got incredible styling that’s inspired by my favourite Evangelion character and EVA unit, its build quality feels strong enough to go into battle with Angels, its acoustics are deeper and thockier than that keyboard in a way that I find immensely satisfying, and its highly tunable Hall-effect switches give me all the high-end features I need in a competitive gaming keyboard. </p><p>As a noted fan of 75% layouts, I thought I’d be bothered by the Centauri60’s 60% layout, but it actually doesn’t feel too compact for me to use on a daily basis. And the fact that it still includes a small volume knob despite its condensed layout is a massive plus for me — especially since that was one of my biggest gripes with the Made68 Ultra V2.</p><p>The only real drawback is the USB‑C port, which is restrictive enough to be a genuine annoyance. That flaw aside, the Centauri60 becomes an easy recommendation for any Evangelion fan who wants a compact magnetic board with strong acoustics and a standout colourway.</p><div data-widget-type="multimodelreview" data-model-name="MelGeek Made68 Ultra V2,Melgeek Real 81,MelGeek Pixel" data-widget-title="Today's best MelGeek keyboard deals"></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/computing/peripherals/mechanical-keyboards-are-dead-heres-why-you-should-only-buy-a-magnetic-keyboard-for-gaming">Here’s why you should only buy a magnetic keyboard for gaming</a></li><li><a href="https://www.tomsguide.com/computing/keyboards/i-almost-found-my-dream-keyboard-in-the-gravastar-mercury-v60-pro-if-it-werent-for-three-finicky-details">The GravaStar Mercury V60 Pro is almost perfect except for three finicky details</a></li><li><a href="https://www.tomsguide.com/computing/keyboards/corsairs-vanguard-pro-96-keyboard-has-convinced-me-that-magnetic-switches-arent-just-hype">Corsair’s Vanguard Pro 96 keyboard has convinced me that magnetic switches aren’t just hype</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/keyboards/this-bold-anime-themed-melgeek-centauri60-keyboard-just-became-my-daily-driver-heres-why</link>
                                                                            <description>
                            <![CDATA[ This Evangelion-themed board combines high-end Hall-effect performance with Cyberpunk style and mecha-grade build quality, and I can’t get enough of it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">vNvke4qfWkFnhNP3fsR4Dd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/2j6Ko6RgSK9oVAemx2rZFM-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 15 Sep 2026 03:32:29 +0000</pubDate>                                                                                                                                <updated>Tue, 15 Sep 2026 05:17:52 +0000</updated>
                                                                                                                                            <category><![CDATA[Keyboards]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                                    <dc:creator><![CDATA[ Stephen Lambrechts ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/JN3jEQpqyyt32as8AJJqXe-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Stephen Lambrechts is the Managing Editor of Tom&#039;s Guide AU and has written professionally across the categories of tech, film, television and gaming for the last 15 years. Before Tom&#039;s Guide, he spent several years as a Senior Journalist at TechRadar, had a brief stint as Editor in Chief at Official Xbox Magazine Australia, and worked at IGN. He&#039;s also written for such mags and sites as APC, TechLife Australia, T3, FilmInk, Daily Telegraph and AskMen. Additionally, he&#039;s a Tomatometer-approved critic on Rotten Tomatoes, and has offered his tech advice on radio and television.&lt;/p&gt;&lt;p&gt;He&#039;s an expert when it comes to smartphones, TVs, gaming and streaming, having contributed many reviews in each of those categories over the years. Despite his many articles on streaming, he&#039;s a passionate collector of physical media who enjoys listening to vinyl records and acquiring obscure horror movies from the &#039;60s, &#039;70s and 80s. He can usually be seen rocking the latest retro sneaker releases, particularly Air Jordans and Reebok Pumps. Occasionally, he also indulges in other non-hipster stuff, like hiking.&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/2j6Ko6RgSK9oVAemx2rZFM-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[MelGeek x Evangelion Centauri60 &#039;Asuka Edition&#039; keyboard]]></media:description>                                                            <media:text><![CDATA[MelGeek x Evangelion Centauri60 &#039;Asuka Edition&#039; keyboard]]></media:text>
                                <media:title type="plain"><![CDATA[MelGeek x Evangelion Centauri60 &#039;Asuka Edition&#039; keyboard]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/2j6Ko6RgSK9oVAemx2rZFM-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Having recently spent time with MelGeek’s Made68 Ultra V2 keyboard, I came away declaring my love for its <a href="https://www.tomsguide.com/computing/keyboards/ive-been-using-melgeeks-made68-ultra-v2-for-three-weeks-and-im-in-love-with-its-magnetic-switches-slick-styling-and-clean-sound">magnetic switches, slick styling and clean sound</a>. With those things fresh in my mind, I approached the <a href="https://www.melgeek.com/en-eu/pages/melgeek-x-evangelion-centauri60-asuka-edition" target="_blank" rel="nofollow">Centauri60 Evangelion ‘Asuka Edition’</a> expecting a familiar experience. What I found instead was a keyboard that carries over everything I liked about the Ultra V2 while improving the parts that matter most to me in everyday use.</p><p>The Asuka Edition isn’t exactly subtle — it leans into its Evangelion theme and makes no effort to hide it. You get a ‘dominant’ red case, sharp angled edges, lighting strips on both sides, a hidden engraving of Asuka’s most iconic line, a Prog‑Knife motif, a metal nameplate built into the frame, and a laser‑etched EVA‑02 insignia. It’s unapologetically bold and openly geeky, far more so than the Made68 Ultra V2 I tested earlier, and that personality hits you straight away.</p><p>And yes, the volume knob is still one of those small touches that makes a big impact. On a 60% board, having a tactile media control feels like a luxury, and it’s one I’m thankful for given its absence from the Made 68 Ultra V2. Of course, there’s more to the Centauri60 than its theme —  it’s a keyboard which so resoundingly nails its build, sound, feel, gaming features and typing experience, that it’s now become my daily driver at home — here’s why.</p><h2 id="a-thocking-spectacular-sound-profile">A thocking spectacular sound profile</h2><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="hbjiSdJGBPczWwBjHoMfLM" name="9365" alt="MelGeek x Evangelion Centauri60 'Asuka Edition' keyboard" src="https://cdn.mos.cms.futurecdn.net/hbjiSdJGBPczWwBjHoMfLM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The acoustic profile is where the Centauri60 surprised me most. The Ultra V2 I tested sounded super clean, but it used KOM Lite switches which resulted in a brighter, snappier sound signature. The Centauri60, by contrast, comes installed with TTC Flip King magnetic switches, which I instantly preferred for their deeper, more muted tone. </p><p>Another major contributor has to be its CNC aluminium unibody, which weighs a hefty 1.32kg and provides a dense, vibration‑absorbing foundation. Compared to some of the more plastic-centric keyboards I’ve used in the past, this heavy-duty body noticeably suppresses higher‑frequency noise while letting lower tones develop more fully, giving the board a richer, more grounded sound. </p><p>The Centauri60 also uses a five‑layer acoustic dampening system — a combination of Poron foam, PET film, and a leaf‑spring gasket mount — designed to eliminate hollow cavities and absorb unwanted resonance. The result, in my estimation, is a keyboard that minimises harsh clacks for a smoother, more “creamy” signature</p><p>The magnetic switches certainly help with consistency, but the case design and acoustic layering are doing most of the heavy lifting, resulting in a sound profile that makes you want to keep typing simply because it sounds so great.</p><h2 id="easily-the-sturdiest-keyboard-i-ve-ever-tested">Easily the sturdiest keyboard I’ve ever tested</h2><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="Z93GN4BHw4o7fHsXbdT29M" name="9357" alt="MelGeek x Evangelion Centauri60 'Asuka Edition' keyboard" src="https://cdn.mos.cms.futurecdn.net/Z93GN4BHw4o7fHsXbdT29M-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The build quality on the last MelGeek board I tested was already impressive, but the Centauri60 feels like a step up in every direction. Its machined aluminium chassis has that dense, rigid character you’d expect from a well‑cut block of metal, and there’s genuinely no flex anywhere in the frame. The tighter tolerances, cleaner seams, and more even weight distribution give it a more confident, premium feel — even compared to the already excellent Made68 Ultra V2.</p><p>Granted, I’ve only used two MelGeek keyboards to date, but it feels like there’s very little room for improvement when it comes to the Centauri60’s build quality. Compared to the Made68 Ultra V2, there’s a more deliberate weight to the board when you pick it up — 1.32kg (2.91 lbs) to be exact — so you know it won’t slide around your desk in the heat of online battle.</p><p>That weight distribution also contributes to a “single‑piece” feel in hand, something that really sells the mecha‑like character of the board. Nothing shifts, nothing creaks, and the chassis feels impeccably engineered in true Evangelion fashion. It’s so good, it could almost make Shinji’s father smile — if he were capable of such a thing.</p><h2 id="immaculate-styling-for-evangelion-fans">Immaculate styling for Evangelion fans</h2><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="xhZJFo89dpnr2EtosLooDM" name="9356" alt="MelGeek x Evangelion Centauri60 'Asuka Edition' keyboard" src="https://cdn.mos.cms.futurecdn.net/xhZJFo89dpnr2EtosLooDM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As mentioned earlier, the Asuka Edition’s red colourway is easily its standout feature. It’s a saturated, confident red that really drives home its Evangelion inspiration. It’s unashamedly geeky, and its lighting helps amplify that personality: the south‑facing RGB shines cleanly through the keycaps. That bothered me somewhat on the Made68 Ultra V2, largely due to the dark purple text which made the keys hard to read. Here, the characters are white, making them far easier to make out at a glance.</p><p>Speaking of keycaps, the Asuka Edition employs a mix of red, orange and charcoal caps that mirror Asuka’s Unit‑02 palette, and the legends use Evangelion‑inspired typography that give the board a cool, futuristic vibe. The accent keys — particularly the green escape key and the darker modifiers — continues the anime‑driven look in a way that feels cohesive. Even the bottom of the case carries EVA‑specific detailing — the aforementioned “hidden” engraving — making the board feel like a collectible rather than just a themed variant.</p><p>The biggest downside of the entire keyboard sits right at the back: the USB‑C port. The port itself is recessed, but the real issue is the extra lip on MelGeek’s own USB‑C cable, which is designed to slot perfectly into that recess for a snug fit. Because of that proprietary lip, almost no third‑party cable can seat properly. So if you were hoping to pair the board with a coiled cable or any non‑MelGeek option, you’ll have to let that idea go or start thinking in terms of soldering irons. For a board that otherwise nails its visual identity, this restrictive setup feels out of place — and it’s the one styling choice that genuinely frustrated me.</p><h2 id="fully-specced-for-modern-gaming">Fully specced for modern gaming</h2><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="iVfXBzmR645Z94LWunNCAM" name="20260818_163331" alt="MelGeek x Evangelion Centauri60 'Asuka Edition' keyboard" src="https://cdn.mos.cms.futurecdn.net/iVfXBzmR645Z94LWunNCAM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Centauri60’s magnetic switch system performs on par with any Hall‑effect board I’ve tested, delivering consistent, predictable keystrokes that can be tuned to impressively fine sensitivity. All the core features — rapid trigger, SOCD cleaning, adjustable actuation, analog‑style travel sensing, NKRO and zero‑dead‑zone behaviour — run smoothly and without any fuss.</p><p>Actuation can be adjusted from 0.1mm all the way to 3.4mm, giving you plenty of control whether you prefer hair‑trigger responsiveness or a more deliberate typing feel. Rapid Trigger is adjustable from 0.01mm to 2.5mm, resetting the moment a key starts to rise, which makes repeated inputs feel snappy and effortless. SOCD cleaning is handled in firmware and follows standard competitive rules, ensuring clean directional behaviour when opposite keys are pressed.</p><p>The switches also support full analog‑style travel sensing, with 0.01mm precision, allowing the board to read the exact depth of each keypress rather than just on/off states. In practice, this enables multi‑stage actions, variable movement speeds and pressure‑sensitive inputs in supported games. The keyboard runs at an 8,000Hz polling rate with a 0.125ms latency, and key response feels immediate whether you’re typing or gaming.</p><h2 id="man-s-ultimate-fighting-machine">Man’s ultimate fighting machine</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="StCvVfYNLdofq4uxrcRrDM" name="20260818_091708" alt="MelGeek x Evangelion Centauri60 'Asuka Edition' keyboard" src="https://cdn.mos.cms.futurecdn.net/StCvVfYNLdofq4uxrcRrDM-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While I loved almost everything about MelGeek’s Made68 Ultra V2, the Centauri60 Evangelion ‘Asuka Edition’ improves on it in several of the areas which are most important to me. It’s got incredible styling that’s inspired by my favourite Evangelion character and EVA unit, its build quality feels strong enough to go into battle with Angels, its acoustics are deeper and thockier than that keyboard in a way that I find immensely satisfying, and its highly tunable Hall-effect switches give me all the high-end features I need in a competitive gaming keyboard. </p><p>As a noted fan of 75% layouts, I thought I’d be bothered by the Centauri60’s 60% layout, but it actually doesn’t feel too compact for me to use on a daily basis. And the fact that it still includes a small volume knob despite its condensed layout is a massive plus for me — especially since that was one of my biggest gripes with the Made68 Ultra V2.</p><p>The only real drawback is the USB‑C port, which is restrictive enough to be a genuine annoyance. That flaw aside, the Centauri60 becomes an easy recommendation for any Evangelion fan who wants a compact magnetic board with strong acoustics and a standout colourway.</p><div data-widget-type="multimodelreview" data-model-name="MelGeek Made68 Ultra V2,Melgeek Real 81,MelGeek Pixel" data-widget-title="Today's best MelGeek keyboard deals"></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/computing/peripherals/mechanical-keyboards-are-dead-heres-why-you-should-only-buy-a-magnetic-keyboard-for-gaming">Here’s why you should only buy a magnetic keyboard for gaming</a></li><li><a href="https://www.tomsguide.com/computing/keyboards/i-almost-found-my-dream-keyboard-in-the-gravastar-mercury-v60-pro-if-it-werent-for-three-finicky-details">The GravaStar Mercury V60 Pro is almost perfect except for three finicky details</a></li><li><a href="https://www.tomsguide.com/computing/keyboards/corsairs-vanguard-pro-96-keyboard-has-convinced-me-that-magnetic-switches-arent-just-hype">Corsair’s Vanguard Pro 96 keyboard has convinced me that magnetic switches aren’t just hype</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve used macOS Golden Gate for 3 months — and here’s what I think ]]></title>
                                                                                                <dc:content><![CDATA[ <p>macOS Golden Gate is here! Though not a complete overhaul like macOS Sequoia, it brings a slew of new and enhanced AI features and smoother overall performance that make the <a href="https://www.tomsguide.com/best-picks/best-macbook">best MacBooks</a> feel more personal and streamlined.</p><p>I’ve been using the Golden Gate beta since it launched in June, and the latest build is what you’ll find in the final version of macOS Golden Gate. So far, I’ve found it a perfectly reasonable OS update that isn’t a radical departure from last year’s. That said, the new, smarter <a href="https://www.tomsguide.com/phones/iphones/i-spent-a-week-with-siri-ai-here-are-my-honest-pros-and-cons">Siri AI</a> can be handy, and Liquid Glass is less obtrusive now.</p><p>Here’s my full review of macOS Golden Gate.</p><h3 class="article-body__section" id="section-macos-golden-gate-review-supported-devices"><span>macOS Golden Gate review: Supported devices</span></h3><p>The Intel era is over, as macOS Golden Gate doesn’t run on those older machines. Here is a complete list of Macs that support Golden Gate.</p><ul><li><strong>MacBook Neo (2026)</strong></li><li><strong>MacBook Air with Apple silicon (2020 and later)</strong></li><li><strong>MacBook Pro with Apple silicon (2020 and later)</strong></li><li><strong>iMac with Apple silicon (2021 and later)</strong></li><li><strong>Mac mini with Apple silicon (2020 and later)</strong></li><li><strong>Mac Studio with Apple silicon (2022 and later)</strong></li><li><strong>Mac Pro with Apple silicon (2023 and later)</strong></li></ul><h3 class="article-body__section" id="section-macos-golden-gate-review-new-features"><span>macOS Golden Gate review: New features</span></h3><h2 id="hey-siri">Hey, Siri!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3777px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="RJQ9US5qZUL5xu3z9FTSpn" name="macOS 27 Golden Gate Siri AI-5" alt="Siri AI on macOS 27" src="https://cdn.mos.cms.futurecdn.net/RJQ9US5qZUL5xu3z9FTSpn-1920-80.jpg" mos="" align="middle" fullscreen="" width="3777" height="2125" 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 dedicated Siri AI app for macOS Golden Gate now functions like chatbots such as ChatGPT and <a href="https://www.tomsguide.com/ai/google-gemini/google-gemini-everything-you-need-to-know">Google Gemini</a>. This app is also available on <a href="https://www.tomsguide.com/computing/vr-ar/ipados-27-everything-coming-to-the-apples-beloved-tablets">iPadOS 27</a> and <a href="https://www.tomsguide.com/phones/iphones/ios-27-11-biggest-features-coming-to-your-iphone">iOS 27<u>,</u></a> and is arguably the biggest new feature for the Apple devices that support it.</p><p>You can access the Siri AI app either by clicking it in the Dock or in the Menu bar. You can also open it from Spotlight. This opens a dedicated chat window where you can ask Siri AI questions or talk to it about whatever’s on your mind. Again, it works like the chatbots you’re already familiar with.</p><p>And since Siri AI is now baked into the operating system, it can do more than just chat. For example, if you’re looking at a schedule, you’ll see an “add to calendar” button appear. I’ve even had this happen when I suggest a date/time to meet with friends. When you right-click on folders, files, or apps, you’ll often see an “Ask Siri” option at the very top, where you can begin asking questions about whatever you’re highlighting.</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:5184px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zW8Y5gvHBBuuUMEQHd93FL" name="macOS 27 Golden Gate Siri AI-LIST2" alt="Siri AI on macOS 27" src="https://cdn.mos.cms.futurecdn.net/zW8Y5gvHBBuuUMEQHd93FL-1920-80.jpg" mos="" align="middle" fullscreen="" width="5184" height="2916" 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 can even create Shortcuts by typing or speaking what you want instead of building complications manually. While I wouldn’t call this vibe coding, it can feel that way since you’re using natural language.</p><p>For those in the Apple ecosystem, Siri AI can be more useful than other chatbots because it’s integrated into the system. However, third-party integrations are still a work in progress, so Siri AI’s usability for you might be limited if you use Google apps like Gmail, since Siri AI doesn’t work with them (yet).</p><p>If you’re like me and generally don’t use AI, then the updated Siri won’t make a huge difference with your macOS experience. In fact, you might forget it’s even there! But if you use AI, you can certainly get more done with the new Siri.</p><h2 id="liquid-glass-slider">Liquid Glass slider</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kbVSEAeYD7AF3N9vqnbxhG" name="macOS 27 liquid glass slider" alt="macOS 27 Liquid Glass" src="https://cdn.mos.cms.futurecdn.net/kbVSEAeYD7AF3N9vqnbxhG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Apple)</span></figcaption></figure><p>If you’re not a fan of the <a href="https://www.tomsguide.com/phones/iphones/ios-26s-liquid-glass-design-brings-big-changes-to-your-iphone-heres-everything-coming-in-the-public-beta">Liquid Glass UI</a>, you’ll be happy to know there’s now a slider to adjust its opacity. It lets you dial the effect up or down, and I’m surprised it took this long to implement it this way.</p><p>Beyond the slider, you’ll notice more complex background visuals appear more diffused, which improves text readability (a big issue for some). The edges of icons are also more pronounced, so they stand out more from the background. All app windows now have a uniform corner radius to help them pop out.</p><p>I've never had a problem with Liquid Glass because I think it’s an interesting visual effect. That said, I’m glad that folks can now fine-tune it to their liking. The slider is especially neat because it’s easy to use and clearly shows how much of a difference there is when you go from one extreme to the other.</p><h2 id="spatial-reframing">Spatial Reframing</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/2vyL4w3WxVGjQJPBPpoqq5-1920-80.jpg" alt="MacBook Air M5" /><figcaption>A MacBook Air before Reframe<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/vUC8TZ34UKYuqHaQC7jN6R-1920-80.jpg" alt="MacBook Air M5" /><figcaption>A MacBook Air after Reframe<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Spatial Reframing isn’t exclusive to macOS Golden Gate, but since the <a href="https://www.tomsguide.com/phones/iphones/apples-ai-powered-spatial-reframing-tool-just-stole-the-show-at-wwdc">Reframe tool stole the show at WWDC</a>, it’s a feature worth spotlighting if you take a lot of photos.</p><p>As its name suggests, Reframe lets you reframe existing photos and adjust the perspective as you like. This can be especially handy if you need to take photos in a hurry, since you can come back later to fix them.</p><p>After you select Reframe in the new Tools option in Photos’ editing mode, Apple Intelligence scans the photo you’ve selected. Then you can swipe your finger across the touchpad to change the perspective. Sliders on the side also give you more precise control over the angle, orientation, or size. When you’re done, the AI shifts things around to fill in any blanks.</p><p>This isn’t a feature I use often since I like photos in their original form, even if they’re not perfect. That said, I can’t knock the results, as Reframe does an excellent job of living up to its name. And to be fair, the changes made don’t radically alter the image — you just get a better version of what you’ve already snapped.</p><h3 class="article-body__section" id="section-macos-27-golden-gate-review-verdict"><span>macOS 27 Golden Gate review: Verdict</span></h3><p>Apple Intelligence wasn’t all it was hyped to be after it was first announced, but it’s now living up to its potential on Macs and the other Apple devices it can run on. If you’re a big AI user already, then macOS Golden Gate could be a huge game-changer for you. Other features such as the more customizable Liquid Glass UI and Spatial Reframing might not be monumental, but they’re nice additions regardless.</p><p>Even if macOS Golden Gate feels like a holding-pattern update for Macs, it’s still worthwhile and thankfully doesn’t ruin the great experience we had with Tahoe. If you own a Mac that supports the OS, you should update as soon as you can.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/macos/macos-golden-gate-review</link>
                                                                            <description>
                            <![CDATA[ macOS Golden Gate is now available for compatible Macs. Although it's not a major update, the new Siri AI and other features make the experience smoother. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">J4dxFiYheVBarzQWKrDQgn</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/2GvFVReTGeek38ip2JisoF-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 15 Sep 2026 02:59:10 +0000</pubDate>                                                                                                                                <updated>Tue, 15 Sep 2026 08:15:56 +0000</updated>
                                                                                                                                            <category><![CDATA[macOS]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/2GvFVReTGeek38ip2JisoF-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[macOS 27]]></media:description>                                                            <media:text><![CDATA[macOS 27]]></media:text>
                                <media:title type="plain"><![CDATA[macOS 27]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/2GvFVReTGeek38ip2JisoF-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>macOS Golden Gate is here! Though not a complete overhaul like macOS Sequoia, it brings a slew of new and enhanced AI features and smoother overall performance that make the <a href="https://www.tomsguide.com/best-picks/best-macbook">best MacBooks</a> feel more personal and streamlined.</p><p>I’ve been using the Golden Gate beta since it launched in June, and the latest build is what you’ll find in the final version of macOS Golden Gate. So far, I’ve found it a perfectly reasonable OS update that isn’t a radical departure from last year’s. That said, the new, smarter <a href="https://www.tomsguide.com/phones/iphones/i-spent-a-week-with-siri-ai-here-are-my-honest-pros-and-cons">Siri AI</a> can be handy, and Liquid Glass is less obtrusive now.</p><p>Here’s my full review of macOS Golden Gate.</p><h3 class="article-body__section" id="section-macos-golden-gate-review-supported-devices"><span>macOS Golden Gate review: Supported devices</span></h3><p>The Intel era is over, as macOS Golden Gate doesn’t run on those older machines. Here is a complete list of Macs that support Golden Gate.</p><ul><li><strong>MacBook Neo (2026)</strong></li><li><strong>MacBook Air with Apple silicon (2020 and later)</strong></li><li><strong>MacBook Pro with Apple silicon (2020 and later)</strong></li><li><strong>iMac with Apple silicon (2021 and later)</strong></li><li><strong>Mac mini with Apple silicon (2020 and later)</strong></li><li><strong>Mac Studio with Apple silicon (2022 and later)</strong></li><li><strong>Mac Pro with Apple silicon (2023 and later)</strong></li></ul><h3 class="article-body__section" id="section-macos-golden-gate-review-new-features"><span>macOS Golden Gate review: New features</span></h3><h2 id="hey-siri">Hey, Siri!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3777px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="RJQ9US5qZUL5xu3z9FTSpn" name="macOS 27 Golden Gate Siri AI-5" alt="Siri AI on macOS 27" src="https://cdn.mos.cms.futurecdn.net/RJQ9US5qZUL5xu3z9FTSpn-1920-80.jpg" mos="" align="middle" fullscreen="" width="3777" height="2125" 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 dedicated Siri AI app for macOS Golden Gate now functions like chatbots such as ChatGPT and <a href="https://www.tomsguide.com/ai/google-gemini/google-gemini-everything-you-need-to-know">Google Gemini</a>. This app is also available on <a href="https://www.tomsguide.com/computing/vr-ar/ipados-27-everything-coming-to-the-apples-beloved-tablets">iPadOS 27</a> and <a href="https://www.tomsguide.com/phones/iphones/ios-27-11-biggest-features-coming-to-your-iphone">iOS 27<u>,</u></a> and is arguably the biggest new feature for the Apple devices that support it.</p><p>You can access the Siri AI app either by clicking it in the Dock or in the Menu bar. You can also open it from Spotlight. This opens a dedicated chat window where you can ask Siri AI questions or talk to it about whatever’s on your mind. Again, it works like the chatbots you’re already familiar with.</p><p>And since Siri AI is now baked into the operating system, it can do more than just chat. For example, if you’re looking at a schedule, you’ll see an “add to calendar” button appear. I’ve even had this happen when I suggest a date/time to meet with friends. When you right-click on folders, files, or apps, you’ll often see an “Ask Siri” option at the very top, where you can begin asking questions about whatever you’re highlighting.</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:5184px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zW8Y5gvHBBuuUMEQHd93FL" name="macOS 27 Golden Gate Siri AI-LIST2" alt="Siri AI on macOS 27" src="https://cdn.mos.cms.futurecdn.net/zW8Y5gvHBBuuUMEQHd93FL-1920-80.jpg" mos="" align="middle" fullscreen="" width="5184" height="2916" 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 can even create Shortcuts by typing or speaking what you want instead of building complications manually. While I wouldn’t call this vibe coding, it can feel that way since you’re using natural language.</p><p>For those in the Apple ecosystem, Siri AI can be more useful than other chatbots because it’s integrated into the system. However, third-party integrations are still a work in progress, so Siri AI’s usability for you might be limited if you use Google apps like Gmail, since Siri AI doesn’t work with them (yet).</p><p>If you’re like me and generally don’t use AI, then the updated Siri won’t make a huge difference with your macOS experience. In fact, you might forget it’s even there! But if you use AI, you can certainly get more done with the new Siri.</p><h2 id="liquid-glass-slider">Liquid Glass slider</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kbVSEAeYD7AF3N9vqnbxhG" name="macOS 27 liquid glass slider" alt="macOS 27 Liquid Glass" src="https://cdn.mos.cms.futurecdn.net/kbVSEAeYD7AF3N9vqnbxhG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Apple)</span></figcaption></figure><p>If you’re not a fan of the <a href="https://www.tomsguide.com/phones/iphones/ios-26s-liquid-glass-design-brings-big-changes-to-your-iphone-heres-everything-coming-in-the-public-beta">Liquid Glass UI</a>, you’ll be happy to know there’s now a slider to adjust its opacity. It lets you dial the effect up or down, and I’m surprised it took this long to implement it this way.</p><p>Beyond the slider, you’ll notice more complex background visuals appear more diffused, which improves text readability (a big issue for some). The edges of icons are also more pronounced, so they stand out more from the background. All app windows now have a uniform corner radius to help them pop out.</p><p>I've never had a problem with Liquid Glass because I think it’s an interesting visual effect. That said, I’m glad that folks can now fine-tune it to their liking. The slider is especially neat because it’s easy to use and clearly shows how much of a difference there is when you go from one extreme to the other.</p><h2 id="spatial-reframing">Spatial Reframing</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/2vyL4w3WxVGjQJPBPpoqq5-1920-80.jpg" alt="MacBook Air M5" /><figcaption>A MacBook Air before Reframe<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/vUC8TZ34UKYuqHaQC7jN6R-1920-80.jpg" alt="MacBook Air M5" /><figcaption>A MacBook Air after Reframe<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Spatial Reframing isn’t exclusive to macOS Golden Gate, but since the <a href="https://www.tomsguide.com/phones/iphones/apples-ai-powered-spatial-reframing-tool-just-stole-the-show-at-wwdc">Reframe tool stole the show at WWDC</a>, it’s a feature worth spotlighting if you take a lot of photos.</p><p>As its name suggests, Reframe lets you reframe existing photos and adjust the perspective as you like. This can be especially handy if you need to take photos in a hurry, since you can come back later to fix them.</p><p>After you select Reframe in the new Tools option in Photos’ editing mode, Apple Intelligence scans the photo you’ve selected. Then you can swipe your finger across the touchpad to change the perspective. Sliders on the side also give you more precise control over the angle, orientation, or size. When you’re done, the AI shifts things around to fill in any blanks.</p><p>This isn’t a feature I use often since I like photos in their original form, even if they’re not perfect. That said, I can’t knock the results, as Reframe does an excellent job of living up to its name. And to be fair, the changes made don’t radically alter the image — you just get a better version of what you’ve already snapped.</p><h3 class="article-body__section" id="section-macos-27-golden-gate-review-verdict"><span>macOS 27 Golden Gate review: Verdict</span></h3><p>Apple Intelligence wasn’t all it was hyped to be after it was first announced, but it’s now living up to its potential on Macs and the other Apple devices it can run on. If you’re a big AI user already, then macOS Golden Gate could be a huge game-changer for you. Other features such as the more customizable Liquid Glass UI and Spatial Reframing might not be monumental, but they’re nice additions regardless.</p><p>Even if macOS Golden Gate feels like a holding-pattern update for Macs, it’s still worthwhile and thankfully doesn’t ruin the great experience we had with Tahoe. If you own a Mac that supports the OS, you should update as soon as you can.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPadOS 27: How to download it right now ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Apple's big week of operating system updates is finally here with the new <a href="https://www.tomsguide.com/computing/vr-ar/ipados-27-everything-coming-to-the-apples-beloved-tablets">iPadOS 27</a>. This year's update isn't groundbreaking; instead, it focuses on Apple Intelligence, which should make for a more personal, customized experience.</p><p>As with <a href="https://www.tomsguide.com/phones/iphones/ios-27-public-beta-is-now-live-9-features-you-need-to-try-first">iOS 27</a> and <a href="https://www.tomsguide.com/computing/macos/macos-27">macOS Golden Gate</a>, the main attraction is the reinvented Siri, which finally lives up to its potential. <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI</a>, as it’s now called, is context-aware and understands what’s on your screen. Because it’s built into the OS, it can directly control and manage apps. It also adds new child safety features, improved readability for Liquid Glass, new photo-editing tools, and more.</p><p>Here’s how to download iPadOS 27.</p><h2 id="how-to-download-ipados-27">How to download iPadOS 27 </h2><p>As always, before you install a major update like iPadOS 27, back up your iPad in case anything goes wrong and you need to return to <a href="https://www.tomsguide.com/computing/ipads/apple-ipados-26-review">iPadOS 26</a>.</p><p>Not every iPad will be compatible with the new operating system, but if your tablet is, the upgrade is free.</p><p>Here is the full list of iPads that are compatible with iPadOS 27:</p><ul><li><strong>iPad Pro (M4 and later)</strong></li><li><strong>iPad Pro 12.9‑inch (4th generation and later)</strong></li><li><strong>iPad Pro 11‑inch (2nd generation and later)</strong></li><li><strong>iPad Air 13-inch (M2 and later)</strong></li><li><strong>iPad Air 11-inch (M2, M3, and M4)</strong></li><li><strong>iPad Air 11-inch (4th generation and later)</strong></li><li><strong>iPad (A16)</strong></li><li><strong>iPad (9th generation and later)</strong></li><li><strong>iPad mini (A17 Pro)</strong></li><li><strong>iPad mini (6th generation)</strong></li></ul><section class="howto-block">                    <h3>1. Check for software updates</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/wEZBK5bWqaVzSccB3yLyGo.png"                                        alt="iPadOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/wEZBK5bWqaVzSccB3yLyGo.png"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Apple)</div></figure>                    <p><p><strong>Launch the Settings app and tap General</strong>, followed by <strong>Software Update</strong>.</p></p>                </section><section class="howto-block">                    <h3>2. Select iPadOS 27</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/kVpfn3XeSbaSkTmVLnYcZc.png"                                        alt="How to install iPadOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/kVpfn3XeSbaSkTmVLnYcZc.png"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>If you have the latest version of iPadOS, the new iPadOS 27 should already be waiting for you.</p></p>                </section><section class="howto-block">                    <h3>3. Download the update</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/gTXJnNVcr6jNZxT5jezgcc.png"                                        alt="How to install iPadOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/gTXJnNVcr6jNZxT5jezgcc.png"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Select either <strong>Update Now</strong>, which starts downloading the update right away, or <strong>Update Tonight</strong>, which delays the download until later.</p><p>You'll be prompted to enter your passcode. If you've selected Update Now, the download will begin. Downloading can take a while, so make sure your iPad has enough power or is connected to a charger when downloading iPadOS 27.</p></p>                </section><section class="howto-block">                    <h3>4. Install the update</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/EgTG3Pg6UwcRM3dDF6PNSc.png"                                        alt="How to install iPadOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/EgTG3Pg6UwcRM3dDF6PNSc.png"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Once you've downloaded iPadOS 27, you'll be prompted to either <strong>install it now or wait until later</strong>. After installation, your iPad will restart. After you enter your passcode, iPadOS 27 will be installed and ready for you to check out.</p><p>And that's how you download iPadOS 27! Enjoy.</p></p>                </section><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/macos/i-just-downloaded-macos-27-public-beta-skip-the-ai-and-try-these-5-hidden-features-instead">I just downloaded macOS 27 public beta — skip Siri AI and try these 5 hidden features instead</a></li><li><a href="https://www.tomsguide.com/computing/laptops/haptic-vs-mechanical-trackpads-i-put-them-both-through-a-gauntlet-and-one-almost-made-me-throw-my-laptop-into-the-sun">Haptic vs. Mechanical trackpads: I put them both through a gauntlet, and one almost made me throw my laptop into the sun</a></li><li><a href="https://www.tomsguide.com/computing/monitors/exclusive-i-asked-lenovos-gm-to-predict-the-future-of-monitors-and-its-the-end-of-our-chaotic-cable-cluttered-desks-and-monitors-that-fry-your-retinas">Exclusive: I asked Lenovo’s GM to predict the future of monitors, and it's the end of our chaotic, cable-cluttered desks and monitors that fry your retinas</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/ipads/ipados-27-how-to-download-it-right-now</link>
                                                                            <description>
                            <![CDATA[ iPadOS 27 is now live! Here's how to download the new operating system for your iPad. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">aqie7J9wKjXLnFybmdUecS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7oXYaT7tBAEw2Bpdcym2Ab-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 14 Sep 2026 21:30:44 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPads]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;br&gt;Send secure tips on Signal: scyo1.55.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/7oXYaT7tBAEw2Bpdcym2Ab-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPadOS 27]]></media:description>                                                            <media:text><![CDATA[iPadOS 27]]></media:text>
                                <media:title type="plain"><![CDATA[iPadOS 27]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7oXYaT7tBAEw2Bpdcym2Ab-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple's big week of operating system updates is finally here with the new <a href="https://www.tomsguide.com/computing/vr-ar/ipados-27-everything-coming-to-the-apples-beloved-tablets">iPadOS 27</a>. This year's update isn't groundbreaking; instead, it focuses on Apple Intelligence, which should make for a more personal, customized experience.</p><p>As with <a href="https://www.tomsguide.com/phones/iphones/ios-27-public-beta-is-now-live-9-features-you-need-to-try-first">iOS 27</a> and <a href="https://www.tomsguide.com/computing/macos/macos-27">macOS Golden Gate</a>, the main attraction is the reinvented Siri, which finally lives up to its potential. <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI</a>, as it’s now called, is context-aware and understands what’s on your screen. Because it’s built into the OS, it can directly control and manage apps. It also adds new child safety features, improved readability for Liquid Glass, new photo-editing tools, and more.</p><p>Here’s how to download iPadOS 27.</p><h2 id="how-to-download-ipados-27">How to download iPadOS 27 </h2><p>As always, before you install a major update like iPadOS 27, back up your iPad in case anything goes wrong and you need to return to <a href="https://www.tomsguide.com/computing/ipads/apple-ipados-26-review">iPadOS 26</a>.</p><p>Not every iPad will be compatible with the new operating system, but if your tablet is, the upgrade is free.</p><p>Here is the full list of iPads that are compatible with iPadOS 27:</p><ul><li><strong>iPad Pro (M4 and later)</strong></li><li><strong>iPad Pro 12.9‑inch (4th generation and later)</strong></li><li><strong>iPad Pro 11‑inch (2nd generation and later)</strong></li><li><strong>iPad Air 13-inch (M2 and later)</strong></li><li><strong>iPad Air 11-inch (M2, M3, and M4)</strong></li><li><strong>iPad Air 11-inch (4th generation and later)</strong></li><li><strong>iPad (A16)</strong></li><li><strong>iPad (9th generation and later)</strong></li><li><strong>iPad mini (A17 Pro)</strong></li><li><strong>iPad mini (6th generation)</strong></li></ul><section class="howto-block">                    <h3>1. Check for software updates</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/wEZBK5bWqaVzSccB3yLyGo.png"                                        alt="iPadOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/wEZBK5bWqaVzSccB3yLyGo.png"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Apple)</div></figure>                    <p><p><strong>Launch the Settings app and tap General</strong>, followed by <strong>Software Update</strong>.</p></p>                </section><section class="howto-block">                    <h3>2. Select iPadOS 27</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/kVpfn3XeSbaSkTmVLnYcZc.png"                                        alt="How to install iPadOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/kVpfn3XeSbaSkTmVLnYcZc.png"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>If you have the latest version of iPadOS, the new iPadOS 27 should already be waiting for you.</p></p>                </section><section class="howto-block">                    <h3>3. Download the update</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/gTXJnNVcr6jNZxT5jezgcc.png"                                        alt="How to install iPadOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/gTXJnNVcr6jNZxT5jezgcc.png"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Select either <strong>Update Now</strong>, which starts downloading the update right away, or <strong>Update Tonight</strong>, which delays the download until later.</p><p>You'll be prompted to enter your passcode. If you've selected Update Now, the download will begin. Downloading can take a while, so make sure your iPad has enough power or is connected to a charger when downloading iPadOS 27.</p></p>                </section><section class="howto-block">                    <h3>4. Install the update</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/EgTG3Pg6UwcRM3dDF6PNSc.png"                                        alt="How to install iPadOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/EgTG3Pg6UwcRM3dDF6PNSc.png"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Once you've downloaded iPadOS 27, you'll be prompted to either <strong>install it now or wait until later</strong>. After installation, your iPad will restart. After you enter your passcode, iPadOS 27 will be installed and ready for you to check out.</p><p>And that's how you download iPadOS 27! Enjoy.</p></p>                </section><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/macos/i-just-downloaded-macos-27-public-beta-skip-the-ai-and-try-these-5-hidden-features-instead">I just downloaded macOS 27 public beta — skip Siri AI and try these 5 hidden features instead</a></li><li><a href="https://www.tomsguide.com/computing/laptops/haptic-vs-mechanical-trackpads-i-put-them-both-through-a-gauntlet-and-one-almost-made-me-throw-my-laptop-into-the-sun">Haptic vs. Mechanical trackpads: I put them both through a gauntlet, and one almost made me throw my laptop into the sun</a></li><li><a href="https://www.tomsguide.com/computing/monitors/exclusive-i-asked-lenovos-gm-to-predict-the-future-of-monitors-and-its-the-end-of-our-chaotic-cable-cluttered-desks-and-monitors-that-fry-your-retinas">Exclusive: I asked Lenovo’s GM to predict the future of monitors, and it's the end of our chaotic, cable-cluttered desks and monitors that fry your retinas</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Here's how to download the macOS Golden Gate update right now ]]></title>
                                                                                                <dc:content><![CDATA[ <p>It's mid-September, which means Apple is now releasing its 2026 operating systems, including the full version of <a href="https://www.tomsguide.com/computing/macos/macos-27">macOS Golden Gate</a>.</p><p>If you're interested in Apple Intelligence and the new <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI</a>, you should try Golden Gate. There aren't many new features, but it improves Liquid Glass readability, offers easier customization, and delivers smoother performance for a better overall experience on the <a href="https://www.tomsguide.com/best-picks/best-macbook">best MacBooks</a>.</p><p>The AI features, marking the end of Apple's Intel era, are powered by <a href="https://www.tomsguide.com/ai/google-gemini">Google Gemini</a> and designed to work within Apple's ecosystem.</p><p>To make the update process as painless as possible, I've put together this quick, easy guide on how to download macOS Tahoe, with photos to walk you through it.</p><h3 class="article-body__section" id="section-supported-macs"><span>Supported Macs</span></h3><p>As with most macOS releases, Golden Gate is a free upgrade for all supported Macs. Not every device that ran macOS Tahoe can run Golden Gate.</p><p>Here's the full list of Macs that can install and run macOS Golden Gate:</p><ul><li><strong>MacBook Neo (2026)</strong></li><li><strong>MacBook Air with Apple silicon (2020 and later)</strong></li><li><strong>MacBook Pro with Apple silicon (2020 and later)</strong></li><li><strong>iMac with Apple silicon (2021 and later)</strong></li><li><strong>Mac mini with Apple silicon (2020 and later)</strong></li><li><strong>Mac Studio with Apple silicon (2022 and later)</strong></li><li><strong>Mac Pro with Apple silicon (2023 and later)</strong></li></ul><p><strong>Important before you update: </strong><em><strong>back up your Mac!</strong></em> Apple has the built-in Time Machine feature, or you could use a reputable third-party service like <a href="https://www.tomsguide.com/reviews/backblaze-cloud-storage-review">Backblaze </a>— our guide to the <a href="https://www.tomsguide.com/buying-guide/best-cloud-storage">best cloud storage</a> solutions offers even more recommendations for you.</p><h3 class="article-body__section" id="section-how-to-download-macos-golden-gate"><span>How to download macOS Golden Gate</span></h3><p>Apple makes downloading its macOS updates fairly straightforward.</p><section class="howto-block">                    <h3>1. Open System Settings</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/VwiWUWktjrNv3uJFyMfMpn.jpg"                                        alt="macOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/VwiWUWktjrNv3uJFyMfMpn.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide / Apple)</div></figure>                    <p><p>To start, <strong>open the System Settings menu</strong> on your Mac by <strong>clicking on the Apple icon in the top-left corner</strong>, then <strong>select "System Settings" from the drop-down menu</strong>. Alternatively, <strong>click</strong> <strong>the gear icon in the dock</strong>.</p></p>                </section><section class="howto-block">                    <h3>2. Navigate to General > Software Update</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/ASM9wMhQK6Vgae6MPBKatV.jpg"                                        alt="macOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/ASM9wMhQK6Vgae6MPBKatV.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide / Apple)</div></figure>                    <p><p>After that, <strong>navigate to the Software Update section of your General settings menu</strong>. To get there, <strong>click General in the left-hand menu of the System Settings menu</strong>, then <strong>click Software Update</strong>.</p><p>Then select <strong>macOS Golden Gate and click Upgrade Now.</strong></p><p>You will need to <strong>read and accept Apple's licensing agreement and terms and conditions </strong>to finish installing macOS Golden Gate.</p><p>From here, Golden Gate will start downloading and then install, and your update will be complete.</p></p>                </section><p>That’s all that’s required to download macOS Golden Gate. </p><p>Your Mac will restart once the download finishes. After that, you can start trying out all the new features. Depending on your connection speed, the download might take a few minutes, so be patient.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/ipads/7-apple-products-expected-to-be-announced-in-october-touchscreen-macbook-ultra-homepad-and-more"><strong>7 Apple products expected to be announced in October — touchscreen MacBook Ultra, HomePad and more</strong></a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-27-7-features-you-need-to-try-first-after-updating"><strong>iOS 27: 7 features you need to try first after updating</strong></a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice"><strong>iPhone Duo hands-on: Apple nailed it — and just put everyone else on notice</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/macos/heres-how-to-download-the-macos-golden-gate-update-right-now</link>
                                                                            <description>
                            <![CDATA[ Apple's macOS Golden Gate is now available. Here's how to download it and try the new Apple Intelligence features on Mac. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">HG6xZMzvt9jEdCnqRxteuF</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/6onBfgc6zZedV7zQBmGFw8-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 14 Sep 2026 21:25:32 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[macOS]]></category>
                                                    <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;br&gt;Send secure tips on Signal: scyo1.55.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/6onBfgc6zZedV7zQBmGFw8-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[macOS 27]]></media:description>                                                            <media:text><![CDATA[macOS 27]]></media:text>
                                <media:title type="plain"><![CDATA[macOS 27]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/6onBfgc6zZedV7zQBmGFw8-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It's mid-September, which means Apple is now releasing its 2026 operating systems, including the full version of <a href="https://www.tomsguide.com/computing/macos/macos-27">macOS Golden Gate</a>.</p><p>If you're interested in Apple Intelligence and the new <a href="https://www.tomsguide.com/ai/apple-finally-fixed-siri-heres-all-the-features-for-the-new-siri-ai-announced-at-wwdc">Siri AI</a>, you should try Golden Gate. There aren't many new features, but it improves Liquid Glass readability, offers easier customization, and delivers smoother performance for a better overall experience on the <a href="https://www.tomsguide.com/best-picks/best-macbook">best MacBooks</a>.</p><p>The AI features, marking the end of Apple's Intel era, are powered by <a href="https://www.tomsguide.com/ai/google-gemini">Google Gemini</a> and designed to work within Apple's ecosystem.</p><p>To make the update process as painless as possible, I've put together this quick, easy guide on how to download macOS Tahoe, with photos to walk you through it.</p><h3 class="article-body__section" id="section-supported-macs"><span>Supported Macs</span></h3><p>As with most macOS releases, Golden Gate is a free upgrade for all supported Macs. Not every device that ran macOS Tahoe can run Golden Gate.</p><p>Here's the full list of Macs that can install and run macOS Golden Gate:</p><ul><li><strong>MacBook Neo (2026)</strong></li><li><strong>MacBook Air with Apple silicon (2020 and later)</strong></li><li><strong>MacBook Pro with Apple silicon (2020 and later)</strong></li><li><strong>iMac with Apple silicon (2021 and later)</strong></li><li><strong>Mac mini with Apple silicon (2020 and later)</strong></li><li><strong>Mac Studio with Apple silicon (2022 and later)</strong></li><li><strong>Mac Pro with Apple silicon (2023 and later)</strong></li></ul><p><strong>Important before you update: </strong><em><strong>back up your Mac!</strong></em> Apple has the built-in Time Machine feature, or you could use a reputable third-party service like <a href="https://www.tomsguide.com/reviews/backblaze-cloud-storage-review">Backblaze </a>— our guide to the <a href="https://www.tomsguide.com/buying-guide/best-cloud-storage">best cloud storage</a> solutions offers even more recommendations for you.</p><h3 class="article-body__section" id="section-how-to-download-macos-golden-gate"><span>How to download macOS Golden Gate</span></h3><p>Apple makes downloading its macOS updates fairly straightforward.</p><section class="howto-block">                    <h3>1. Open System Settings</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/VwiWUWktjrNv3uJFyMfMpn.jpg"                                        alt="macOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/VwiWUWktjrNv3uJFyMfMpn.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide / Apple)</div></figure>                    <p><p>To start, <strong>open the System Settings menu</strong> on your Mac by <strong>clicking on the Apple icon in the top-left corner</strong>, then <strong>select "System Settings" from the drop-down menu</strong>. Alternatively, <strong>click</strong> <strong>the gear icon in the dock</strong>.</p></p>                </section><section class="howto-block">                    <h3>2. Navigate to General > Software Update</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/ASM9wMhQK6Vgae6MPBKatV.jpg"                                        alt="macOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/ASM9wMhQK6Vgae6MPBKatV.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide / Apple)</div></figure>                    <p><p>After that, <strong>navigate to the Software Update section of your General settings menu</strong>. To get there, <strong>click General in the left-hand menu of the System Settings menu</strong>, then <strong>click Software Update</strong>.</p><p>Then select <strong>macOS Golden Gate and click Upgrade Now.</strong></p><p>You will need to <strong>read and accept Apple's licensing agreement and terms and conditions </strong>to finish installing macOS Golden Gate.</p><p>From here, Golden Gate will start downloading and then install, and your update will be complete.</p></p>                </section><p>That’s all that’s required to download macOS Golden Gate. </p><p>Your Mac will restart once the download finishes. After that, you can start trying out all the new features. Depending on your connection speed, the download might take a few minutes, so be patient.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/ipads/7-apple-products-expected-to-be-announced-in-october-touchscreen-macbook-ultra-homepad-and-more"><strong>7 Apple products expected to be announced in October — touchscreen MacBook Ultra, HomePad and more</strong></a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-27-7-features-you-need-to-try-first-after-updating"><strong>iOS 27: 7 features you need to try first after updating</strong></a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice"><strong>iPhone Duo hands-on: Apple nailed it — and just put everyone else on notice</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Steam Frame reviews are here: 'Good looks, good performance, and a debilitating price' ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Valve announced the Steam Frame VR headset way <a href="https://www.tomsguide.com/computing/virtual-reality/valve-announces-steam-frame-vr-headset-a-premium-standalone-rival-to-the-meta-quest-3">back in November 2025,</a> promising an early 2026 release. After delays <a href="https://www.tomsguide.com/gaming/valve-hope-to-ship-steam-machines-in-2026-but-memory-shortages-could-cause-delays">due to component shortages and RAM issues</a>, the Frame is finally here.</p><p>Some early <a href="https://www.tomsguide.com/computing/vr-ar/steam-frame-unboxing-and-tutorial-videos-just-leaked-release-could-be-imminent">unboxing and tutorial videos leaked</a> last month, suggesting the headset was on the way. Major tech site Linus Tech Tips appeared to break the embargo with <a href="https://www.youtube.com/watch?v=uyYKFthau7M" target="_blank">his own video that popped up</a> over the weekend.</p><p>But it's here now with <a href="https://store.steampowered.com/sale/steamframe?l=english" target="_blank">Valve's official announcement</a> revealing two versions of the headset: one with 256GB of storage and a 1TB version starting at $1,059 and $1,299, respectively.</p><p>Tom's Guide is hard at work on our review of the Steam Frame, but some early reviews have started to crop up. Here's the early buzz on Valve's headset.</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:2103px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eYDqXZNvJiMYU6C5ChJFtE" name="Valve Steam Frame (1)" alt="Person wearing Valve Steam Frame" src="https://cdn.mos.cms.futurecdn.net/eYDqXZNvJiMYU6C5ChJFtE-1920-80.jpg" mos="" align="middle" fullscreen="" width="2103" height="1183" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Valve)</span></figcaption></figure><h2 id="quot-an-experiment-in-progress-quot-cnet">"An experiment in progress" - CNET</h2><p><a href="https://www.cnet.com/tech/gaming/valve-steam-frame-vr-headset-review/#toc-8b2c55d3-0def-459a-9cff-1a4c2bf497d8" target="_blank">CNET's Scott Stein</a> praised the Frame's lightweight build and ability to stream games from your PC but said that it won't replace his Steam Deck, nor is it the best VR headset he's used. </p><p>What excited Stein was a more modular future with features like detachable headsets and battery packs that hint at a possible evolution.</p><p>"The Frame isn’t necessarily the future of XR, as much as it’s a framework for evolving beyond the present. I got that feeling over and over again as I kept dipping back in. Maybe someday I’ll be blending all my worlds in one, all devices melting together."</p><h2 id="a-gaming-monitor-ign">A gaming monitor - IGN</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1845px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="ghp6A3aqEWeRLqYHRabqFV" name="Valve Steam Frame" alt="Valve Steam Frame" src="https://cdn.mos.cms.futurecdn.net/ghp6A3aqEWeRLqYHRabqFV-1920-80.jpg" mos="" align="middle" fullscreen="" width="1845" height="1038" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Valve)</span></figcaption></figure><p><a href="https://www.ign.com/articles/steam-frame-review" target="_blank">IGN's Jacqueline Thomas</a> described the Frame as one of the most comfortable VR headsets they've ever worn thanks to its lightweight design and vents that push hot air away from your face.</p><p>Though they played VR games, the review seems to describe the Frame as a gaming monitor for your face as much as a VR headset. But at $1,059, it's unlikely to knock the<a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses"> best AR glasses</a> off their perch or the Meta Quest 3.</p><h2 id="god-i-wish-this-were-600-rock-paper-shotgun">God, I wish this were £600 - Rock Paper Shotgun</h2><p>The price is the bugaboo when it comes to the Frame for <a href="https://www.rockpapershotgun.com/steam-frame-review" target="_blank">Rock Paper Shotgun's James Archer</a>. </p><p>"These, importantly, include remedies for VR pain points that have existed for ages. Unreliable wireless connections: fixed. Tricky setups: simplified. Weird controllers: normalized. Needing a Meta account: not needing a Meta account. When the Frame can do this much, this well, I’m practically forced at inside-out sensorpoint to conclude that if I was buying a VR kit for myself, it’d be this one," Archer said.</p><p>But then, the price is such a drawback, especially at nearly double the cost of Meta's Quest 3.</p><h2 id="good-looks-good-performance-and-a-debilitating-price-tom-39-s-hardware">Good looks, good performance, and a debilitating price - Tom's Hardware</h2><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="V2WRYAbgWtTT4mK4sdBj6C" name="Valve Steam Frame VR headset" alt="Valve Steam Frame VR headset" src="https://cdn.mos.cms.futurecdn.net/V2WRYAbgWtTT4mK4sdBj6C-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Valve)</span></figcaption></figure><p>Our colleagues at<a href="https://www.tomshardware.com/virtual-reality/valve-steam-frame-3-review" target="_blank"> Tom's Hardware</a> put together a thorough review of the Steam Frame that you should check out if you truly want the nitty-gritty.</p><p>Like most reviews we've found, Brandon Hill found a lot to like about the Frame, from the foam padding to excellent performance, even if standalone gaming struggles a bit. However, again, the price is a real pain point here. </p><p>"That’s a tall order in this economic climate, when gamers are already being assaulted from multiple fronts with rising memory, storage, and GPU prices," Hill said.</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/best-picks/best-vr-headsets">These are the 5 best VR headsets to buy in 2026 after spending hundreds of hours in virtual reality</a></li><li><a href="https://www.tomsguide.com/computing/virtual-reality/pimax-dream-air-review">I’ve played for 100 hours on a VR headset lighter than my iPhone — Pimax Dream Air is an expensive breakthrough</a></li><li><a href="https://www.tomsguide.com/computing/smart-glasses/i-tried-the-rayneo-gt-max-and-theyre-easily-the-most-comfortable-ar-glasses-ive-worn-yet">I tried the RayNeo GT Max, and they're easily the most comfortable AR glasses I've worn yet</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/vr-ar/steam-frame-reviews-are-here-good-looks-good-performance-and-a-debilitating-price</link>
                                                                            <description>
                            <![CDATA[ Valve's new VR headset is finally here, and here's everything you need to know about the Steam Frame. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">DHquz5eXW5earWv9binPG7</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/pUsRX3wDaCkjL8D3MifevB-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 14 Sep 2026 17:50:50 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[VR & AR]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;br&gt;Send secure tips on Signal: scyo1.55.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/pUsRX3wDaCkjL8D3MifevB-1920-80.jpg">
                                                            <media:credit><![CDATA[Valve]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Valve Steam Frame VR headset]]></media:description>                                                            <media:text><![CDATA[Valve Steam Frame VR headset]]></media:text>
                                <media:title type="plain"><![CDATA[Valve Steam Frame VR headset]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/pUsRX3wDaCkjL8D3MifevB-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Valve announced the Steam Frame VR headset way <a href="https://www.tomsguide.com/computing/virtual-reality/valve-announces-steam-frame-vr-headset-a-premium-standalone-rival-to-the-meta-quest-3">back in November 2025,</a> promising an early 2026 release. After delays <a href="https://www.tomsguide.com/gaming/valve-hope-to-ship-steam-machines-in-2026-but-memory-shortages-could-cause-delays">due to component shortages and RAM issues</a>, the Frame is finally here.</p><p>Some early <a href="https://www.tomsguide.com/computing/vr-ar/steam-frame-unboxing-and-tutorial-videos-just-leaked-release-could-be-imminent">unboxing and tutorial videos leaked</a> last month, suggesting the headset was on the way. Major tech site Linus Tech Tips appeared to break the embargo with <a href="https://www.youtube.com/watch?v=uyYKFthau7M" target="_blank">his own video that popped up</a> over the weekend.</p><p>But it's here now with <a href="https://store.steampowered.com/sale/steamframe?l=english" target="_blank">Valve's official announcement</a> revealing two versions of the headset: one with 256GB of storage and a 1TB version starting at $1,059 and $1,299, respectively.</p><p>Tom's Guide is hard at work on our review of the Steam Frame, but some early reviews have started to crop up. Here's the early buzz on Valve's headset.</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:2103px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eYDqXZNvJiMYU6C5ChJFtE" name="Valve Steam Frame (1)" alt="Person wearing Valve Steam Frame" src="https://cdn.mos.cms.futurecdn.net/eYDqXZNvJiMYU6C5ChJFtE-1920-80.jpg" mos="" align="middle" fullscreen="" width="2103" height="1183" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Valve)</span></figcaption></figure><h2 id="quot-an-experiment-in-progress-quot-cnet">"An experiment in progress" - CNET</h2><p><a href="https://www.cnet.com/tech/gaming/valve-steam-frame-vr-headset-review/#toc-8b2c55d3-0def-459a-9cff-1a4c2bf497d8" target="_blank">CNET's Scott Stein</a> praised the Frame's lightweight build and ability to stream games from your PC but said that it won't replace his Steam Deck, nor is it the best VR headset he's used. </p><p>What excited Stein was a more modular future with features like detachable headsets and battery packs that hint at a possible evolution.</p><p>"The Frame isn’t necessarily the future of XR, as much as it’s a framework for evolving beyond the present. I got that feeling over and over again as I kept dipping back in. Maybe someday I’ll be blending all my worlds in one, all devices melting together."</p><h2 id="a-gaming-monitor-ign">A gaming monitor - IGN</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1845px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="ghp6A3aqEWeRLqYHRabqFV" name="Valve Steam Frame" alt="Valve Steam Frame" src="https://cdn.mos.cms.futurecdn.net/ghp6A3aqEWeRLqYHRabqFV-1920-80.jpg" mos="" align="middle" fullscreen="" width="1845" height="1038" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Valve)</span></figcaption></figure><p><a href="https://www.ign.com/articles/steam-frame-review" target="_blank">IGN's Jacqueline Thomas</a> described the Frame as one of the most comfortable VR headsets they've ever worn thanks to its lightweight design and vents that push hot air away from your face.</p><p>Though they played VR games, the review seems to describe the Frame as a gaming monitor for your face as much as a VR headset. But at $1,059, it's unlikely to knock the<a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses"> best AR glasses</a> off their perch or the Meta Quest 3.</p><h2 id="god-i-wish-this-were-600-rock-paper-shotgun">God, I wish this were £600 - Rock Paper Shotgun</h2><p>The price is the bugaboo when it comes to the Frame for <a href="https://www.rockpapershotgun.com/steam-frame-review" target="_blank">Rock Paper Shotgun's James Archer</a>. </p><p>"These, importantly, include remedies for VR pain points that have existed for ages. Unreliable wireless connections: fixed. Tricky setups: simplified. Weird controllers: normalized. Needing a Meta account: not needing a Meta account. When the Frame can do this much, this well, I’m practically forced at inside-out sensorpoint to conclude that if I was buying a VR kit for myself, it’d be this one," Archer said.</p><p>But then, the price is such a drawback, especially at nearly double the cost of Meta's Quest 3.</p><h2 id="good-looks-good-performance-and-a-debilitating-price-tom-39-s-hardware">Good looks, good performance, and a debilitating price - Tom's Hardware</h2><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="V2WRYAbgWtTT4mK4sdBj6C" name="Valve Steam Frame VR headset" alt="Valve Steam Frame VR headset" src="https://cdn.mos.cms.futurecdn.net/V2WRYAbgWtTT4mK4sdBj6C-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Valve)</span></figcaption></figure><p>Our colleagues at<a href="https://www.tomshardware.com/virtual-reality/valve-steam-frame-3-review" target="_blank"> Tom's Hardware</a> put together a thorough review of the Steam Frame that you should check out if you truly want the nitty-gritty.</p><p>Like most reviews we've found, Brandon Hill found a lot to like about the Frame, from the foam padding to excellent performance, even if standalone gaming struggles a bit. However, again, the price is a real pain point here. </p><p>"That’s a tall order in this economic climate, when gamers are already being assaulted from multiple fronts with rising memory, storage, and GPU prices," Hill said.</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/best-picks/best-vr-headsets">These are the 5 best VR headsets to buy in 2026 after spending hundreds of hours in virtual reality</a></li><li><a href="https://www.tomsguide.com/computing/virtual-reality/pimax-dream-air-review">I’ve played for 100 hours on a VR headset lighter than my iPhone — Pimax Dream Air is an expensive breakthrough</a></li><li><a href="https://www.tomsguide.com/computing/smart-glasses/i-tried-the-rayneo-gt-max-and-theyre-easily-the-most-comfortable-ar-glasses-ive-worn-yet">I tried the RayNeo GT Max, and they're easily the most comfortable AR glasses I've worn yet</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I gave the Steam Machine 3 stars at launch — but a game-changing update and this 1TB storage hack has me thinking differently ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If you watch my video review of the <a href="https://www.tomsguide.com/gaming/steam-machine-review">Steam Machine</a>, you can tell how heartbroken I was by it. This was supposed to be the perfect middle ground — PC gaming smashed together with a console experience to give you your massive Steam library in a box by your TV.</p><p>But it felt overpriced, unpolished and struggled to hit the performance metrics PC games need in 2026. Then, I started using it…and using it some more…and after weeks of relentless software updates, I have to admit that <em>maybe </em>I rushed to judgement.</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/vYWbZGcIKVI" allowfullscreen></iframe></div></div><p>I stand by the score for most of you reading this: console players can get better living room bang for their buck elsewhere (for now) and for PC players, the component math isn’t really mathing. </p><p>But for those in that small group like me who just want our massive Steam backlogs on the big screen without the headache of using Windows from the couch, this is where the Steam Machine turns from good to great.</p><p>This started as a test of the <a href="https://www.amazon.com/Lexar-256GB-Micro-Express-900MB/dp/B0DYB7ZGR3" target="_blank" rel="nofollow">Lexar PLAY microSDXC card,</a> and as you can see by my sprawling thoughts, has evolved into something more. Let me explain.</p><h2 id="fsr-4-1-is-a-game-changer">FSR 4.1 is a game changer</h2><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="v4HrF7QQPQsVVL3MUgg4QU" name="Steam Machine" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/v4HrF7QQPQsVVL3MUgg4QU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The proof is in the pudding, and Forza Horizon 6 was the first place where I really felt that proof. Recently, Valve <a href="https://steamcommunity.com/groups/steam_hardware/announcements/detail/698770449667981837" target="_blank">updated the Steam Machine to support AMD’s FSR 4.1 resolution scaling</a> and frame generation tech (otherwise known as FSR Redstone).</p><p>Now, it’s worth noting that Horizon 6 is a game that has FSR 4.1 options natively supported in its in-game menus. For others, like The Last of Us Part II, you will have to go into the <strong>game properties, </strong>and <strong>turn the compatibility layer to Proton Experimental. </strong>A small file downloads and you should be off to the races.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="o5TQcpbH3VCvV24wmLGD7U" name="Steam Machine" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/o5TQcpbH3VCvV24wmLGD7U-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Even if the in-game settings says “FSR 3.1” of some sort, you’re getting FSR 4 — something that I saw when flipping over to Naughty Dog’s epic. The number changes are minor, but the real difference maker here is frame pacing and image quality.</p><p>Forza Horizon 6 had a real stuttering problem when I first played it on the Steam Machine, with driving gameplay feeling like it was on the framerate equivalent of an elastic band stretching and contracting.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/wDZobwvjWr3VWH5WddQadU-1920-80.jpg" alt="Steam Machine" /><figcaption>FSR 3<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/HbD9syCc9Va3RWorXXj6fU-1920-80.jpg" alt="Steam Machine" /><figcaption>FSR 4<small role="credit">Future</small></figcaption></figure></figure><p>Now with FSR 4, not only is ghosting drastically reduced, the 1% lows are much stronger for a massive improvement in consistency. The same can be said of The Last of Us too, as the surface textures don’t fizzle anymore and the frame pacing stability is much better.</p><div ><table><tbody><tr><td class="firstcol " ><p><strong>Game (and settings)</strong></p></td><td  ><p><strong>FSR 3</strong></p></td><td  ><p><strong>FSR 4</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Forza Horizon 6 (1080p Ultra FSR Performance)</strong></p></td><td  ><p>50 FPS</p></td><td  ><p>56 FPS</p></td></tr><tr><td class="firstcol " ><p><strong>The Last of Us Part 2 (1440p Medium Dynamic resolution scaling)</strong></p></td><td  ><p>52 FPS</p></td><td  ><p>55 FPS</p></td></tr></tbody></table></div><p>Throw in all the UI updates (like making resolution settings much clearer), stability improvements and support for USB wheels and pedals, and this is all coming together nicely! Not in a way that makes the price feel more worthwhile, but we’re heading in the right direction.</p><h2 id="the-remaining-friction-and-the-hack">The remaining friction (and the hack)</h2><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="y36AXNfeyagfEawshhPeVU" name="Steam Machine" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/y36AXNfeyagfEawshhPeVU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While the software and frame rates have evolved, that price remains a massive hurdle — to the point that the base model is the only tier that makes sense. However, that limited internal drive will fill up fast after downloading just a couple of modern games.</p><p>So the fix? The smartest move is buying the base model and pairing it with a microSDXC memory card like the Lexar PLAY I’ve been using. </p><div ><table><thead><tr><th class="firstcol " ><p>Storage</p></th><th  ><p><strong>Read/write speeds  (Mb/s)</strong></p></th><th  ><p>Cyberpunk 2077 load mission</p></th><th  ><p>007 First Light load mission</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Steam Machine internal SSD</strong></p></td><td  ><p>3865.7 / 4759.1</p></td><td  ><p>9.6 seconds</p></td><td  ><p>26.2 seconds</p></td></tr><tr><td class="firstcol " ><p><strong>Lexar PLAY microSDXC card</strong></p></td><td  ><p>155.5 / 149.4</p></td><td  ><p>16.9 seconds</p></td><td  ><p>40.7 seconds</p></td></tr></tbody></table></div><p>It’s cheaper to get a 1TB card than upgrading the internal storage, and while the read/write rates are slower than the internal storage, the speeds are fast enough to handle games without any stuttering.</p><p>There is a longer load time, but nothing too agonizing.</p><h2 id="the-comeback-kid">The comeback kid?</h2><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="kBVojPHsL8eazNgDWzCTfU" name="Steam Machine" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/kBVojPHsL8eazNgDWzCTfU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><div><blockquote><p>So, is the Steam Machine suddenly a five-star masterpiece? Let’s not get carried away. </p></blockquote></div><p>So, is the Steam Machine suddenly a five-star masterpiece? Let’s not get carried away. The sticker shock is still very real, and for anyone wanting to roll up their sleeves and build their own compact living room machine, the dollar-to-performance ratio doesn’t add up.</p><p>But the integration of FSR 4 has transformed a choppy, frustrating experience into a genuinely viable console competitor. The Steam Machine proves that hardware specs on a spreadsheet are only half the story, and Valve is putting in the grueling software work to right the ship.</p><p>Plus, you can save a little bit of cash on that premium storage tax by slapping a high-speed Lexar PLAY 1TB microSD card into the base model. The math doesn’t really math as badly as before. </p><p>It might not be the undisputed king of the living room just yet, but it’s absolutely a console comeback kid worth rooting for.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions">Nvidia’s RTX Spark N1X launches this October: My price predictions for the potential MacBook Pro killer</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter">I tested Acer's wild Project DualPlay Mini — and it's a gaming handheld and laptop in one gadget</a></li><li><a href="https://www.tomsguide.com/gaming/playstation/as-a-pc-snob-i-wanted-to-catch-gta-6-making-console-compromises-instead-im-in-awe-of-the-trickery">As a PC snob, I wanted to catch GTA 6 making console compromises. Instead, I’m in awe of the trickery</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/pc-gaming/i-gave-the-steam-machine-3-stars-at-launch-but-a-game-changing-update-and-this-1tb-storage-hack-has-me-thinking-differently</link>
                                                                            <description>
                            <![CDATA[ The Steam Machine is in its comeback era with FSR 4, and while the pricing is still crazy, it's a game-changing update that does make it awesome in my own testing! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">qFQCVEwKYZZu8o5cMEbNV3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/piJ44JNvyTdWibDxvdteUU-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 14 Sep 2026 09:00:00 +0000</pubDate>                                                                                                                                <updated>Mon, 14 Sep 2026 23:03:28 +0000</updated>
                                                                                                                                            <category><![CDATA[PC Gaming]]></category>
                                                    <category><![CDATA[Computing Hardware]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/piJ44JNvyTdWibDxvdteUU-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Steam Machine]]></media:description>                                                            <media:text><![CDATA[Steam Machine]]></media:text>
                                <media:title type="plain"><![CDATA[Steam Machine]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/piJ44JNvyTdWibDxvdteUU-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you watch my video review of the <a href="https://www.tomsguide.com/gaming/steam-machine-review">Steam Machine</a>, you can tell how heartbroken I was by it. This was supposed to be the perfect middle ground — PC gaming smashed together with a console experience to give you your massive Steam library in a box by your TV.</p><p>But it felt overpriced, unpolished and struggled to hit the performance metrics PC games need in 2026. Then, I started using it…and using it some more…and after weeks of relentless software updates, I have to admit that <em>maybe </em>I rushed to judgement.</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/vYWbZGcIKVI" allowfullscreen></iframe></div></div><p>I stand by the score for most of you reading this: console players can get better living room bang for their buck elsewhere (for now) and for PC players, the component math isn’t really mathing. </p><p>But for those in that small group like me who just want our massive Steam backlogs on the big screen without the headache of using Windows from the couch, this is where the Steam Machine turns from good to great.</p><p>This started as a test of the <a href="https://www.amazon.com/Lexar-256GB-Micro-Express-900MB/dp/B0DYB7ZGR3" target="_blank" rel="nofollow">Lexar PLAY microSDXC card,</a> and as you can see by my sprawling thoughts, has evolved into something more. Let me explain.</p><h2 id="fsr-4-1-is-a-game-changer">FSR 4.1 is a game changer</h2><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="v4HrF7QQPQsVVL3MUgg4QU" name="Steam Machine" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/v4HrF7QQPQsVVL3MUgg4QU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The proof is in the pudding, and Forza Horizon 6 was the first place where I really felt that proof. Recently, Valve <a href="https://steamcommunity.com/groups/steam_hardware/announcements/detail/698770449667981837" target="_blank">updated the Steam Machine to support AMD’s FSR 4.1 resolution scaling</a> and frame generation tech (otherwise known as FSR Redstone).</p><p>Now, it’s worth noting that Horizon 6 is a game that has FSR 4.1 options natively supported in its in-game menus. For others, like The Last of Us Part II, you will have to go into the <strong>game properties, </strong>and <strong>turn the compatibility layer to Proton Experimental. </strong>A small file downloads and you should be off to the races.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="o5TQcpbH3VCvV24wmLGD7U" name="Steam Machine" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/o5TQcpbH3VCvV24wmLGD7U-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Even if the in-game settings says “FSR 3.1” of some sort, you’re getting FSR 4 — something that I saw when flipping over to Naughty Dog’s epic. The number changes are minor, but the real difference maker here is frame pacing and image quality.</p><p>Forza Horizon 6 had a real stuttering problem when I first played it on the Steam Machine, with driving gameplay feeling like it was on the framerate equivalent of an elastic band stretching and contracting.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/wDZobwvjWr3VWH5WddQadU-1920-80.jpg" alt="Steam Machine" /><figcaption>FSR 3<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/HbD9syCc9Va3RWorXXj6fU-1920-80.jpg" alt="Steam Machine" /><figcaption>FSR 4<small role="credit">Future</small></figcaption></figure></figure><p>Now with FSR 4, not only is ghosting drastically reduced, the 1% lows are much stronger for a massive improvement in consistency. The same can be said of The Last of Us too, as the surface textures don’t fizzle anymore and the frame pacing stability is much better.</p><div ><table><tbody><tr><td class="firstcol " ><p><strong>Game (and settings)</strong></p></td><td  ><p><strong>FSR 3</strong></p></td><td  ><p><strong>FSR 4</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Forza Horizon 6 (1080p Ultra FSR Performance)</strong></p></td><td  ><p>50 FPS</p></td><td  ><p>56 FPS</p></td></tr><tr><td class="firstcol " ><p><strong>The Last of Us Part 2 (1440p Medium Dynamic resolution scaling)</strong></p></td><td  ><p>52 FPS</p></td><td  ><p>55 FPS</p></td></tr></tbody></table></div><p>Throw in all the UI updates (like making resolution settings much clearer), stability improvements and support for USB wheels and pedals, and this is all coming together nicely! Not in a way that makes the price feel more worthwhile, but we’re heading in the right direction.</p><h2 id="the-remaining-friction-and-the-hack">The remaining friction (and the hack)</h2><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="y36AXNfeyagfEawshhPeVU" name="Steam Machine" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/y36AXNfeyagfEawshhPeVU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While the software and frame rates have evolved, that price remains a massive hurdle — to the point that the base model is the only tier that makes sense. However, that limited internal drive will fill up fast after downloading just a couple of modern games.</p><p>So the fix? The smartest move is buying the base model and pairing it with a microSDXC memory card like the Lexar PLAY I’ve been using. </p><div ><table><thead><tr><th class="firstcol " ><p>Storage</p></th><th  ><p><strong>Read/write speeds  (Mb/s)</strong></p></th><th  ><p>Cyberpunk 2077 load mission</p></th><th  ><p>007 First Light load mission</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Steam Machine internal SSD</strong></p></td><td  ><p>3865.7 / 4759.1</p></td><td  ><p>9.6 seconds</p></td><td  ><p>26.2 seconds</p></td></tr><tr><td class="firstcol " ><p><strong>Lexar PLAY microSDXC card</strong></p></td><td  ><p>155.5 / 149.4</p></td><td  ><p>16.9 seconds</p></td><td  ><p>40.7 seconds</p></td></tr></tbody></table></div><p>It’s cheaper to get a 1TB card than upgrading the internal storage, and while the read/write rates are slower than the internal storage, the speeds are fast enough to handle games without any stuttering.</p><p>There is a longer load time, but nothing too agonizing.</p><h2 id="the-comeback-kid">The comeback kid?</h2><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="kBVojPHsL8eazNgDWzCTfU" name="Steam Machine" alt="Steam Machine" src="https://cdn.mos.cms.futurecdn.net/kBVojPHsL8eazNgDWzCTfU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><div><blockquote><p>So, is the Steam Machine suddenly a five-star masterpiece? Let’s not get carried away. </p></blockquote></div><p>So, is the Steam Machine suddenly a five-star masterpiece? Let’s not get carried away. The sticker shock is still very real, and for anyone wanting to roll up their sleeves and build their own compact living room machine, the dollar-to-performance ratio doesn’t add up.</p><p>But the integration of FSR 4 has transformed a choppy, frustrating experience into a genuinely viable console competitor. The Steam Machine proves that hardware specs on a spreadsheet are only half the story, and Valve is putting in the grueling software work to right the ship.</p><p>Plus, you can save a little bit of cash on that premium storage tax by slapping a high-speed Lexar PLAY 1TB microSD card into the base model. The math doesn’t really math as badly as before. </p><p>It might not be the undisputed king of the living room just yet, but it’s absolutely a console comeback kid worth rooting for.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions">Nvidia’s RTX Spark N1X launches this October: My price predictions for the potential MacBook Pro killer</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter">I tested Acer's wild Project DualPlay Mini — and it's a gaming handheld and laptop in one gadget</a></li><li><a href="https://www.tomsguide.com/gaming/playstation/as-a-pc-snob-i-wanted-to-catch-gta-6-making-console-compromises-instead-im-in-awe-of-the-trickery">As a PC snob, I wanted to catch GTA 6 making console compromises. Instead, I’m in awe of the trickery</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I used this Android tablet for three weeks — and its giant speaker has spoiled me ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Lenovo Tab Plus Gen 2 ($399) is the most unique tablet I’ve ever reviewed. It delivers exceptional sound thanks to the enormous JBL-9 speaker on its back. You could be forgiven for thinking it’s a speaker with a tablet attached! This is the most defining feature, but there’s more to like about Lenovo’s entertainment-focused tablet.</p><p>The bright, colorful 12.1-inch 2K display is ideal for watching your favorite videos and movies. The Tab Plus Gen 2 is also great for reading and web browsing. The large speaker can make the tablet uncomfortable to hold for too long, but the handy built-in kickstand balances that out, and you can rotate it for vertical or horizontal viewing.</p><p>If you’re looking for a powerful tablet for work, this slate isn’t for you, thanks to its relatively weak MediaTek Dimensity CPU and 8GB of RAM. But if you’re looking for an excellent entertainment machine with the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablet</a> sound, you should seriously consider the reasonably priced Lenovo Tab Plus Gen 2. Find out more in my full review!</p><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-cheat-sheet"><span>Lenovo Tab Plus Gen 2 review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> The Lenovo Tab Plus Gen 2 is an Android tablet built for entertainment.</li><li><strong>Who is it for?</strong> For folks who want a tablet to watch videos and that can deliver stellar, punchy sound.</li><li><strong>What does it cost?</strong> The Lenovo Tab Plus Gen 2 is typically $399 but is often discounted. At the time of writing, it’s on sale for $289 on <a href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-plus-gen-2-12.1-inch-mediatek/len103l0038" target="_blank" rel="nofollow">Lenovo’s website</a>.</li><li><strong>What do we like?</strong> We like the giant speaker that pumps out phenomenal sound, the handy kickstand, and the vivid 2.5K display.</li><li><strong>What don’t we like?</strong> We don’t like that the tablet can be cumbersome to hold for long periods and that its performance isn’t suitable for productivity.</li></ul><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-specs"><span>Lenovo Tab Plus Gen 2 review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Lenovo Tab Plus Gen 2</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$399</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>12.1-inch 2.5K (2560 x 1600), Multi-Touch, 120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Chip</strong></p></td><td  ><p>MediaTek Dimensity 7400 Processor</p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>8GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128GB </p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>Front: 8MP, fixed focus | Rear: 13MP, autofocus</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>WIFI 6 & Bluetooth 5.4</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>USB-C 2.0 </p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Celestial White </p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>7.13 × 10.98 × 0.27 inches (with speaker bump 0.89 inches)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.69 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-the-ups"><span>Lenovo Tab Plus Gen 2 review: The ups</span></h3><p>The Tab Plus Gen 2's giant speaker and rotatable kickstand instantly draw attention, but it also features a sharp, vibrant 12.1-inch display and long-lasting battery life.</p><h2 id="incredible-speaker-sound">Incredible speaker sound</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="s2wFLhTXzEQFnNSaJ6WifV" name="Lenovo Tab Plus Gen 2--7" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/s2wFLhTXzEQFnNSaJ6WifV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Speaker quality is, at best, a footnote in my tablet reviews, since slates generally produce less-than-stellar sound. With the Tab Plus Gen 2, this is the first thing I want to discuss as it’s the standout feature—so much so that I had already written an entire piece about how <a href="https://www.tomsguide.com/computing/android-tablets/the-gargantuan-speaker-on-this-android-tablet-isnt-a-gimmick-i-cant-believe-how-good-it-sounds">the gargantuan speaker on this Android tablet isn’t a gimmick</a>. If you’ll pardon the cliché, the speaker quality is music to your ears.</p><p>The JBL 9-Unit Pro speaker system is what makes the magic happen. As its name suggests, there are nine speakers: four tweeters, three woofers, and two passive radiators. Those last two speakers deliver deep bass, while the tweeters handle higher-frequency sounds.</p><p>Sound is great out of the box, but to make everything truly sound spectacular, you’ll need to head into the Dolby Atmos sub-menu in sound settings. There are three presets: Dynamic, which identifies the content and automatically adjusts for the best sound; Movie, which provides surround sound and clearer dialogue; and Music, which delivers detailed audio so every note and beat sounds punchy. Music also has presets: Detailed, Balanced, and Warm, plus a manual equalizer.</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="6xyjQgcGqcDSf37WzdYcLS" name="Lenovo Tab Plus Gen 2--14" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/6xyjQgcGqcDSf37WzdYcLS-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m a hard rock and heavy metal fan, and I’m almost always disappointed by the thin, flat sound from most tablets when listening to these genres. That wasn’t the case here, as everything from death metal bands like Amon Amarth to ‘80s tunes like Stan Bush’s “The Touch” sounded rich, punchy, and loud. Movies and podcasts also sound incredible in Movie Mode, with dialogue coming through clear and crisp.</p><p>The presets let you quickly enjoy whatever you’re listening to, but you can also dive into the equalizer settings to truly fine-tune how things sound. Regardless, your ears won’t be disappointed.</p><h2 id="built-in-rotatable-kickstand">Built-in, rotatable kickstand</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jBcfo7ASZyZNEDrkSbzXPc" name="Lenovo Tab Plus Gen 2--6" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/jBcfo7ASZyZNEDrkSbzXPc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The other notable design feature is the built-in kickstand. Attached directly to the speaker, the kickstand can rotate 360 degrees clockwise or counterclockwise. This lets you comfortably orient the slate horizontally when watching movies or vertically for reading.</p><p>While the rotating kickstand moves smoothly, it firmly stays in place once you’ve set it to your preferred position. And when you’re ready to travel with the slate, the kickstand snaps back into place when you push it inward. This might be a minor thing to some, but rotating the kickstand is also enjoyable since you can feel small bumps along the way.</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="mBdjAqrqHxTHxpoYSfYKBb" name="Lenovo Tab Plus Gen 2--3" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/mBdjAqrqHxTHxpoYSfYKBb-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I enjoy reading digital comics, so I love propping the tablet up on my table in portrait orientation so I don’t have to hold it while I read. The 16:9 aspect ratio is relatively close to a real comic’s trim size, which also helps. Naturally, this is also a great way to read books.</p><p>Like the kickstand, the tablet is made of sturdy aluminum that doesn’t bend or flex easily. Even if you won’t hold the tablet very often (more on why shortly), its smooth metal body feels nice against your fingers. I also like how the concave volume and power buttons are on the back and easy to reach when it’s in the horizontal position.</p><h2 id="vivid-display">Vivid display</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4Y6NTp4SSit5mg8Zx3DDdj" name="Lenovo Tab Plus Gen 2--15" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/4Y6NTp4SSit5mg8Zx3DDdj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The 12.1-inch (2560 x 1600) display on the Tab Plus Gen 2 might not stand out as much as the huge speaker, but it’s also no slouch. Even without an OLED panel, you get sharp image quality that’s bright and colorful.</p><p>When watching the latest trailer for the Street Fighter movie, I was impressed by how good everything looked. The detail and colors on the costumes and super moves pop. And thanks to the smooth 120Hz refresh rate, all the action moved smoothly. For watching movies, TV shows, and other videos, this display gets the job done.</p><div ><table><caption>Display benchmark results</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Lenovo Tab Plus Gen 2</strong></p></th><th  ><p><strong>Apple iPad (11th gen)</strong></p></th><th  ><p><strong>OnePlus Pad Go 2</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>597 (SDR) | 776 (HDR)</p></td><td  ><p>506 (SDR) | 496 (HDR)</p></td><td  ><p>544 (SDR) | 554 (HDR)</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>157.5%</p></td><td  ><p>108.8%</p></td><td  ><p>159.6%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>111.5%</p></td><td  ><p>77.1%</p></td><td  ><p>113.1%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.25</p></td><td  ><p>0.30</p></td><td  ><p>0.29</p></td></tr></tbody></table></div><p>Our lab test confirms what my eyes saw. Color reproduction (sRGB and DCI-P3) is generally oversaturated, which accounts for the vivid colors. Color accuracy (Delta-E) is also on par with other tablets. Those colors truly stand out thanks to the bright SDR and HDR brightness.</p><p>As you can see, Lenovo’s tablet quite literally outshines Apple’s iPad 11 and the OnePlus Pad Go 2 in both SDR and HDR brightness with adaptive brightness disabled. In fairness to the iPad, it delivers more natural hues than both Android tablets, since its sRGB and DCI-P3 values are closer to the 100% target.</p><h2 id="epic-battery-life">Epic battery life</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8ME6jXoWftuZc8mWxdG2z4" name="Lenovo Tab Plus Gen 2--9" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/8ME6jXoWftuZc8mWxdG2z4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you’re going to spend hours watching videos, then you’ll want a tablet that can last for the long haul. Thankfully, that’s the case here, as the Tab Plus Gen 2 offers astonishing battery life.</p><div ><table><caption>Battery life results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Time (hours:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Lenovo Tab Gen 2</strong></p></td><td  ><p>16:00 (60Hz) | 13:39 (120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Apple iPad (11th gen)</strong></p></td><td  ><p>11:25</p></td></tr><tr><td class="firstcol " ><p><strong>OnePlus Pad Go 2</strong></p></td><td  ><p>16:39</p></td></tr></tbody></table></div><p>In our battery test, which involved continuous web surfing over Wi-Fi with the display set to 150 nits of brightness, Lenovo’s slate lasted 16 hours at 60Hz and 13 hours and 39 minutes at 120Hz. While the OnePlus Pad Go 2 lasted almost 40 minutes longer, Lenovo’s tablet outlasted the iPad by nearly four and a half hours.</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="GQbFxdJu3aWa23MSAettaj" name="Lenovo Tab Plus Gen 2--5" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/GQbFxdJu3aWa23MSAettaj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I should note that the Tab Plus Gen 2 takes a while to fully charge. In our testing and in my own experience, it took 30 minutes to charge the tablet to 20%. Though you won’t have to charge the battery very often, just keep in mind that you’ll have to wait a while to fully juice it up.</p><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-the-downs"><span>Lenovo Tab Plus Gen 2 review: The Downs</span></h3><p>While the Tab Plus Gen 2 excels as an entertainment device, it falls short in some key areas.</p><h2 id="awkward-to-hold">Awkward to hold</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4KoEVhPEhMiTtH4rdM25MB" name="Lenovo Tab Plus Gen 2--17" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/4KoEVhPEhMiTtH4rdM25MB-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The giant JBL speaker is the Tab Plus Gen 2’s main selling point, but it can also be a hindrance.</p><p>Because the speaker adds bulk to the tablet’s bottom, holding the slate like a traditional tablet can be burdensome. While 1.69 pounds doesn’t sound that heavy, the weight distribution makes the tablet feel heavier.</p><p>If you rest the tablet on your lap or use the kickstand to prop it up on your desk, then its weight won’t be an issue. However, this isn’t a slate you can easily hold with one hand, let alone two, for long periods.</p><h2 id="basic-performance">Basic performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sNWTzap4AUU9CAxYmzq9mH" name="Lenovo Tab Plus Gen 2--4" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/sNWTzap4AUU9CAxYmzq9mH-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I don’t consider this a major drawback since this is an entertainment-focused tablet. Still, if you plan to do serious work on the Tab Plus Gen 2, you might not get the smoothest or fastest experience because of its lackluster performance.</p><p>The Tab Plus Gen 2 handles basic tasks like scrolling websites in Google Chrome and reading books on Kindle without issue. However, when I opened multiple apps or Chrome tabs, performance suffered. If I wanted to use this for work, where I typically have 20 to 30 Chrome tabs open, I wouldn't have the smoothest experience.</p><div ><table><caption>Performance benchmarks</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Lenovo Tab Gen 2</strong></p></th><th  ><p><strong>Apple iPad (11th gen)</strong></p></th><th  ><p><strong>OnePlus Pad Go 2</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core) </strong></p></td><td  ><p>1125 / 3417</p></td><td  ><p>2589 / 6176</p></td><td  ><p>1013 / 3081</p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score/fps) </strong></p></td><td  ><p>1063 / 6.37</p></td><td  ><p>2623 / 15.70</p></td><td  ><p>863 / 5.17</p></td></tr></tbody></table></div><p>While the Tab Gen 2 matches the <a href="https://www.tomsguide.com/tablets/android-tablets/oneplus-pad-2-review">OnePlus Pad Go 2</a> in both CPU performance (Geekbench 6) and gaming performance (3DMark), these MediaTek Dimensity-powered Android tablets still can’t compete with Apple’s entry-level iPad.</p><p>Again, you won’t have a sluggish experience when using this tablet for its intended purpose. Just keep your expectations in check if you try to run heavier workloads or graphically demanding video games.</p><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-verdict"><span>Lenovo Tab Plus Gen 2 review: Verdict</span></h3><p>I’m an iPad Pro user, so an Android tablet truly has to go above and beyond to impress me. And that’s exactly what the Lenovo Tab Plus Gen 2 has done thanks to its amazing sound quality, versatile kickstand, and crisp image quality.</p><p>Sure, it’s not powerful for heavy workloads, but if you mostly watch videos or read, this tablet has everything you’d need. The fact that it tops out at $399 is just icing on the proverbial cake. If you’re looking for an iPad alternative for your entertainment needs, don’t ignore the Lenovo Tab Plus Gen 2.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/tablets/lenovo-tab-plus-gen-2-review</link>
                                                                            <description>
                            <![CDATA[ The Lenovo Tab Plus Gen 2 delivers exceptional sound thanks to its enormous speaker. It's a great, reasonably priced, entertainment-focused tablet overall. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">FKZUjK3Q4sv5PzHmNtSqaJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/JnWanxXUQnh9uJWqcfTjLE-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 13 Sep 2026 12:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Android Tablets]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/JnWanxXUQnh9uJWqcfTjLE-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Lenovo Tab Plus Gen 2]]></media:description>                                                            <media:text><![CDATA[Lenovo Tab Plus Gen 2]]></media:text>
                                <media:title type="plain"><![CDATA[Lenovo Tab Plus Gen 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/JnWanxXUQnh9uJWqcfTjLE-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Lenovo Tab Plus Gen 2 ($399) is the most unique tablet I’ve ever reviewed. It delivers exceptional sound thanks to the enormous JBL-9 speaker on its back. You could be forgiven for thinking it’s a speaker with a tablet attached! This is the most defining feature, but there’s more to like about Lenovo’s entertainment-focused tablet.</p><p>The bright, colorful 12.1-inch 2K display is ideal for watching your favorite videos and movies. The Tab Plus Gen 2 is also great for reading and web browsing. The large speaker can make the tablet uncomfortable to hold for too long, but the handy built-in kickstand balances that out, and you can rotate it for vertical or horizontal viewing.</p><p>If you’re looking for a powerful tablet for work, this slate isn’t for you, thanks to its relatively weak MediaTek Dimensity CPU and 8GB of RAM. But if you’re looking for an excellent entertainment machine with the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablet</a> sound, you should seriously consider the reasonably priced Lenovo Tab Plus Gen 2. Find out more in my full review!</p><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-cheat-sheet"><span>Lenovo Tab Plus Gen 2 review: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> The Lenovo Tab Plus Gen 2 is an Android tablet built for entertainment.</li><li><strong>Who is it for?</strong> For folks who want a tablet to watch videos and that can deliver stellar, punchy sound.</li><li><strong>What does it cost?</strong> The Lenovo Tab Plus Gen 2 is typically $399 but is often discounted. At the time of writing, it’s on sale for $289 on <a href="https://www.lenovo.com/us/en/p/tablets/android-tablets/lenovo-tab-series/lenovo-tab-plus-gen-2-12.1-inch-mediatek/len103l0038" target="_blank" rel="nofollow">Lenovo’s website</a>.</li><li><strong>What do we like?</strong> We like the giant speaker that pumps out phenomenal sound, the handy kickstand, and the vivid 2.5K display.</li><li><strong>What don’t we like?</strong> We don’t like that the tablet can be cumbersome to hold for long periods and that its performance isn’t suitable for productivity.</li></ul><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-specs"><span>Lenovo Tab Plus Gen 2 review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Lenovo Tab Plus Gen 2</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$399</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>12.1-inch 2.5K (2560 x 1600), Multi-Touch, 120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Chip</strong></p></td><td  ><p>MediaTek Dimensity 7400 Processor</p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>8GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128GB </p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>Front: 8MP, fixed focus | Rear: 13MP, autofocus</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>WIFI 6 & Bluetooth 5.4</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>USB-C 2.0 </p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Celestial White </p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>7.13 × 10.98 × 0.27 inches (with speaker bump 0.89 inches)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.69 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-the-ups"><span>Lenovo Tab Plus Gen 2 review: The ups</span></h3><p>The Tab Plus Gen 2's giant speaker and rotatable kickstand instantly draw attention, but it also features a sharp, vibrant 12.1-inch display and long-lasting battery life.</p><h2 id="incredible-speaker-sound">Incredible speaker sound</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="s2wFLhTXzEQFnNSaJ6WifV" name="Lenovo Tab Plus Gen 2--7" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/s2wFLhTXzEQFnNSaJ6WifV-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Speaker quality is, at best, a footnote in my tablet reviews, since slates generally produce less-than-stellar sound. With the Tab Plus Gen 2, this is the first thing I want to discuss as it’s the standout feature—so much so that I had already written an entire piece about how <a href="https://www.tomsguide.com/computing/android-tablets/the-gargantuan-speaker-on-this-android-tablet-isnt-a-gimmick-i-cant-believe-how-good-it-sounds">the gargantuan speaker on this Android tablet isn’t a gimmick</a>. If you’ll pardon the cliché, the speaker quality is music to your ears.</p><p>The JBL 9-Unit Pro speaker system is what makes the magic happen. As its name suggests, there are nine speakers: four tweeters, three woofers, and two passive radiators. Those last two speakers deliver deep bass, while the tweeters handle higher-frequency sounds.</p><p>Sound is great out of the box, but to make everything truly sound spectacular, you’ll need to head into the Dolby Atmos sub-menu in sound settings. There are three presets: Dynamic, which identifies the content and automatically adjusts for the best sound; Movie, which provides surround sound and clearer dialogue; and Music, which delivers detailed audio so every note and beat sounds punchy. Music also has presets: Detailed, Balanced, and Warm, plus a manual equalizer.</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="6xyjQgcGqcDSf37WzdYcLS" name="Lenovo Tab Plus Gen 2--14" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/6xyjQgcGqcDSf37WzdYcLS-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m a hard rock and heavy metal fan, and I’m almost always disappointed by the thin, flat sound from most tablets when listening to these genres. That wasn’t the case here, as everything from death metal bands like Amon Amarth to ‘80s tunes like Stan Bush’s “The Touch” sounded rich, punchy, and loud. Movies and podcasts also sound incredible in Movie Mode, with dialogue coming through clear and crisp.</p><p>The presets let you quickly enjoy whatever you’re listening to, but you can also dive into the equalizer settings to truly fine-tune how things sound. Regardless, your ears won’t be disappointed.</p><h2 id="built-in-rotatable-kickstand">Built-in, rotatable kickstand</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jBcfo7ASZyZNEDrkSbzXPc" name="Lenovo Tab Plus Gen 2--6" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/jBcfo7ASZyZNEDrkSbzXPc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The other notable design feature is the built-in kickstand. Attached directly to the speaker, the kickstand can rotate 360 degrees clockwise or counterclockwise. This lets you comfortably orient the slate horizontally when watching movies or vertically for reading.</p><p>While the rotating kickstand moves smoothly, it firmly stays in place once you’ve set it to your preferred position. And when you’re ready to travel with the slate, the kickstand snaps back into place when you push it inward. This might be a minor thing to some, but rotating the kickstand is also enjoyable since you can feel small bumps along the way.</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="mBdjAqrqHxTHxpoYSfYKBb" name="Lenovo Tab Plus Gen 2--3" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/mBdjAqrqHxTHxpoYSfYKBb-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I enjoy reading digital comics, so I love propping the tablet up on my table in portrait orientation so I don’t have to hold it while I read. The 16:9 aspect ratio is relatively close to a real comic’s trim size, which also helps. Naturally, this is also a great way to read books.</p><p>Like the kickstand, the tablet is made of sturdy aluminum that doesn’t bend or flex easily. Even if you won’t hold the tablet very often (more on why shortly), its smooth metal body feels nice against your fingers. I also like how the concave volume and power buttons are on the back and easy to reach when it’s in the horizontal position.</p><h2 id="vivid-display">Vivid display</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4Y6NTp4SSit5mg8Zx3DDdj" name="Lenovo Tab Plus Gen 2--15" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/4Y6NTp4SSit5mg8Zx3DDdj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The 12.1-inch (2560 x 1600) display on the Tab Plus Gen 2 might not stand out as much as the huge speaker, but it’s also no slouch. Even without an OLED panel, you get sharp image quality that’s bright and colorful.</p><p>When watching the latest trailer for the Street Fighter movie, I was impressed by how good everything looked. The detail and colors on the costumes and super moves pop. And thanks to the smooth 120Hz refresh rate, all the action moved smoothly. For watching movies, TV shows, and other videos, this display gets the job done.</p><div ><table><caption>Display benchmark results</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Lenovo Tab Plus Gen 2</strong></p></th><th  ><p><strong>Apple iPad (11th gen)</strong></p></th><th  ><p><strong>OnePlus Pad Go 2</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>597 (SDR) | 776 (HDR)</p></td><td  ><p>506 (SDR) | 496 (HDR)</p></td><td  ><p>544 (SDR) | 554 (HDR)</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>157.5%</p></td><td  ><p>108.8%</p></td><td  ><p>159.6%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>111.5%</p></td><td  ><p>77.1%</p></td><td  ><p>113.1%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.25</p></td><td  ><p>0.30</p></td><td  ><p>0.29</p></td></tr></tbody></table></div><p>Our lab test confirms what my eyes saw. Color reproduction (sRGB and DCI-P3) is generally oversaturated, which accounts for the vivid colors. Color accuracy (Delta-E) is also on par with other tablets. Those colors truly stand out thanks to the bright SDR and HDR brightness.</p><p>As you can see, Lenovo’s tablet quite literally outshines Apple’s iPad 11 and the OnePlus Pad Go 2 in both SDR and HDR brightness with adaptive brightness disabled. In fairness to the iPad, it delivers more natural hues than both Android tablets, since its sRGB and DCI-P3 values are closer to the 100% target.</p><h2 id="epic-battery-life">Epic battery life</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8ME6jXoWftuZc8mWxdG2z4" name="Lenovo Tab Plus Gen 2--9" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/8ME6jXoWftuZc8mWxdG2z4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you’re going to spend hours watching videos, then you’ll want a tablet that can last for the long haul. Thankfully, that’s the case here, as the Tab Plus Gen 2 offers astonishing battery life.</p><div ><table><caption>Battery life results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Time (hours:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Lenovo Tab Gen 2</strong></p></td><td  ><p>16:00 (60Hz) | 13:39 (120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Apple iPad (11th gen)</strong></p></td><td  ><p>11:25</p></td></tr><tr><td class="firstcol " ><p><strong>OnePlus Pad Go 2</strong></p></td><td  ><p>16:39</p></td></tr></tbody></table></div><p>In our battery test, which involved continuous web surfing over Wi-Fi with the display set to 150 nits of brightness, Lenovo’s slate lasted 16 hours at 60Hz and 13 hours and 39 minutes at 120Hz. While the OnePlus Pad Go 2 lasted almost 40 minutes longer, Lenovo’s tablet outlasted the iPad by nearly four and a half hours.</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="GQbFxdJu3aWa23MSAettaj" name="Lenovo Tab Plus Gen 2--5" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/GQbFxdJu3aWa23MSAettaj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I should note that the Tab Plus Gen 2 takes a while to fully charge. In our testing and in my own experience, it took 30 minutes to charge the tablet to 20%. Though you won’t have to charge the battery very often, just keep in mind that you’ll have to wait a while to fully juice it up.</p><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-the-downs"><span>Lenovo Tab Plus Gen 2 review: The Downs</span></h3><p>While the Tab Plus Gen 2 excels as an entertainment device, it falls short in some key areas.</p><h2 id="awkward-to-hold">Awkward to hold</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4KoEVhPEhMiTtH4rdM25MB" name="Lenovo Tab Plus Gen 2--17" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/4KoEVhPEhMiTtH4rdM25MB-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The giant JBL speaker is the Tab Plus Gen 2’s main selling point, but it can also be a hindrance.</p><p>Because the speaker adds bulk to the tablet’s bottom, holding the slate like a traditional tablet can be burdensome. While 1.69 pounds doesn’t sound that heavy, the weight distribution makes the tablet feel heavier.</p><p>If you rest the tablet on your lap or use the kickstand to prop it up on your desk, then its weight won’t be an issue. However, this isn’t a slate you can easily hold with one hand, let alone two, for long periods.</p><h2 id="basic-performance">Basic performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sNWTzap4AUU9CAxYmzq9mH" name="Lenovo Tab Plus Gen 2--4" alt="Lenovo Tab Plus Gen 2" src="https://cdn.mos.cms.futurecdn.net/sNWTzap4AUU9CAxYmzq9mH-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I don’t consider this a major drawback since this is an entertainment-focused tablet. Still, if you plan to do serious work on the Tab Plus Gen 2, you might not get the smoothest or fastest experience because of its lackluster performance.</p><p>The Tab Plus Gen 2 handles basic tasks like scrolling websites in Google Chrome and reading books on Kindle without issue. However, when I opened multiple apps or Chrome tabs, performance suffered. If I wanted to use this for work, where I typically have 20 to 30 Chrome tabs open, I wouldn't have the smoothest experience.</p><div ><table><caption>Performance benchmarks</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Lenovo Tab Gen 2</strong></p></th><th  ><p><strong>Apple iPad (11th gen)</strong></p></th><th  ><p><strong>OnePlus Pad Go 2</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Geekbench 6 score (single-core / multi-core) </strong></p></td><td  ><p>1125 / 3417</p></td><td  ><p>2589 / 6176</p></td><td  ><p>1013 / 3081</p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Wild Life Extreme Unlimited (score/fps) </strong></p></td><td  ><p>1063 / 6.37</p></td><td  ><p>2623 / 15.70</p></td><td  ><p>863 / 5.17</p></td></tr></tbody></table></div><p>While the Tab Gen 2 matches the <a href="https://www.tomsguide.com/tablets/android-tablets/oneplus-pad-2-review">OnePlus Pad Go 2</a> in both CPU performance (Geekbench 6) and gaming performance (3DMark), these MediaTek Dimensity-powered Android tablets still can’t compete with Apple’s entry-level iPad.</p><p>Again, you won’t have a sluggish experience when using this tablet for its intended purpose. Just keep your expectations in check if you try to run heavier workloads or graphically demanding video games.</p><h3 class="article-body__section" id="section-lenovo-tab-plus-gen-2-review-verdict"><span>Lenovo Tab Plus Gen 2 review: Verdict</span></h3><p>I’m an iPad Pro user, so an Android tablet truly has to go above and beyond to impress me. And that’s exactly what the Lenovo Tab Plus Gen 2 has done thanks to its amazing sound quality, versatile kickstand, and crisp image quality.</p><p>Sure, it’s not powerful for heavy workloads, but if you mostly watch videos or read, this tablet has everything you’d need. The fact that it tops out at $399 is just icing on the proverbial cake. If you’re looking for an iPad alternative for your entertainment needs, don’t ignore the Lenovo Tab Plus Gen 2.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 7 Apple products expected to be announced in October — touchscreen MacBook Ultra, HomePad and more ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Apple's major "Surprise and Shine" event is behind us and the <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a>, Apple's first foldable, is finally official. But there were some omissions based on the rumors, including a lack of smart home devices. </p><p>Those devices could still be on the way. Apple typically announces new MacBooks in October, and we could see some other products then as well. Here are the seven new Apple products that we could see next month.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYkKoW"></div>                            </div>                            <script src="https://kwizly.com/embed/XYkKoW.js" async></script><h2 id="touchscreen-macbook-ultra-with-oled">Touchscreen MacBook Ultra with OLED</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QPcja3jFKABn8AV7SjDfvd" name="MacBook Pro M5 Pro edit 5 final" alt="MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/QPcja3jFKABn8AV7SjDfvd-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Apple has already released a surprising number of Mac laptops and desktops this year. We had the <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>, <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-m5-review">M5 MacBook Air</a>, and M5 Pro and M5 Max MacBook Pros way back in the spring, plus late <a href="https://www.tomsguide.com/computing/apple-desktops/apple-is-turbocharging-the-mac-mini-with-its-new-m6-chip-but-the-model-with-an-m5-pro-is-actually-faster">refreshes of the Mac mini </a>and <a href="https://www.tomsguide.com/computing/apple-desktops/apple-just-announced-the-new-mac-studio-with-m5-ultra-and-it-will-be-a-local-ai-powerhouse">Mac Studio</a>.</p><p>Next month we're expecting an M6 version of the iMac, which also might get some new colorways, and an M6 MacBook Pro. </p><p>But the headliner should be a new <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Pro (or Ultra)</a>. The big change here should be a new OLED touchscreen display, which would make it the first OLED MacBook.</p><p>OLED panels are thinner, so the Ultra should be both slimmer and lighter in both 14- and 16-inch versions. It could be powered by the as-yet-unannounced M6 Pro and M6 Max chipsets. This does mean that we might not see the Ultra until early 2027, as Apple has pushed announcing those chips into the first half of the year.</p><p>Unfortunately, all these new features and higher-tier silicon mean that the Ultra could have a starting price around $2,499 for the 14-inch model, up from $2,199 for the current M5 Pro models.</p><h2 id="ipad-mini-with-oled">iPad mini with OLED</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FFvt6WRhhQWvHKtffpdzDX" name="iPad mini 7-LIST4.jpg" alt="iPad mini 7" src="https://cdn.mos.cms.futurecdn.net/FFvt6WRhhQWvHKtffpdzDX-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The iPad Pro has had an OLED display since 2024, but we could finally see an <a href="https://www.tomsguide.com/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried">iPad mini with OLED</a> this October. Coincidentally, the mini hasn't received an update since October 2024, when the <a href="https://www.tomsguide.com/tablets/ipads/ipad-mini-7-review">iPad mini 7 </a>was released.</p><p>It will likely get a faster chip, probably the A19, if not the new A20, so it can run Apple Intelligence, especially the new Siri AI. It's not clear from rumors if any other design changes will be made. However, it might be thinner and lighter since the OLED panel is thinner.</p><p>We should also see an updated entry-level iPad. As far as we're aware the only update here would be new chips.</p><h2 id="smart-home-devices">Smart Home Devices</h2><p>We warned before the iPhone event that rumors about Apple's smart home options need to be taken with a grain of salt. For years, leaks and rumor mongers have suggested that Apple is planning to introduce a suite of smart home devices, including a revamped HomePod and an AI-powered Apple TV 4K set-top box.</p><p>Rumors suggested that Apple would announce these devices during the iPhone event, which obviously did not come to fruition.</p><p>Apple seems to have finally figured out <a href="https://www.tomsguide.com/phones/iphones/i-spent-a-week-with-siri-ai-here-are-my-honest-pros-and-cons">Siri AI</a> with <a href="https://www.tomsguide.com/phones/iphones/ios-27-public-beta-hands-on-preview-the-new-siri-and-apple-intelligence-features-completely-changed-how-i-use-my-iphone">iOS 27</a>. If it releases and works as pitched, we could finally start seeing Apple Home.</p><h3 id="homepod-home-hub">HomePod Home hub</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:50.03%;"><img id="6cHdWWcJ7vz4iYUqsWBji4" name="Apple 2026 C HomePad Touch" alt="A rendering of an Apple HomePod with iPad-style touchscreen" src="https://cdn.mos.cms.futurecdn.net/6cHdWWcJ7vz4iYUqsWBji4-1920-80.jpg" mos="" align="middle" fullscreen="" width="3000" height="1501" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Apple)</span></figcaption></figure><p>Previously, Bloomberg's Mark Gurman, long a reporter of the rumored HomePod updates, <a href="https://www.bloomberg.com/news/newsletters/2026-08-09/apple-explores-apple-watch-shake-up-company-prepares-for-september-iphone-event" target="_blank">believed </a>that a new <a href="https://www.tomsguide.com/reviews/apple-homepod-mini">HomePod mini</a> could launch with the iPhones alongside the rumored HomePod Home hub. </p><p>However, right before the iPhone event, <a href="https://x.com/markgurman/status/2097687667471466751" target="_blank">Gurman cheekily tweeted</a>, "If you don't see the Apple TV, HomePod mini, home display and touch MacBook today, don't worry. It's only September."</p><p>Several different iterations of this device have been rumored, including one with a <a href="https://www.tomsguide.com/home/smart-home/apples-next-big-thing-could-be-a-dollar1000-home-robot-ipad-combo">$1,000 robot arm</a>. The most common version involves a <a href="https://www.tomsguide.com/home/smart-home/apple-tipped-to-launch-ai-wall-tablet-to-control-your-home-in-march-2025-everything-we-know-so-far">wall-mounted touchpad</a> or a HomePod speaker with a touch display about the size of an iPad mini. </p><p>This device would have a FaceTime camera for video calls and presence sensors to initiate smart home routines. </p><h3 id="homepod-mini-2">HomePod mini 2</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vBASuHrx9nHrVPyhDjThYN" name="apple-homepod-mini-midnight.jpg" alt="Apple HomePod mini in midnight with an iPhone" src="https://cdn.mos.cms.futurecdn.net/vBASuHrx9nHrVPyhDjThYN-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>A  <a href="https://www.tomsguide.com/home/smart-home/new-apple-tv-and-homepod-mini-reportedly-launching-in-2025-with-apple-networking-chip">new HomePod mini</a> might also debut, but it might not be as big of an upgrade as the Hub. Most rumors suggest that it will feature a new chip and audio improvements. It will probably get new colors.</p><p>The HomePod mini 2 has been on our <a href="https://www.tomsguide.com/news/hoping-for-a-homepod-mini-2-to-go-with-the-new-homepod-dont-hold-your-breath">rumor radar since at least 2023</a>. The current version debuted in 2020, and like the next device, is long overdue for an update.</p><h3 id="apple-tv-4k-2026">Apple TV 4K 2026</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="35tUhk2U4oNYnKewrYtsxJ" name="apple tv vpn.jpg" alt="Apple TV" src="https://cdn.mos.cms.futurecdn.net/35tUhk2U4oNYnKewrYtsxJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Lebedev Yury/Shutterstock)</span></figcaption></figure><p>Like the HomePod series, Apple hasn't released a new version of the <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV 4K</a> since 2022. We're long overdue for an upgrade — even if it's only a more powerful chip for stronger performance. </p><p>Previously, it was suggested that a new Apple TV could feature <a href="https://www.tomsguide.com/entertainment/streaming-devices/new-apple-tv-4k-biggest-upgrades-just-leaked-ahead-of-launch">the A17 Pro chip</a>, but it's more likely it'll get the new A20 or, to save some money, last year's A19. The device should also get the <a href="https://www.tomsguide.com/phones/iphones/new-iphone-18-pro-chips-camera-upgrades-and-more-leaked-by-analyst-heres-what-we-know">rumored N2 chip </a>for better Wi-Fi and Bluetooth connectivity. </p><p>Outside of chips, the big upgrade would be Siri AI, which could let you connect the Apple TV as a hub for smart devices. One rumor suggested that Apple might release a <a href="https://www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmnahttps:/www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmna" target="_blank">set-top box with a camera,</a> which would allow for FaceTime calls and gesture-based controls.</p><p>However, a rumored refresh of the Apple TV has been making the rounds for multiple years now. I won't believe this one until it actually happens.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/interview-apple-ceo-john-ternus-on-his-defining-moment-for-the-iphone-duo"><strong>I interviewed Apple CEO John Ternus on the making of the iPhone Duo — here's what made him say 'yes, that's it'</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/apple-intelligence/people-are-freaking-out-about-the-new-always-listening-apple-watches-heres-what-apple-ceo-john-ternus-told-us"><strong>People are freaking out about the new 'always-listening' Apple Watches — here's what Apple CEO John Ternus told us</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/news/live/apple-event-live-foldable-iphone-iphone-18-pro-max-apple-watch-12-and-all-the-big-news"><strong>Apple Event recap — Hands-on with the iPhone Duo and all the big announcements</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/ipads/7-apple-products-expected-to-be-announced-in-october-touchscreen-macbook-ultra-homepad-and-more</link>
                                                                            <description>
                            <![CDATA[ From devices that were missing at the iPhone event to the normal releases of new MacBooks. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">XDSSh5HeF7oorNEPg8qU6d</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/e23qstJHdTZC8CzcxTVBhS-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 13 Sep 2026 10:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPads]]></category>
                                                    <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Smart Home]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;br&gt;Send secure tips on Signal: scyo1.55.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/e23qstJHdTZC8CzcxTVBhS-1920-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[John Ternus at Apple event]]></media:description>                                                            <media:text><![CDATA[John Ternus at Apple event]]></media:text>
                                <media:title type="plain"><![CDATA[John Ternus at Apple event]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/e23qstJHdTZC8CzcxTVBhS-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple's major "Surprise and Shine" event is behind us and the <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a>, Apple's first foldable, is finally official. But there were some omissions based on the rumors, including a lack of smart home devices. </p><p>Those devices could still be on the way. Apple typically announces new MacBooks in October, and we could see some other products then as well. Here are the seven new Apple products that we could see next month.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYkKoW"></div>                            </div>                            <script src="https://kwizly.com/embed/XYkKoW.js" async></script><h2 id="touchscreen-macbook-ultra-with-oled">Touchscreen MacBook Ultra with OLED</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QPcja3jFKABn8AV7SjDfvd" name="MacBook Pro M5 Pro edit 5 final" alt="MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/QPcja3jFKABn8AV7SjDfvd-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Apple has already released a surprising number of Mac laptops and desktops this year. We had the <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>, <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-m5-review">M5 MacBook Air</a>, and M5 Pro and M5 Max MacBook Pros way back in the spring, plus late <a href="https://www.tomsguide.com/computing/apple-desktops/apple-is-turbocharging-the-mac-mini-with-its-new-m6-chip-but-the-model-with-an-m5-pro-is-actually-faster">refreshes of the Mac mini </a>and <a href="https://www.tomsguide.com/computing/apple-desktops/apple-just-announced-the-new-mac-studio-with-m5-ultra-and-it-will-be-a-local-ai-powerhouse">Mac Studio</a>.</p><p>Next month we're expecting an M6 version of the iMac, which also might get some new colorways, and an M6 MacBook Pro. </p><p>But the headliner should be a new <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Pro (or Ultra)</a>. The big change here should be a new OLED touchscreen display, which would make it the first OLED MacBook.</p><p>OLED panels are thinner, so the Ultra should be both slimmer and lighter in both 14- and 16-inch versions. It could be powered by the as-yet-unannounced M6 Pro and M6 Max chipsets. This does mean that we might not see the Ultra until early 2027, as Apple has pushed announcing those chips into the first half of the year.</p><p>Unfortunately, all these new features and higher-tier silicon mean that the Ultra could have a starting price around $2,499 for the 14-inch model, up from $2,199 for the current M5 Pro models.</p><h2 id="ipad-mini-with-oled">iPad mini with OLED</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FFvt6WRhhQWvHKtffpdzDX" name="iPad mini 7-LIST4.jpg" alt="iPad mini 7" src="https://cdn.mos.cms.futurecdn.net/FFvt6WRhhQWvHKtffpdzDX-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The iPad Pro has had an OLED display since 2024, but we could finally see an <a href="https://www.tomsguide.com/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried">iPad mini with OLED</a> this October. Coincidentally, the mini hasn't received an update since October 2024, when the <a href="https://www.tomsguide.com/tablets/ipads/ipad-mini-7-review">iPad mini 7 </a>was released.</p><p>It will likely get a faster chip, probably the A19, if not the new A20, so it can run Apple Intelligence, especially the new Siri AI. It's not clear from rumors if any other design changes will be made. However, it might be thinner and lighter since the OLED panel is thinner.</p><p>We should also see an updated entry-level iPad. As far as we're aware the only update here would be new chips.</p><h2 id="smart-home-devices">Smart Home Devices</h2><p>We warned before the iPhone event that rumors about Apple's smart home options need to be taken with a grain of salt. For years, leaks and rumor mongers have suggested that Apple is planning to introduce a suite of smart home devices, including a revamped HomePod and an AI-powered Apple TV 4K set-top box.</p><p>Rumors suggested that Apple would announce these devices during the iPhone event, which obviously did not come to fruition.</p><p>Apple seems to have finally figured out <a href="https://www.tomsguide.com/phones/iphones/i-spent-a-week-with-siri-ai-here-are-my-honest-pros-and-cons">Siri AI</a> with <a href="https://www.tomsguide.com/phones/iphones/ios-27-public-beta-hands-on-preview-the-new-siri-and-apple-intelligence-features-completely-changed-how-i-use-my-iphone">iOS 27</a>. If it releases and works as pitched, we could finally start seeing Apple Home.</p><h3 id="homepod-home-hub">HomePod Home hub</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:50.03%;"><img id="6cHdWWcJ7vz4iYUqsWBji4" name="Apple 2026 C HomePad Touch" alt="A rendering of an Apple HomePod with iPad-style touchscreen" src="https://cdn.mos.cms.futurecdn.net/6cHdWWcJ7vz4iYUqsWBji4-1920-80.jpg" mos="" align="middle" fullscreen="" width="3000" height="1501" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Apple)</span></figcaption></figure><p>Previously, Bloomberg's Mark Gurman, long a reporter of the rumored HomePod updates, <a href="https://www.bloomberg.com/news/newsletters/2026-08-09/apple-explores-apple-watch-shake-up-company-prepares-for-september-iphone-event" target="_blank">believed </a>that a new <a href="https://www.tomsguide.com/reviews/apple-homepod-mini">HomePod mini</a> could launch with the iPhones alongside the rumored HomePod Home hub. </p><p>However, right before the iPhone event, <a href="https://x.com/markgurman/status/2097687667471466751" target="_blank">Gurman cheekily tweeted</a>, "If you don't see the Apple TV, HomePod mini, home display and touch MacBook today, don't worry. It's only September."</p><p>Several different iterations of this device have been rumored, including one with a <a href="https://www.tomsguide.com/home/smart-home/apples-next-big-thing-could-be-a-dollar1000-home-robot-ipad-combo">$1,000 robot arm</a>. The most common version involves a <a href="https://www.tomsguide.com/home/smart-home/apple-tipped-to-launch-ai-wall-tablet-to-control-your-home-in-march-2025-everything-we-know-so-far">wall-mounted touchpad</a> or a HomePod speaker with a touch display about the size of an iPad mini. </p><p>This device would have a FaceTime camera for video calls and presence sensors to initiate smart home routines. </p><h3 id="homepod-mini-2">HomePod mini 2</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vBASuHrx9nHrVPyhDjThYN" name="apple-homepod-mini-midnight.jpg" alt="Apple HomePod mini in midnight with an iPhone" src="https://cdn.mos.cms.futurecdn.net/vBASuHrx9nHrVPyhDjThYN-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>A  <a href="https://www.tomsguide.com/home/smart-home/new-apple-tv-and-homepod-mini-reportedly-launching-in-2025-with-apple-networking-chip">new HomePod mini</a> might also debut, but it might not be as big of an upgrade as the Hub. Most rumors suggest that it will feature a new chip and audio improvements. It will probably get new colors.</p><p>The HomePod mini 2 has been on our <a href="https://www.tomsguide.com/news/hoping-for-a-homepod-mini-2-to-go-with-the-new-homepod-dont-hold-your-breath">rumor radar since at least 2023</a>. The current version debuted in 2020, and like the next device, is long overdue for an update.</p><h3 id="apple-tv-4k-2026">Apple TV 4K 2026</h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="35tUhk2U4oNYnKewrYtsxJ" name="apple tv vpn.jpg" alt="Apple TV" src="https://cdn.mos.cms.futurecdn.net/35tUhk2U4oNYnKewrYtsxJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Lebedev Yury/Shutterstock)</span></figcaption></figure><p>Like the HomePod series, Apple hasn't released a new version of the <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV 4K</a> since 2022. We're long overdue for an upgrade — even if it's only a more powerful chip for stronger performance. </p><p>Previously, it was suggested that a new Apple TV could feature <a href="https://www.tomsguide.com/entertainment/streaming-devices/new-apple-tv-4k-biggest-upgrades-just-leaked-ahead-of-launch">the A17 Pro chip</a>, but it's more likely it'll get the new A20 or, to save some money, last year's A19. The device should also get the <a href="https://www.tomsguide.com/phones/iphones/new-iphone-18-pro-chips-camera-upgrades-and-more-leaked-by-analyst-heres-what-we-know">rumored N2 chip </a>for better Wi-Fi and Bluetooth connectivity. </p><p>Outside of chips, the big upgrade would be Siri AI, which could let you connect the Apple TV as a hub for smart devices. One rumor suggested that Apple might release a <a href="https://www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmnahttps:/www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmna" target="_blank">set-top box with a camera,</a> which would allow for FaceTime calls and gesture-based controls.</p><p>However, a rumored refresh of the Apple TV has been making the rounds for multiple years now. I won't believe this one until it actually happens.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/interview-apple-ceo-john-ternus-on-his-defining-moment-for-the-iphone-duo"><strong>I interviewed Apple CEO John Ternus on the making of the iPhone Duo — here's what made him say 'yes, that's it'</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/ai/apple-intelligence/people-are-freaking-out-about-the-new-always-listening-apple-watches-heres-what-apple-ceo-john-ternus-told-us"><strong>People are freaking out about the new 'always-listening' Apple Watches — here's what Apple CEO John Ternus told us</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/news/live/apple-event-live-foldable-iphone-iphone-18-pro-max-apple-watch-12-and-all-the-big-news"><strong>Apple Event recap — Hands-on with the iPhone Duo and all the big announcements</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve played for 100 hours on a VR headset lighter than my iPhone — Pimax Dream Air is an expensive breakthrough ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I’ve tried my best to get into PC VR gaming in the past, but my main gripe has always been the size, weight and ease of setup. It just becomes a big old hassle (emphasis on the word “big”), as you can barely wear these monstrosities for longer than an hour without really feeling it on your face and neck.</p><p>It gets doubly problematic when I’m hoping to take part in an endurance sim race, which as you may know, I prefer the VR experience for being able to look into apexes and corner exits more effectively than on a flat screen. It more closely mirrors my real-life racing experience.</p><p>But the pain has been well and truly remedied by the Pimax Dream Air. You may have seen that I got to have my mind blown by this headset <a href="https://www.tomsguide.com/computing/virtual-reality/i-just-tested-an-8k-vr-headset-that-weighs-less-than-my-phone-and-it-could-change-vr-gaming">back at CES</a>. Now, I’ve been using it for the past three months, and can happily say that it is one of the best PC VR headsets I’ve ever used…provided you’ve got the money for it.</p><p>This is a pricey system to get. But if you are properly invested into VR gaming, it’s a no-brainer for its stellar picture quality, versatility and pure comfort even in the most intense of movements.</p><h2 class="article-body__section" id="section-pimax-dream-air-cheat-sheet"><span>Pimax Dream Air: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>This is a premium PC VR headset.</li><li><strong>Who is it for? </strong>It's perfect for sim experience perfectionists and serious VR enthusiasts.</li><li><strong>What does it cost? </strong>Prices for the Dream Air start at $1,999 with Lighthouse tracking. To get this SLAM version, it'll set you back $2,299.</li><li><strong>What's good about it? </strong>That small, lightweight design just can't be beat<strong>  </strong></li><li><strong>What's not so good? </strong>There's no getting around that high price and a couple of odd software quirks</li></ul><h2 class="article-body__section" id="section-pimax-dream-air-specs"><span>Pimax Dream Air: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Resolution</strong></p></td><td  ><p>3840 x 3552 pixels per-eye</p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>90Hz</p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>Field of view (FOV)</strong></p></td><td  ><p>110 degrees</p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>Optics</strong></p></td><td  ><p>Pancake lenses</p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>Tracking options</strong></p></td><td  ><p>Lighthouse or SLAM (integrated cameras)</p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>10.6 ounces</p></td><td  ></td></tr></tbody></table></div><h2 class="article-body__section" id="section-pimax-dream-air-the-ups"><span>Pimax Dream Air: The ups</span></h2><p>It’s a VR headset that was actually comfortable to wear for a 12-hour race. The Dream Air transcends the stereotype of enthusiast VR headsets being humongous and unwieldy to become something that is wearable for long periods of time.</p><h2 id="supreme-pc-vr-ergonomics">Supreme PC VR ergonomics</h2><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="sPefHx39erARnSWo8d7QrM" name="Pimax Dream Air" alt="Pimax Dream Air" src="https://cdn.mos.cms.futurecdn.net/sPefHx39erARnSWo8d7QrM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The visor of the headweight weighs less than 6 ounces, with the total weight fully assembled coming in at 10.6 ounces. Now if you’re aware of the monster enthusiast headsets Pimax has made in the past, you’ll know just how much of a big deal this is — not just to the company but for PC VR gaming as a whole.</p><p>It’s a game-changer for comfort and wearability, all while still giving you the same gorgeous display and optics that you get in the bigger headsets (more on that later). Cramming everything into such a small headset feels like unlocking quicker, more human levels of head turning, and a deeper immersion because of it.</p><p>And that cushioned front gasket is more than comfortable enough to handle even the longest sessions, such as the aforementioned endurance race or another playthrough of Hitman VR and Half-Life: Alyx.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uCEMRkMHJzmpHoqLDaFPBM" name="Pimax Dream Air" alt="Pimax Dream Air" src="https://cdn.mos.cms.futurecdn.net/uCEMRkMHJzmpHoqLDaFPBM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ve seen some of the criticisms — namely about the thinness of the straps and the cabling being fed through the back rather than the side. The first one I can understand, but don’t believe it’s as big of a problem as people say (given the lightweight nature makes it super comfortable). </p><p>But the second one I’d disagree with, as having them feed out the back does ensure a nice even weight distribution across the headset, rather than having your head dragged down a little with it.</p><h2 id="gorgeous-clarity">Gorgeous clarity</h2><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="uKEJUkCd9vQdC3v3K7urTR" name="Pimax Dream Air" alt="Pimax Dream Air" src="https://cdn.mos.cms.futurecdn.net/uKEJUkCd9vQdC3v3K7urTR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>But in my mind, while the size is the most visible win, it’s not the main star of the show. That belongs to those gorgeous Sony Micro-OLED panels pushing an 8K picture at a 90Hz refresh rate with a 110-degree field of view. </p><p>Whether it’s blazing through the streets of Japan in a VR-modded version of Forza Horizon 6 and witnessing the flash flood of color, or stretching the deep contrast ratio of those panels with the darker, scarier parts of Half-Life: Alyx, these displays are incredible.</p><p>Throw in high-quality pancake lenses that ensure no distortion or reflections, alongside the prescription inserts and you’re onto a winner for escaping to faraway places right in your gaming den.</p><h2 id="really-smart-features">Really smart features</h2><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="VEdWgP6RYkw25QkKnefcjL" name="Pimax Dream Air" alt="Pimax Dream Air" src="https://cdn.mos.cms.futurecdn.net/VEdWgP6RYkw25QkKnefcjL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Then there’s the other nice-to-haves that really enrich the experience and make this one of the best ways to play (needed because that price is steep). First is the audio, which these tiny speakers are really impressive with strong bass production and spatial sound adding to the immersion.</p><p>The controllers have a nice ergonomic feel to them and I had no problem with tracking them. And shout-out to the gesture tracking, which may not be the best in gaming, but unlocks a more intuitive user interface experience when I was working or just watching videos.</p><p>And then, there’s full 120Hz eye tracking — following your line of sight 120 times per second. This enables something called dynamic foveated rendering, which cuts the amount your GPU has to work to render a massive virtual space around you by keeping things in your distant peripheral vision at a lower rendered quality.</p><p>In the games that support it, it’s an effect you don’t really see, and it means you can get away with higher resolution settings in these titles too.</p><p>Of course with this vast amount of tech inside, the headset visor itself can get hot, as well as the cable box attached to it. Luckily, these are a decent distance away from your face and with the dual integrated fans for active cooling, I never found myself feeling uncomfortable — neither was there any thermal throttling over the entire race.</p><h2 class="article-body__section" id="section-pimax-dream-air-the-downs"><span>Pimax Dream Air: The downs</span></h2><p>So I hit the checkered flag in my race, played a few more games and started to really think about my experience using it. The rose-tinted spectacles started to come off a little when I remembered two key things.</p><h2 id="janky-software-at-times">Janky software at times</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1400px;"><p class="vanilla-image-block" style="padding-top:57.14%;"><img id="SHzvEKsgnSugPYPmWXhhgG" name="Pimax Dream Air" alt="Pimax Dream Air" src="https://cdn.mos.cms.futurecdn.net/SHzvEKsgnSugPYPmWXhhgG-1920-80.png" mos="" align="middle" fullscreen="" width="1400" height="800" 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>Now don’t get me wrong — the Pimax Play app does the job. The issue is it doesn’t do the job <em>all </em>the time. </p><p>Some of the UI decisions are a bit weird (such as having two different windows for headset settings from two different locations), and when you do alter particular settings (like stopping the PC from defaulting the audio source to the headset rather than speakers), there’s a 50/50 chance that checkbox actually does the job.</p><p>There were some frustrations and moments where I had to close the app through the task manager and reopen it or restart the headset service multiple times. Those kinks are smoothed out eventually, but the persistence requirement of it all did start to bug me.</p><h2 id="very-expensive">Very expensive</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eS6Ux3boKbqjrRRgArLoPM" name="Pimax Dream Air" alt="Pimax Dream Air" src="https://cdn.mos.cms.futurecdn.net/eS6Ux3boKbqjrRRgArLoPM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>And then we get to the big one. The Pimax Dream Air starts at $1,999 for the model with Lighthouse tracking (sensors on poles you set up to track around you), and to get this SLAM model (cameras built into the headset tracking from the inside out) that takes the cost up to $2,299.</p><p>Make no mistake about it, this one is definitely for the serious enthusiasts. The quality of the experience and the build of the headset itself is going to be really enticing to those who chase that next-level of absorption into their sim games or VR titles.</p><p>But if you’re the kind of person who only casually flirts with VR every now and again, the Quest 3 + Link cable is definitely good enough.</p><h2 class="article-body__section" id="section-pimax-dream-air-verdict"><span>Pimax Dream Air: Verdict</span></h2><p>I’ve tested my fair share of big, bulky PC VR headsets, and the Dream Air is the breath of fresh…well, air, needed to make this niche enjoyment of mine make sense. Sim racing is a pure joy on something so lightweight, and when you are up and moving around, those dimensions make gaming so much more accessible.</p><p>Throw in gorgeous display tech and surprisingly strong audio and things are looking good, but do watch out for the janky software and be prepared to pay a pretty price for it.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/virtual-reality/pimax-dream-air-review</link>
                                                                            <description>
                            <![CDATA[ The Pimax Dream Air is easily one of the best PC VR headsets you can buy. It’s certainly expensive at $1,999, but for that, you’re getting an awesomely comfortable, lightweight build with a super crispy and colorful 8K display and a wide field of view. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7Ts7xmREcN9XccbFAp9ogZ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MtjjY5wJFEkLpnbFK4iYGM-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 12 Sep 2026 07:30:00 +0000</pubDate>                                                                                                                                <updated>Sat, 12 Sep 2026 12:21:57 +0000</updated>
                                                                                                                                            <category><![CDATA[Virtual Reality]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[VR & AR]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/MtjjY5wJFEkLpnbFK4iYGM-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Pimax Dream Air]]></media:description>                                                            <media:text><![CDATA[Pimax Dream Air]]></media:text>
                                <media:title type="plain"><![CDATA[Pimax Dream Air]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MtjjY5wJFEkLpnbFK4iYGM-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ve tried my best to get into PC VR gaming in the past, but my main gripe has always been the size, weight and ease of setup. It just becomes a big old hassle (emphasis on the word “big”), as you can barely wear these monstrosities for longer than an hour without really feeling it on your face and neck.</p><p>It gets doubly problematic when I’m hoping to take part in an endurance sim race, which as you may know, I prefer the VR experience for being able to look into apexes and corner exits more effectively than on a flat screen. It more closely mirrors my real-life racing experience.</p><p>But the pain has been well and truly remedied by the Pimax Dream Air. You may have seen that I got to have my mind blown by this headset <a href="https://www.tomsguide.com/computing/virtual-reality/i-just-tested-an-8k-vr-headset-that-weighs-less-than-my-phone-and-it-could-change-vr-gaming">back at CES</a>. Now, I’ve been using it for the past three months, and can happily say that it is one of the best PC VR headsets I’ve ever used…provided you’ve got the money for it.</p><p>This is a pricey system to get. But if you are properly invested into VR gaming, it’s a no-brainer for its stellar picture quality, versatility and pure comfort even in the most intense of movements.</p><h2 class="article-body__section" id="section-pimax-dream-air-cheat-sheet"><span>Pimax Dream Air: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>This is a premium PC VR headset.</li><li><strong>Who is it for? </strong>It's perfect for sim experience perfectionists and serious VR enthusiasts.</li><li><strong>What does it cost? </strong>Prices for the Dream Air start at $1,999 with Lighthouse tracking. To get this SLAM version, it'll set you back $2,299.</li><li><strong>What's good about it? </strong>That small, lightweight design just can't be beat<strong>  </strong></li><li><strong>What's not so good? </strong>There's no getting around that high price and a couple of odd software quirks</li></ul><h2 class="article-body__section" id="section-pimax-dream-air-specs"><span>Pimax Dream Air: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Resolution</strong></p></td><td  ><p>3840 x 3552 pixels per-eye</p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>90Hz</p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>Field of view (FOV)</strong></p></td><td  ><p>110 degrees</p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>Optics</strong></p></td><td  ><p>Pancake lenses</p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>Tracking options</strong></p></td><td  ><p>Lighthouse or SLAM (integrated cameras)</p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>10.6 ounces</p></td><td  ></td></tr></tbody></table></div><h2 class="article-body__section" id="section-pimax-dream-air-the-ups"><span>Pimax Dream Air: The ups</span></h2><p>It’s a VR headset that was actually comfortable to wear for a 12-hour race. The Dream Air transcends the stereotype of enthusiast VR headsets being humongous and unwieldy to become something that is wearable for long periods of time.</p><h2 id="supreme-pc-vr-ergonomics">Supreme PC VR ergonomics</h2><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="sPefHx39erARnSWo8d7QrM" name="Pimax Dream Air" alt="Pimax Dream Air" src="https://cdn.mos.cms.futurecdn.net/sPefHx39erARnSWo8d7QrM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The visor of the headweight weighs less than 6 ounces, with the total weight fully assembled coming in at 10.6 ounces. Now if you’re aware of the monster enthusiast headsets Pimax has made in the past, you’ll know just how much of a big deal this is — not just to the company but for PC VR gaming as a whole.</p><p>It’s a game-changer for comfort and wearability, all while still giving you the same gorgeous display and optics that you get in the bigger headsets (more on that later). Cramming everything into such a small headset feels like unlocking quicker, more human levels of head turning, and a deeper immersion because of it.</p><p>And that cushioned front gasket is more than comfortable enough to handle even the longest sessions, such as the aforementioned endurance race or another playthrough of Hitman VR and Half-Life: Alyx.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uCEMRkMHJzmpHoqLDaFPBM" name="Pimax Dream Air" alt="Pimax Dream Air" src="https://cdn.mos.cms.futurecdn.net/uCEMRkMHJzmpHoqLDaFPBM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ve seen some of the criticisms — namely about the thinness of the straps and the cabling being fed through the back rather than the side. The first one I can understand, but don’t believe it’s as big of a problem as people say (given the lightweight nature makes it super comfortable). </p><p>But the second one I’d disagree with, as having them feed out the back does ensure a nice even weight distribution across the headset, rather than having your head dragged down a little with it.</p><h2 id="gorgeous-clarity">Gorgeous clarity</h2><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="uKEJUkCd9vQdC3v3K7urTR" name="Pimax Dream Air" alt="Pimax Dream Air" src="https://cdn.mos.cms.futurecdn.net/uKEJUkCd9vQdC3v3K7urTR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>But in my mind, while the size is the most visible win, it’s not the main star of the show. That belongs to those gorgeous Sony Micro-OLED panels pushing an 8K picture at a 90Hz refresh rate with a 110-degree field of view. </p><p>Whether it’s blazing through the streets of Japan in a VR-modded version of Forza Horizon 6 and witnessing the flash flood of color, or stretching the deep contrast ratio of those panels with the darker, scarier parts of Half-Life: Alyx, these displays are incredible.</p><p>Throw in high-quality pancake lenses that ensure no distortion or reflections, alongside the prescription inserts and you’re onto a winner for escaping to faraway places right in your gaming den.</p><h2 id="really-smart-features">Really smart features</h2><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="VEdWgP6RYkw25QkKnefcjL" name="Pimax Dream Air" alt="Pimax Dream Air" src="https://cdn.mos.cms.futurecdn.net/VEdWgP6RYkw25QkKnefcjL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Then there’s the other nice-to-haves that really enrich the experience and make this one of the best ways to play (needed because that price is steep). First is the audio, which these tiny speakers are really impressive with strong bass production and spatial sound adding to the immersion.</p><p>The controllers have a nice ergonomic feel to them and I had no problem with tracking them. And shout-out to the gesture tracking, which may not be the best in gaming, but unlocks a more intuitive user interface experience when I was working or just watching videos.</p><p>And then, there’s full 120Hz eye tracking — following your line of sight 120 times per second. This enables something called dynamic foveated rendering, which cuts the amount your GPU has to work to render a massive virtual space around you by keeping things in your distant peripheral vision at a lower rendered quality.</p><p>In the games that support it, it’s an effect you don’t really see, and it means you can get away with higher resolution settings in these titles too.</p><p>Of course with this vast amount of tech inside, the headset visor itself can get hot, as well as the cable box attached to it. Luckily, these are a decent distance away from your face and with the dual integrated fans for active cooling, I never found myself feeling uncomfortable — neither was there any thermal throttling over the entire race.</p><h2 class="article-body__section" id="section-pimax-dream-air-the-downs"><span>Pimax Dream Air: The downs</span></h2><p>So I hit the checkered flag in my race, played a few more games and started to really think about my experience using it. The rose-tinted spectacles started to come off a little when I remembered two key things.</p><h2 id="janky-software-at-times">Janky software at times</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1400px;"><p class="vanilla-image-block" style="padding-top:57.14%;"><img id="SHzvEKsgnSugPYPmWXhhgG" name="Pimax Dream Air" alt="Pimax Dream Air" src="https://cdn.mos.cms.futurecdn.net/SHzvEKsgnSugPYPmWXhhgG-1920-80.png" mos="" align="middle" fullscreen="" width="1400" height="800" 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>Now don’t get me wrong — the Pimax Play app does the job. The issue is it doesn’t do the job <em>all </em>the time. </p><p>Some of the UI decisions are a bit weird (such as having two different windows for headset settings from two different locations), and when you do alter particular settings (like stopping the PC from defaulting the audio source to the headset rather than speakers), there’s a 50/50 chance that checkbox actually does the job.</p><p>There were some frustrations and moments where I had to close the app through the task manager and reopen it or restart the headset service multiple times. Those kinks are smoothed out eventually, but the persistence requirement of it all did start to bug me.</p><h2 id="very-expensive">Very expensive</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eS6Ux3boKbqjrRRgArLoPM" name="Pimax Dream Air" alt="Pimax Dream Air" src="https://cdn.mos.cms.futurecdn.net/eS6Ux3boKbqjrRRgArLoPM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>And then we get to the big one. The Pimax Dream Air starts at $1,999 for the model with Lighthouse tracking (sensors on poles you set up to track around you), and to get this SLAM model (cameras built into the headset tracking from the inside out) that takes the cost up to $2,299.</p><p>Make no mistake about it, this one is definitely for the serious enthusiasts. The quality of the experience and the build of the headset itself is going to be really enticing to those who chase that next-level of absorption into their sim games or VR titles.</p><p>But if you’re the kind of person who only casually flirts with VR every now and again, the Quest 3 + Link cable is definitely good enough.</p><h2 class="article-body__section" id="section-pimax-dream-air-verdict"><span>Pimax Dream Air: Verdict</span></h2><p>I’ve tested my fair share of big, bulky PC VR headsets, and the Dream Air is the breath of fresh…well, air, needed to make this niche enjoyment of mine make sense. Sim racing is a pure joy on something so lightweight, and when you are up and moving around, those dimensions make gaming so much more accessible.</p><p>Throw in gorgeous display tech and surprisingly strong audio and things are looking good, but do watch out for the janky software and be prepared to pay a pretty price for it.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve loved typing on the Tecware Spectre 75 — but it falls flat in the face of fierce competition ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I’ve tested nearly 100 keyboards, at the time of writing, and the Tecware Spectre 75 is one I’ve boxed back up the quickest. The keyboard costs just $79, and offers a great typing experience. It’s great for hardcore typists who want nothing but responsive switches for a day’s worth of work — but its issues are too hard to ignore.</p><p>The Spectre 75 features a built-in LCD screen you can display GIFs on, but frustratingly, its companion software (needed for customizing the screen) is finicky to use. The build and design are nothing to write home about, neither is its limited stock switch choice. But my biggest issue with the Spectre 75 is how it becomes unresponsive after being in sleep mode.</p><p>To find out why it <em>isn’t </em>one of the <a href="https://www.tomsguide.com/best-picks/best-mechanical-keyboards">best mechanical keyboards</a>, read my full Tecware Spectre 75 review.</p><h2 class="article-body__section" id="section-tecware-spectre-75-review-specs"><span>Tecware Spectre 75 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/TECWARE-Mechanical-Customizable-Multi-Function-Hot-Swappable/dp/B0DGY4QWZY/" target="_blank" rel="nofollow">$79</a></p></td></tr><tr><td class="firstcol " ><p><strong>Switches</strong></p></td><td  ><p>Tecware Cocoa Brown (tactile) or Candy Red (linear) mechanical</p></td></tr><tr><td class="firstcol " ><p><strong>Keycaps</strong></p></td><td  ><p>Double-shot PBT</p></td></tr><tr><td class="firstcol " ><p><strong>Construction</strong></p></td><td  ><p>ABS plastic</p></td></tr><tr><td class="firstcol " ><p><strong>Mount</strong></p></td><td  ><p>Gasket</p></td></tr><tr><td class="firstcol " ><p><strong>Layout</strong></p></td><td  ><p>75%, 81 keys</p></td></tr><tr><td class="firstcol " ><p><strong>Operating system</strong></p></td><td  ><p>macOS, Windows</p></td></tr><tr><td class="firstcol " ><p><strong>Backlighting</strong></p></td><td  ><p>Per-key RGB</p></td></tr><tr><td class="firstcol " ><p><strong>Polling rate</strong></p></td><td  ><p>1,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>3</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth, 2.4GHz dongle, wired</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>4,000mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Measurements</strong></p></td><td  ><p>12.99 x 5.71 x 1.50 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.87lbs</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black, White</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-tecware-spectre-75-review-cheat-sheet"><span>Tecware Spectre 75 review: Cheat sheet</span></h2><ul><li><strong>What is it?</strong> A 75% layout, hot-swappable mechanical keyboard with either tactile or linear switches</li><li><strong>Who is it for? </strong>For hardcore typists and casual gamers</li><li><strong>How much does it cost? </strong>The Tecware Spectre 75 costs just <a href="https://www.amazon.com/TECWARE-Mechanical-Customizable-Multi-Function-Hot-Swappable/dp/B0DGY4QWZY/" target="_blank" rel="nofollow">$79</a></li><li><strong>What do we like?</strong> The typing experience, LCD screen to display GIFs on, and 1KHz polling for gaming</li><li><strong>What don’t we like?</strong> The plasticky build, the lackluster design, janky companion software, and limited stock switch choice</li></ul><h2 class="article-body__section" id="section-tecware-spectre-75-review-the-ups"><span>Tecware Spectre 75 review: The ups</span></h2><p>The Tecware Spectre 75 is lovely to type on, it sounds good, and it features a built-in LCD screen you can display GIFs on. It’s a decent keyboard for gaming, too, thanks to 1KHz polling.</p><h2 id="lovely-to-type-on">Lovely to type on</h2><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="SuJZUSvgXbVpju7N3tqxw7" name="Tecware_Spectre75_Keyboard_002.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/SuJZUSvgXbVpju7N3tqxw7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Tecware Spectre 75 is a fantastic keyboard to type on, so it’s great for hardcore typists (like myself). The keyboard comes fitted with pre-lubed Cocoa Brown (tactile) or Candy Red (linear) mechanical switches. I tested the Candy Reds which require 45g of force to activate. They’re slightly heavier than the 35g Sea Salt linears in the <a href="https://www.tomsguide.com/computing/peripherals/epomaker-rt100-review">Epomaker RT100</a> ($115) but even so, I’ve found the Candy Reds non-fatiguing to type on. I wrote this review <em>and </em>another on the Spectre 75!</p><p>The Candy Reds feel smooth and responsive to type on. Combined with the double-shot PBT keycaps, the gasket mount, and several layers of foam padding, the Spectre 75 sounds lovely, too. It’s got a deep, creamy sound which isn’t too loud that it disturbs your coworkers, but it isn’t too quiet either, so you can appreciate it.</p><p>Speaking of, the double-shot PBT keycaps feel soft to touch. By their nature, the PBT keycaps are more resistant to oil and wear and tear than their ABS counterparts. They don’t get shiny like the ones on the expensive <a href="https://www.tomsguide.com/computing/keyboards/turtle-beach-command-series-kb5-review">Turtle Beach Command Series KB5</a> ($149) either.</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Keyboard</strong></p></th><th  ><p><strong>Type test speed (WPM)</strong></p></th><th  ><p><strong>Type test accuracy</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p>Tecware Spectre 75</p></td><td  ><p>93</p></td><td  ><p>90%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/keyboards/turtle-beach-command-series-kb5-review">Turtle Beach Command Series KB5</a></p></td><td  ><p>108</p></td><td  ><p>97%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/keyboards/mchose-k99-v2-review">MCHOSE K99 V2</a></p></td><td  ><p>98</p></td><td  ><p>91%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/peripherals/mchose-x75-v2-keyboard-review">MCHOSE X75 V2</a></p></td><td  ><p>94</p></td><td  ><p>95.37%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/peripherals/epomaker-rt100-review">Epomaker RT100 Pro</a></p></td><td  ><p>96</p></td><td  ><p>94.1%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/keyboards/iqunix-mq80-review">IQUNIX MQ80</a></p></td><td  ><p>95</p></td><td  ><p>92.8%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-review">Epomaker Glyph</a></p></td><td  ><p>109</p></td><td  ><p>93.2%</p></td></tr><tr><td class="firstcol " ><p>Nikita’s rolling averages (all keyboards)</p></td><td  ><p>92.84</p></td><td  ><p>91.24%</p></td></tr></tbody></table></div><p>As soon as I unboxed the Spectre 75, I took a typing test at <a href="http://10fastfingers.com" target="_blank">10fastfingers.com</a> (as I always do). Straight out of the box, I was able to achieve 93 words per minute with 90% accuracy. Though a little slower than what I’m used to, like 109WPM on the <a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-review">Epomaker Glyph</a> ($139), I’m happy anytime I get over 90WPM, so I’m pleased with the Spectre 75’s performance.</p><h2 id="good-gaming-performance">Good gaming performance</h2><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="H5wq4jPf62QhSNGkdvEtw7" name="Tecware_Spectre75_Keyboard_008.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/H5wq4jPf62QhSNGkdvEtw7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Tecware Spectre 75 is a competent gaming keyboard, packing a 1,000Hz polling rate over a wired connection. Over Bluetooth, this naturally drops to just 125Hz. 1KHz polling is more than plenty for 99% of gamers. I played Counter-Strike 2 and <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a> on the <a href="https://www.tomsguide.com/computing/gaming-laptops/alienware-16x-aurora-review">Alienware 16X Aurora</a>, and I didn’t notice any latency issues or input lag.</p><p>Linear switches are usually great for gaming, and the same is true for the Spectre 75’s Candy Reds. I found them extremely responsive in my testing. Tecware doesn’t specify the switches’ pre-travel distance, or how far down the switches need to be pressed to activate them. Even so, I felt they only required light taps to activate.</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="QVDvJgrDvwRv7iFuAWo4j7" name="Tecware_Spectre75_Keyboard_007.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/QVDvJgrDvwRv7iFuAWo4j7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You also get N-key rollover which ensures consistent and accurate key registration when you’re typing and playing. You can basically hold down several keys at once and all of them will be registered by the keyboard’s hardware and executed on screen. In Cyberpunk 2077, I was able to sprint, jump, reload my weapon and activate my Sandevistan cyberware to slow down time, all at once. This gave me a slight competitive advantage and I was able to run circles around enemies.</p><p>For competitive gamers or esports players, I’d recommend a Hall Effect keyboard with adjustable actuation and 8,000Hz polling, like the <a href="https://www.tomsguide.com/computing/peripherals/epomaker-he68-hall-effect-keyboard-review">Epomaker HE68</a> ($59) or the <a href="https://www.tomsguide.com/computing/peripherals/epomaker-he65-mag-review">Epomaker HE65 Mag</a> ($99). If you’re a casual gamer, though, the Spectre 75 should more than suffice.</p><h2 id="customizable-lcd-screen">Customizable LCD screen</h2><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="G3Vy5jG3agzGy5ofvxPnQ7" name="Tecware_Spectre75_Keyboard_006.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/G3Vy5jG3agzGy5ofvxPnQ7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If I had a nickel for every keyboard I’ve tested that features a built-in LCD screen, I’d have <em>many. </em>Similar to the likes of the Turtle Beach Command Series KB5, the <a href="https://www.tomsguide.com/computing/keyboards/epomaker-rt100-pro-review">Epomaker RT100 Pro</a> ($119) and the <a href="https://www.tomsguide.com/computing/keyboards/corsair-vanguard-air-99-wireless-review">Corsair Vanguard Air 99 Wireless</a> ($259), the Tecware Spectre 75 features a customizable LCD screen.</p><p>Located between the volume knob and Function row, the screen is tiny but bright. By default, it displays a pre-installed GIF, and the knob lets you adjust the volume. If you hold down Fn and the knob, you can enter LCD Menu Navigation mode. Twisting the knob thereafter lets you cycle through the keyboard’s various settings. You can use the screen (and the knob) to adjust the RGB lighting’s effects, speed and brightness, and swap between macOS and Windows layouts.</p><p>I found the screen responsive in my testing — it's the Spectre 75’s companion software (that’s needed to upload GIFs) that I have a problem with. More on that later, though.</p><h2 id="low-price">Low price</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WALhtUQFzxoYNmDXPyyXY7" name="Tecware_Spectre75_Keyboard_009.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/WALhtUQFzxoYNmDXPyyXY7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of the best things about the Tecware Spectre 75 is that it doesn’t cost an arm and a leg. It retails for just <a href="https://www.amazon.com/TECWARE-Mechanical-Customizable-Multi-Function-Hot-Swappable/dp/B0DGY4QWZY/" target="_blank" rel="nofollow">$79 at Amazon U.S.</a> which makes it one of the cheapest keyboards I’ve tested so far. It’s cheaper than some of our favorite budget mech decks, like the <a href="https://www.tomsguide.com/computing/keyboards/nuphy-node75-review">NuPhy Node75</a> ($99) and the <a href="https://www.tomsguide.com/computing/keyboards/keychron-v1-ultra-8k-review">Keychron V1 Ultra 8K</a> ($114). It’s priced similarly to the <a href="https://www.tomsguide.com/computing/keyboards/royal-kludge-l75-review">Royal Kludge L75</a> ($79) and the <a href="https://www.tomsguide.com/computing/keyboards/keychron-v1-8k-review">Keychron V1 8K</a> ($74) — though the latter is wired-only.</p><h2 class="article-body__section" id="section-tecware-spectre-75-review-the-downs"><span>Tecware Spectre 75 review: The downs</span></h2><p>The Tecware Spectre 75 isn’t perfect. Its lackluster design, plasticky build, janky companion software, and limited stock switch choice leave a lot to be desired.</p><h2 id="lackluster-design">Lackluster design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jJxZn6see5rSbBkYD2ybu7" name="Tecware_Spectre75_Keyboard_010.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/jJxZn6see5rSbBkYD2ybu7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’ll preface this by saying that there’s nothing wrong with the Tecware Spectre 75’s design — it’s just very dull and very boring to look at. There’s nothing special about the design. The Spectre 75 comes in either black or white, and they’re… fine? This is a decent-looking keyboard for anyone who prefers something low-key. There’s flashy per-key RGB lighting that adds a splash of color, though.</p><p>If you want a keyboard that pops, or utilizes a combination of different colors at the least, I’d recommend the Royal Kludge L75, the <a href="https://www.tomsguide.com/computing/peripherals/gravastar-mercury-k1-lite-review">GravaStar Mercury K1 Lite</a> ($89) or the <a href="https://www.tomsguide.com/computing/keyboards/mchose-k99-v2-review">MCHOSE K99 V2</a> ($99). Of those, the Mercury K1 Lite is the polar opposite of the Spectre 75, with a garish, loud design. I’d stick to the Royal Kludge L75 if I were you.</p><h2 id="plasticky-build">Plasticky build</h2><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="NZLSDFfXjWCEaiF9YrUzw7" name="Tecware_Spectre75_Keyboard_003.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/NZLSDFfXjWCEaiF9YrUzw7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Tecware Spectre 75 isn’t the best built keyboard out there. Its body is made entirely of plastic which feels a little <em>too </em>cheap for my liking. It looks like a reskinned <a href="https://www.tomsguide.com/computing/peripherals/keychron-v1-review">Keychron V1</a> ($94) but without the steel plate. The plastic case feels slightly flimsy, and there’s some flex when you twist the Spectre 75 by its sides. It does feature a metallic knob in the top-right corner which feels premium, though.</p><p>Its all-plastic build makes the keyboard fairly light, though, so it’s good to travel with. The Spectre 75 weighs 1.87lbs so it’s lighter than the Keychron V1 8K (2.19lbs). But if you want an even lighter keyboard that also feels premium, I’d recommend the NuPhy Node75 (1.45lbs).</p><h2 id="janky-companion-software">Janky companion software</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/g5Y8iboYraqfreASfZa7Pj-1920-80.jpg" alt="Tecware Spectre 75 companion software screenshot" /><figcaption><small role="credit">Tecware</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/RQ7VBxgnBQ9Pah9LFGEyJj-1920-80.jpg" alt="Tecware Spectre 75 companion software screenshot" /><figcaption><small role="credit">Tecware</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/gsttqmD2q368XMvXnQbQfj-1920-80.jpg" alt="Tecware Spectre 75 companion software screenshot" /><figcaption><small role="credit">Tecware</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/WGrAJxKtHr2CBHe38RiWCj-1920-80.jpg" alt="Tecware Spectre 75 companion software screenshot" /><figcaption><small role="credit">Tecware</small></figcaption></figure></figure><p>I’m no stranger to janky companion software, having tested many gadgets with finicky apps, but <em>great snakes </em>is the Tecware Spectre 75’s app infuriating. You’ll need to download the <a href="https://www.tecware.co/software" target="_blank" rel="nofollow">Spectre 75’s dedicated software</a> from the Tecware website, and it’s not available on macOS, even though the keyboard itself is compatible with Apple’s laptops. If you own a MacBook, you won’t be able to customize the LCD screen or upload GIFs to it — it’s worth considering a keyboard like the <a href="https://www.tomsguide.com/computing/keyboards/epomaker-rt100-pro-review">Epomaker RT75</a> ($91) instead.</p><p>Speaking of GIFs, uploading one to the Spectre 75 feels like an uphill climb, or like Sisyphus pushing a heavy boulder up said hill, only to watch it roll back down. The process seems simple enough at first. Navigate to the GIF tab, click on the + icon, and add your preferred GIF. When I did so, the software told me that the GIF had 61 frames and only 44 were allowed. You can delete specific frames within the software itself, but you can’t do so in bulk. You have to delete each frame individually — and this includes confirming <em>every time </em>that you’re certain you want to delete said frame.</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:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tbriHkw2sqUbFGkCwBfYWm" name="Tecware_Spectre_75" alt="Tecware Spectre 75 keyboard's screen" src="https://cdn.mos.cms.futurecdn.net/tbriHkw2sqUbFGkCwBfYWm-1920-80.jpg" mos="" align="middle" fullscreen="1" width="2048" height="1152" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/tbriHkw2sqUbFGkCwBfYWm-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></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 took some time, but I managed to trim the frames down to 44. I clicked ‘Upload to Keyboard’ and watched the progress bar fill up… and then the software crashed. I booted up the software again and repeated the process, only this time the software didn’t say that the frames were limited to 44 — strange, but at least it saves me a gazillion steps. Again, I clicked ‘Upload to Keyboard’ and this time, it worked (thankfully).</p><p>But that isn’t where my troubles stopped. I wanted to test the software’s macro recording feature but for some reason, none of the options in the macro tab were clickable. I reinstalled the software and the issue persisted. I even checked if the Spectre 75 had the latest firmware installed (it did).</p><p>The Spectre 75’s LCD screen is capable of displaying CPU and GPU stats, too, but the software needs to be running in the background — again, impossible to do on macOS. Overall, the software left a sour taste in my mouth, and it sticks out like a sore thumb.</p><h2 id="limited-stock-switch-choice">Limited stock switch choice</h2><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="tSoN6eKP7rSzQd8sqqY5v6" name="Tecware_Spectre75_Keyboard_012.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/tSoN6eKP7rSzQd8sqqY5v6-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Tecware Spectre 75 comes with pre-lubed switches that are made in-house. Unfortunately, you’re limited to just two stock switch sets. You can choose either Cocoa Brown tactile or Candy Red linear switches. There are no clicky or silent switches, and you’ll have to buy your preferred ones separately.</p><p>Thankfully, the Spectre 75 is hot-swappable and compatible with south-facing 5-pin mechanical switches. It’s nice to see a budget keyboard offering hot-swappability when some pricey keyboards don’t (looking at you, Turtle Beach Command Series KB5). If you want more stock switch choice at checkout, I’d recommend the Keychron V1 8K.</p><h2 id="not-the-most-responsive-when-waking">Not the most responsive when waking</h2><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="bnVYxtLuhSJSPAodxiFxK7" name="Tecware_Spectre75_Keyboard_013.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/bnVYxtLuhSJSPAodxiFxK7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The last nail in the Tecware Spectre 75’s coffin is its tendency to not respond when it’s waking from sleep mode. In my testing, over Bluetooth and a wired connection, the keyboard wouldn’t respond after my laptop — and therefore, the Spectre 75 — had been asleep for a while. Though it didn’t happen <em>all </em>the time, I had to reconnect the keyboard a few times to get it working again. I tested this on macOS and Windows machines and had the same issue each time.</p><p>I haven’t had this issue with other mechanical keyboards I’ve tested. For that reason, and everything else I’ve mentioned up until now, I’d recommend the Keychron V1 8K or the Royal Kludge L75. I’ve tested both keyboards extensively and neither of them have given me this much grief.</p><p>I've reached out to Tecware's representative about this issue, to see whether it's limited to my review unit alone.</p><h2 class="article-body__section" id="section-tecware-spectre-75-review-verdict"><span>Tecware Spectre 75 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hkNmhewXwLrRkkaVw6iww7" name="Tecware_Spectre75_Keyboard_005.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/hkNmhewXwLrRkkaVw6iww7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Tecware Spectre 75 is a decent mechanical keyboard for typing and casual gaming, thanks to its responsive linear switches and 1,000Hz polling rate. It features an LCD screen that you can view keyboard and system stats on, or display GIFs on, too.</p><p>But there isn’t much else to like about the Spectre 75. The companion software needed to customize the screen is janky and frustrating to use, while the keyboard itself sports a lackluster design and plasticky build. You’re limited to just two stock switch sets, too. I also struggled with the keyboard becoming unresponsive in my testing.</p><p>While $79 isn’t a high asking price, you can get better value for your money elsewhere. The Keychron V1 8K and the Royal Kludge L75 are fantastic keyboards under $80, and are much better choices if you want a feature-packed deck.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/keyboards/tecware-spectre-75-review</link>
                                                                            <description>
                            <![CDATA[ The Tecware Spectre 75 is a decent keyboard for typing, but issues like janky software, a plasticky build, and unresponsiveness when waking are hard to ignore. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">WDnW4xchRmVYnTZ3JMVESj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/SuJZUSvgXbVpju7N3tqxw7-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 11 Sep 2026 12:16:14 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Keyboards]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></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-320-70.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.&lt;/p&gt;&lt;p&gt;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/SuJZUSvgXbVpju7N3tqxw7-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A black Tecware Spectre 75 mechanical keyboard]]></media:description>                                                            <media:text><![CDATA[A black Tecware Spectre 75 mechanical keyboard]]></media:text>
                                <media:title type="plain"><![CDATA[A black Tecware Spectre 75 mechanical keyboard]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/SuJZUSvgXbVpju7N3tqxw7-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ve tested nearly 100 keyboards, at the time of writing, and the Tecware Spectre 75 is one I’ve boxed back up the quickest. The keyboard costs just $79, and offers a great typing experience. It’s great for hardcore typists who want nothing but responsive switches for a day’s worth of work — but its issues are too hard to ignore.</p><p>The Spectre 75 features a built-in LCD screen you can display GIFs on, but frustratingly, its companion software (needed for customizing the screen) is finicky to use. The build and design are nothing to write home about, neither is its limited stock switch choice. But my biggest issue with the Spectre 75 is how it becomes unresponsive after being in sleep mode.</p><p>To find out why it <em>isn’t </em>one of the <a href="https://www.tomsguide.com/best-picks/best-mechanical-keyboards">best mechanical keyboards</a>, read my full Tecware Spectre 75 review.</p><h2 class="article-body__section" id="section-tecware-spectre-75-review-specs"><span>Tecware Spectre 75 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/TECWARE-Mechanical-Customizable-Multi-Function-Hot-Swappable/dp/B0DGY4QWZY/" target="_blank" rel="nofollow">$79</a></p></td></tr><tr><td class="firstcol " ><p><strong>Switches</strong></p></td><td  ><p>Tecware Cocoa Brown (tactile) or Candy Red (linear) mechanical</p></td></tr><tr><td class="firstcol " ><p><strong>Keycaps</strong></p></td><td  ><p>Double-shot PBT</p></td></tr><tr><td class="firstcol " ><p><strong>Construction</strong></p></td><td  ><p>ABS plastic</p></td></tr><tr><td class="firstcol " ><p><strong>Mount</strong></p></td><td  ><p>Gasket</p></td></tr><tr><td class="firstcol " ><p><strong>Layout</strong></p></td><td  ><p>75%, 81 keys</p></td></tr><tr><td class="firstcol " ><p><strong>Operating system</strong></p></td><td  ><p>macOS, Windows</p></td></tr><tr><td class="firstcol " ><p><strong>Backlighting</strong></p></td><td  ><p>Per-key RGB</p></td></tr><tr><td class="firstcol " ><p><strong>Polling rate</strong></p></td><td  ><p>1,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>3</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth, 2.4GHz dongle, wired</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>4,000mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Measurements</strong></p></td><td  ><p>12.99 x 5.71 x 1.50 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.87lbs</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black, White</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-tecware-spectre-75-review-cheat-sheet"><span>Tecware Spectre 75 review: Cheat sheet</span></h2><ul><li><strong>What is it?</strong> A 75% layout, hot-swappable mechanical keyboard with either tactile or linear switches</li><li><strong>Who is it for? </strong>For hardcore typists and casual gamers</li><li><strong>How much does it cost? </strong>The Tecware Spectre 75 costs just <a href="https://www.amazon.com/TECWARE-Mechanical-Customizable-Multi-Function-Hot-Swappable/dp/B0DGY4QWZY/" target="_blank" rel="nofollow">$79</a></li><li><strong>What do we like?</strong> The typing experience, LCD screen to display GIFs on, and 1KHz polling for gaming</li><li><strong>What don’t we like?</strong> The plasticky build, the lackluster design, janky companion software, and limited stock switch choice</li></ul><h2 class="article-body__section" id="section-tecware-spectre-75-review-the-ups"><span>Tecware Spectre 75 review: The ups</span></h2><p>The Tecware Spectre 75 is lovely to type on, it sounds good, and it features a built-in LCD screen you can display GIFs on. It’s a decent keyboard for gaming, too, thanks to 1KHz polling.</p><h2 id="lovely-to-type-on">Lovely to type on</h2><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="SuJZUSvgXbVpju7N3tqxw7" name="Tecware_Spectre75_Keyboard_002.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/SuJZUSvgXbVpju7N3tqxw7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Tecware Spectre 75 is a fantastic keyboard to type on, so it’s great for hardcore typists (like myself). The keyboard comes fitted with pre-lubed Cocoa Brown (tactile) or Candy Red (linear) mechanical switches. I tested the Candy Reds which require 45g of force to activate. They’re slightly heavier than the 35g Sea Salt linears in the <a href="https://www.tomsguide.com/computing/peripherals/epomaker-rt100-review">Epomaker RT100</a> ($115) but even so, I’ve found the Candy Reds non-fatiguing to type on. I wrote this review <em>and </em>another on the Spectre 75!</p><p>The Candy Reds feel smooth and responsive to type on. Combined with the double-shot PBT keycaps, the gasket mount, and several layers of foam padding, the Spectre 75 sounds lovely, too. It’s got a deep, creamy sound which isn’t too loud that it disturbs your coworkers, but it isn’t too quiet either, so you can appreciate it.</p><p>Speaking of, the double-shot PBT keycaps feel soft to touch. By their nature, the PBT keycaps are more resistant to oil and wear and tear than their ABS counterparts. They don’t get shiny like the ones on the expensive <a href="https://www.tomsguide.com/computing/keyboards/turtle-beach-command-series-kb5-review">Turtle Beach Command Series KB5</a> ($149) either.</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Keyboard</strong></p></th><th  ><p><strong>Type test speed (WPM)</strong></p></th><th  ><p><strong>Type test accuracy</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p>Tecware Spectre 75</p></td><td  ><p>93</p></td><td  ><p>90%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/keyboards/turtle-beach-command-series-kb5-review">Turtle Beach Command Series KB5</a></p></td><td  ><p>108</p></td><td  ><p>97%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/keyboards/mchose-k99-v2-review">MCHOSE K99 V2</a></p></td><td  ><p>98</p></td><td  ><p>91%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/peripherals/mchose-x75-v2-keyboard-review">MCHOSE X75 V2</a></p></td><td  ><p>94</p></td><td  ><p>95.37%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/peripherals/epomaker-rt100-review">Epomaker RT100 Pro</a></p></td><td  ><p>96</p></td><td  ><p>94.1%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/keyboards/iqunix-mq80-review">IQUNIX MQ80</a></p></td><td  ><p>95</p></td><td  ><p>92.8%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-review">Epomaker Glyph</a></p></td><td  ><p>109</p></td><td  ><p>93.2%</p></td></tr><tr><td class="firstcol " ><p>Nikita’s rolling averages (all keyboards)</p></td><td  ><p>92.84</p></td><td  ><p>91.24%</p></td></tr></tbody></table></div><p>As soon as I unboxed the Spectre 75, I took a typing test at <a href="http://10fastfingers.com" target="_blank">10fastfingers.com</a> (as I always do). Straight out of the box, I was able to achieve 93 words per minute with 90% accuracy. Though a little slower than what I’m used to, like 109WPM on the <a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-review">Epomaker Glyph</a> ($139), I’m happy anytime I get over 90WPM, so I’m pleased with the Spectre 75’s performance.</p><h2 id="good-gaming-performance">Good gaming performance</h2><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="H5wq4jPf62QhSNGkdvEtw7" name="Tecware_Spectre75_Keyboard_008.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/H5wq4jPf62QhSNGkdvEtw7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Tecware Spectre 75 is a competent gaming keyboard, packing a 1,000Hz polling rate over a wired connection. Over Bluetooth, this naturally drops to just 125Hz. 1KHz polling is more than plenty for 99% of gamers. I played Counter-Strike 2 and <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a> on the <a href="https://www.tomsguide.com/computing/gaming-laptops/alienware-16x-aurora-review">Alienware 16X Aurora</a>, and I didn’t notice any latency issues or input lag.</p><p>Linear switches are usually great for gaming, and the same is true for the Spectre 75’s Candy Reds. I found them extremely responsive in my testing. Tecware doesn’t specify the switches’ pre-travel distance, or how far down the switches need to be pressed to activate them. Even so, I felt they only required light taps to activate.</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="QVDvJgrDvwRv7iFuAWo4j7" name="Tecware_Spectre75_Keyboard_007.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/QVDvJgrDvwRv7iFuAWo4j7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You also get N-key rollover which ensures consistent and accurate key registration when you’re typing and playing. You can basically hold down several keys at once and all of them will be registered by the keyboard’s hardware and executed on screen. In Cyberpunk 2077, I was able to sprint, jump, reload my weapon and activate my Sandevistan cyberware to slow down time, all at once. This gave me a slight competitive advantage and I was able to run circles around enemies.</p><p>For competitive gamers or esports players, I’d recommend a Hall Effect keyboard with adjustable actuation and 8,000Hz polling, like the <a href="https://www.tomsguide.com/computing/peripherals/epomaker-he68-hall-effect-keyboard-review">Epomaker HE68</a> ($59) or the <a href="https://www.tomsguide.com/computing/peripherals/epomaker-he65-mag-review">Epomaker HE65 Mag</a> ($99). If you’re a casual gamer, though, the Spectre 75 should more than suffice.</p><h2 id="customizable-lcd-screen">Customizable LCD screen</h2><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="G3Vy5jG3agzGy5ofvxPnQ7" name="Tecware_Spectre75_Keyboard_006.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/G3Vy5jG3agzGy5ofvxPnQ7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If I had a nickel for every keyboard I’ve tested that features a built-in LCD screen, I’d have <em>many. </em>Similar to the likes of the Turtle Beach Command Series KB5, the <a href="https://www.tomsguide.com/computing/keyboards/epomaker-rt100-pro-review">Epomaker RT100 Pro</a> ($119) and the <a href="https://www.tomsguide.com/computing/keyboards/corsair-vanguard-air-99-wireless-review">Corsair Vanguard Air 99 Wireless</a> ($259), the Tecware Spectre 75 features a customizable LCD screen.</p><p>Located between the volume knob and Function row, the screen is tiny but bright. By default, it displays a pre-installed GIF, and the knob lets you adjust the volume. If you hold down Fn and the knob, you can enter LCD Menu Navigation mode. Twisting the knob thereafter lets you cycle through the keyboard’s various settings. You can use the screen (and the knob) to adjust the RGB lighting’s effects, speed and brightness, and swap between macOS and Windows layouts.</p><p>I found the screen responsive in my testing — it's the Spectre 75’s companion software (that’s needed to upload GIFs) that I have a problem with. More on that later, though.</p><h2 id="low-price">Low price</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WALhtUQFzxoYNmDXPyyXY7" name="Tecware_Spectre75_Keyboard_009.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/WALhtUQFzxoYNmDXPyyXY7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of the best things about the Tecware Spectre 75 is that it doesn’t cost an arm and a leg. It retails for just <a href="https://www.amazon.com/TECWARE-Mechanical-Customizable-Multi-Function-Hot-Swappable/dp/B0DGY4QWZY/" target="_blank" rel="nofollow">$79 at Amazon U.S.</a> which makes it one of the cheapest keyboards I’ve tested so far. It’s cheaper than some of our favorite budget mech decks, like the <a href="https://www.tomsguide.com/computing/keyboards/nuphy-node75-review">NuPhy Node75</a> ($99) and the <a href="https://www.tomsguide.com/computing/keyboards/keychron-v1-ultra-8k-review">Keychron V1 Ultra 8K</a> ($114). It’s priced similarly to the <a href="https://www.tomsguide.com/computing/keyboards/royal-kludge-l75-review">Royal Kludge L75</a> ($79) and the <a href="https://www.tomsguide.com/computing/keyboards/keychron-v1-8k-review">Keychron V1 8K</a> ($74) — though the latter is wired-only.</p><h2 class="article-body__section" id="section-tecware-spectre-75-review-the-downs"><span>Tecware Spectre 75 review: The downs</span></h2><p>The Tecware Spectre 75 isn’t perfect. Its lackluster design, plasticky build, janky companion software, and limited stock switch choice leave a lot to be desired.</p><h2 id="lackluster-design">Lackluster design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jJxZn6see5rSbBkYD2ybu7" name="Tecware_Spectre75_Keyboard_010.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/jJxZn6see5rSbBkYD2ybu7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’ll preface this by saying that there’s nothing wrong with the Tecware Spectre 75’s design — it’s just very dull and very boring to look at. There’s nothing special about the design. The Spectre 75 comes in either black or white, and they’re… fine? This is a decent-looking keyboard for anyone who prefers something low-key. There’s flashy per-key RGB lighting that adds a splash of color, though.</p><p>If you want a keyboard that pops, or utilizes a combination of different colors at the least, I’d recommend the Royal Kludge L75, the <a href="https://www.tomsguide.com/computing/peripherals/gravastar-mercury-k1-lite-review">GravaStar Mercury K1 Lite</a> ($89) or the <a href="https://www.tomsguide.com/computing/keyboards/mchose-k99-v2-review">MCHOSE K99 V2</a> ($99). Of those, the Mercury K1 Lite is the polar opposite of the Spectre 75, with a garish, loud design. I’d stick to the Royal Kludge L75 if I were you.</p><h2 id="plasticky-build">Plasticky build</h2><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="NZLSDFfXjWCEaiF9YrUzw7" name="Tecware_Spectre75_Keyboard_003.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/NZLSDFfXjWCEaiF9YrUzw7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Tecware Spectre 75 isn’t the best built keyboard out there. Its body is made entirely of plastic which feels a little <em>too </em>cheap for my liking. It looks like a reskinned <a href="https://www.tomsguide.com/computing/peripherals/keychron-v1-review">Keychron V1</a> ($94) but without the steel plate. The plastic case feels slightly flimsy, and there’s some flex when you twist the Spectre 75 by its sides. It does feature a metallic knob in the top-right corner which feels premium, though.</p><p>Its all-plastic build makes the keyboard fairly light, though, so it’s good to travel with. The Spectre 75 weighs 1.87lbs so it’s lighter than the Keychron V1 8K (2.19lbs). But if you want an even lighter keyboard that also feels premium, I’d recommend the NuPhy Node75 (1.45lbs).</p><h2 id="janky-companion-software">Janky companion software</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/g5Y8iboYraqfreASfZa7Pj-1920-80.jpg" alt="Tecware Spectre 75 companion software screenshot" /><figcaption><small role="credit">Tecware</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/RQ7VBxgnBQ9Pah9LFGEyJj-1920-80.jpg" alt="Tecware Spectre 75 companion software screenshot" /><figcaption><small role="credit">Tecware</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/gsttqmD2q368XMvXnQbQfj-1920-80.jpg" alt="Tecware Spectre 75 companion software screenshot" /><figcaption><small role="credit">Tecware</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/WGrAJxKtHr2CBHe38RiWCj-1920-80.jpg" alt="Tecware Spectre 75 companion software screenshot" /><figcaption><small role="credit">Tecware</small></figcaption></figure></figure><p>I’m no stranger to janky companion software, having tested many gadgets with finicky apps, but <em>great snakes </em>is the Tecware Spectre 75’s app infuriating. You’ll need to download the <a href="https://www.tecware.co/software" target="_blank" rel="nofollow">Spectre 75’s dedicated software</a> from the Tecware website, and it’s not available on macOS, even though the keyboard itself is compatible with Apple’s laptops. If you own a MacBook, you won’t be able to customize the LCD screen or upload GIFs to it — it’s worth considering a keyboard like the <a href="https://www.tomsguide.com/computing/keyboards/epomaker-rt100-pro-review">Epomaker RT75</a> ($91) instead.</p><p>Speaking of GIFs, uploading one to the Spectre 75 feels like an uphill climb, or like Sisyphus pushing a heavy boulder up said hill, only to watch it roll back down. The process seems simple enough at first. Navigate to the GIF tab, click on the + icon, and add your preferred GIF. When I did so, the software told me that the GIF had 61 frames and only 44 were allowed. You can delete specific frames within the software itself, but you can’t do so in bulk. You have to delete each frame individually — and this includes confirming <em>every time </em>that you’re certain you want to delete said frame.</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:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tbriHkw2sqUbFGkCwBfYWm" name="Tecware_Spectre_75" alt="Tecware Spectre 75 keyboard's screen" src="https://cdn.mos.cms.futurecdn.net/tbriHkw2sqUbFGkCwBfYWm-1920-80.jpg" mos="" align="middle" fullscreen="1" width="2048" height="1152" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/tbriHkw2sqUbFGkCwBfYWm-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></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 took some time, but I managed to trim the frames down to 44. I clicked ‘Upload to Keyboard’ and watched the progress bar fill up… and then the software crashed. I booted up the software again and repeated the process, only this time the software didn’t say that the frames were limited to 44 — strange, but at least it saves me a gazillion steps. Again, I clicked ‘Upload to Keyboard’ and this time, it worked (thankfully).</p><p>But that isn’t where my troubles stopped. I wanted to test the software’s macro recording feature but for some reason, none of the options in the macro tab were clickable. I reinstalled the software and the issue persisted. I even checked if the Spectre 75 had the latest firmware installed (it did).</p><p>The Spectre 75’s LCD screen is capable of displaying CPU and GPU stats, too, but the software needs to be running in the background — again, impossible to do on macOS. Overall, the software left a sour taste in my mouth, and it sticks out like a sore thumb.</p><h2 id="limited-stock-switch-choice">Limited stock switch choice</h2><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="tSoN6eKP7rSzQd8sqqY5v6" name="Tecware_Spectre75_Keyboard_012.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/tSoN6eKP7rSzQd8sqqY5v6-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Tecware Spectre 75 comes with pre-lubed switches that are made in-house. Unfortunately, you’re limited to just two stock switch sets. You can choose either Cocoa Brown tactile or Candy Red linear switches. There are no clicky or silent switches, and you’ll have to buy your preferred ones separately.</p><p>Thankfully, the Spectre 75 is hot-swappable and compatible with south-facing 5-pin mechanical switches. It’s nice to see a budget keyboard offering hot-swappability when some pricey keyboards don’t (looking at you, Turtle Beach Command Series KB5). If you want more stock switch choice at checkout, I’d recommend the Keychron V1 8K.</p><h2 id="not-the-most-responsive-when-waking">Not the most responsive when waking</h2><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="bnVYxtLuhSJSPAodxiFxK7" name="Tecware_Spectre75_Keyboard_013.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/bnVYxtLuhSJSPAodxiFxK7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The last nail in the Tecware Spectre 75’s coffin is its tendency to not respond when it’s waking from sleep mode. In my testing, over Bluetooth and a wired connection, the keyboard wouldn’t respond after my laptop — and therefore, the Spectre 75 — had been asleep for a while. Though it didn’t happen <em>all </em>the time, I had to reconnect the keyboard a few times to get it working again. I tested this on macOS and Windows machines and had the same issue each time.</p><p>I haven’t had this issue with other mechanical keyboards I’ve tested. For that reason, and everything else I’ve mentioned up until now, I’d recommend the Keychron V1 8K or the Royal Kludge L75. I’ve tested both keyboards extensively and neither of them have given me this much grief.</p><p>I've reached out to Tecware's representative about this issue, to see whether it's limited to my review unit alone.</p><h2 class="article-body__section" id="section-tecware-spectre-75-review-verdict"><span>Tecware Spectre 75 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hkNmhewXwLrRkkaVw6iww7" name="Tecware_Spectre75_Keyboard_005.JPG" alt="A black Tecware Spectre 75 mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/hkNmhewXwLrRkkaVw6iww7-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Tecware Spectre 75 is a decent mechanical keyboard for typing and casual gaming, thanks to its responsive linear switches and 1,000Hz polling rate. It features an LCD screen that you can view keyboard and system stats on, or display GIFs on, too.</p><p>But there isn’t much else to like about the Spectre 75. The companion software needed to customize the screen is janky and frustrating to use, while the keyboard itself sports a lackluster design and plasticky build. You’re limited to just two stock switch sets, too. I also struggled with the keyboard becoming unresponsive in my testing.</p><p>While $79 isn’t a high asking price, you can get better value for your money elsewhere. The Keychron V1 8K and the Royal Kludge L75 are fantastic keyboards under $80, and are much better choices if you want a feature-packed deck.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just tested Dell’s 4K 120Hz monitor with self-calibration and more ports than you could ask for — and it’s a winner ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Dell UltraSharp U3226Q is one of the <a href="https://www.tomsguide.com/best-picks/best-monitors">best monitors</a> for professional photographers, videographers, editors and creatives, period. This 32-inch beast features self-calibration that ensures superb color accuracy day in and out. With wide color coverage as well as an array of color modes, it doesn’t give you much to complain about. It also hosts more ports than you could ask for, and for casual gamers, there’s the 120Hz refresh rate and 0.03ms response time.</p><p>Is there anything wrong with it? Not particularly. Its 4K panel is neither the brightest nor the dullest in its weight class, and the price tag may make your eye twitch. Neither of these are outright dealbreakers, though. If you’re a professional looking for a monitor that doesn’t skimp on features, this is the one.</p><p>For the complete breakdown, read my full Dell UltraSharp U3226Q review.</p><h2 class="article-body__section" id="section-dell-ultrasharp-u3226q-review-specs"><span>Dell UltraSharp U3226Q review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.bhphotovideo.com/c/product/1944478-REG/dell_ultrasharp_qd_oled_u3226q_32.html" target="_blank" rel="nofollow">$2,499</a> / <a href="https://www.dell.com/en-uk/shop/dell-ultrasharp-32-4k-qd-oled-monitor-u3226q/apd/210-bvcp/monitors-monitor-accessories" target="_blank" rel="nofollow">£2,404</a></p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>32-inch</p></td></tr><tr><td class="firstcol " ><p><strong>Resolution</strong></p></td><td  ><p>3840 x 2160 (4K)</p></td></tr><tr><td class="firstcol " ><p><strong>Aspect ratio</strong></p></td><td  ><p>16:9</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Response time</strong></p></td><td  ><p>0.03ms</p></td></tr><tr><td class="firstcol " ><p><strong>Panel type</strong></p></td><td  ><p>QD-OLED</p></td></tr><tr><td class="firstcol " ><p><strong>Color depth</strong></p></td><td  ><p>10-bit</p></td></tr><tr><td class="firstcol " ><p><strong>DPI</strong></p></td><td  ><p>140</p></td></tr><tr><td class="firstcol " ><p><strong>Backlight</strong></p></td><td  ><p>LED</p></td></tr><tr><td class="firstcol " ><p><strong>Inputs</strong></p></td><td  ><p>Power, 2x HDMI 2.1, 1x DisplayPort 1.4, 1x Thunderbolt 4 (upstream, 40Gbps, DisplayPort 1.4 Alt Mode, 140W PD), 1x Thunderbolt 4 (downstream, 40Gbps, daisy-chain, 15W PD), 2x USB-A (downstream, 10Gbps), 1x USB-C (upstream, 10Gbps), 1x USB-A (downstream, 10Gbps), 2x USB-C (downstream, 10Gbps, 27W PD), 1x RJ45 Ethernet</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>28.28 x 24.56-18.65 x 8.55 inches (with stand)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>21.69lbs (with stand)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-dell-ultrasharp-u3226q-review-cheat-sheet"><span>Dell UltraSharp U3226Q review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A 32-inch QD-OLED monitor with a 4K UHD resolution</li><li><strong>Who is it for?</strong> For professional photographers, editors, creatives and everyone in between</li><li><strong>How much does it cost?</strong> It ain’t cheap — the Dell UltraSharp U3226Q costs <a href="https://www.bhphotovideo.com/c/product/1944478-REG/dell_ultrasharp_qd_oled_u3226q_32.html" target="_blank" rel="nofollow">$2,499</a> / <a href="https://www.dell.com/en-uk/shop/dell-ultrasharp-32-4k-qd-oled-monitor-u3226q/apd/210-bvcp/monitors-monitor-accessories" target="_blank" rel="nofollow">£2,404</a></li><li><strong>What do we like? </strong>The built-in colorimeter, outstanding color coverage and accuracy, 120Hz refresh rate, and the wide array of ports</li><li><strong>What don’t we like? </strong>The eye-watering price tag</li></ul><h2 class="article-body__section" id="section-dell-ultrasharp-u3226q-review-the-ups"><span>Dell UltraSharp U3226Q review: The ups</span></h2><p>The question isn’t, “What can the Dell UltraSharp U3226Q do?” It’s what it <em>can’t </em>do. Excellent color coverage and accuracy, a built-in colorimeter, plenty of color modes and ports, 120Hz refresh rate, 0.03ms response time. It’s got it all.</p><h2 id="pro-features-for-the-pros">Pro features for the pros</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MoUVMCkXN6NsGX5RJV8QoA" name="Dell Ultrasharp" alt="Dell UltraSharp U3226Q self-calibration" src="https://cdn.mos.cms.futurecdn.net/MoUVMCkXN6NsGX5RJV8QoA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" 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>There’s no doubt that the Dell UltraSharp U3226Q is a pro monitor meant for pros, and one quick glance at its specs sheet tells you as much. Alongside outstanding color coverage and accuracy (more on that shortly), the U3226Q features seven color factory-calibrated modes as well as six customizable ones. The seven modes include DCI-P3, Display P3, sRGB, BT.709, BT.2020, and Adobe RGB (with D50 and D65 white points). These make the U3226Q excellent for digital as well as print editing.</p><p>The U3226Q is a self-calibrating monitor, which means that it features a built-in colorimeter that automatically tests and adjusts the display’s color accuracy. You can choose between Express and Comprehensive self-calibration via the U3226Q’s menu. Once you’ve selected it, the U3226Q will calibrate itself to maintain its outstanding performance day in and out. This is very handy for professional editors, and it’s something that isn’t even offered by expensive monitors, like the <a href="https://www.tomsguide.com/computing/monitors/apple-studio-display-xdr-review">Apple Studio Display XDR</a> ($3,299).</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:1919px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="sYeXr7gsmMmGRjMn3J2FrP" name="Dell_Ultrasharp32_6" alt="A black Dell UltraSharp U3226Q 4K UHD monitor" src="https://cdn.mos.cms.futurecdn.net/sYeXr7gsmMmGRjMn3J2FrP-1920-80.jpg" mos="" align="middle" fullscreen="" width="1919" 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>Other key features for those who plan on staring at the screen for up to eight hours a day include a TÜV 4-star certification for enhanced eye comfort, and low blue light technology which reduces harmful blue light emissions to ≤35%. The 4K UHD panel features an anti-glare coating, too, which ensures clear visuals and consistent colors in any lighting conditions. Having used the monitor for a week, I can confirm that my eyes didn’t feel fatigued at all.</p><p>Dell also includes a monitor hood in the box which you can magnetically snap on to the U3226Q’s bezels. It helps minimize glare from overhead lighting, negates visual distractions, and helps improve color accuracy. All in all, the U3226Q is a fantastic package and really doesn’t give you much to complain about.</p><h2 id="outstanding-color-coverage-and-accuracy">Outstanding color coverage and accuracy</h2><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.20%;"><img id="bGj7BoxXSeSeKyy7A6wseP" name="Dell_Ultrasharp32_3" alt="A black Dell UltraSharp U3226Q 4K UHD monitor" src="https://cdn.mos.cms.futurecdn.net/bGj7BoxXSeSeKyy7A6wseP-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1079" 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 we’re on to the meat of this review. How’s the Dell UltraSharp U3226Q’s color coverage and accuracy? Outstanding, in one word. The U3226Q’s 4K QD-OLED panel has a resolution of 3840 x 2160, and it’s gorgeous to look at. It features 10-bit color depth which means it’s capable of displaying 1.07 billion individual hues.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>sRGB</strong></p></th><th  ><p><strong>DCI P3</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Dell UltraSharp U3226Q</strong></p></td><td  ><p>188.8%</p></td><td  ><p>133.7%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2732u-review"><strong>BenQ PD2732U</strong></a></p></td><td  ><p>147.1%</p></td><td  ><p>104.2%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/dell-pro-p34-usb-c-hub-webcam-monitor-p3426wev-review"><strong>Dell Pro P3426WEV</strong></a></p></td><td  ><p>122.8%</p></td><td  ><p>87%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-ma270s-review"><strong>BenQ MA270S</strong></a></p></td><td  ><p>158.7%</p></td><td  ><p>112.4%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-pd3226g-review"><strong>BenQ PD3226G</strong></a></p></td><td  ><p>147%</p></td><td  ><p>104.1%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2730s-5k-monitor-review"><strong>BenQ PD2730S</strong></a></p></td><td  ><p>104.9%</p></td><td  ><p>98.3%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/alogic-edge-40-inch-5k-ultrawide-review"><strong>Alogic Edge 40-inch 5K Ultrawide</strong></a></p></td><td  ><p>104.5%</p></td><td  ><p>99.8%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/apple-studio-display-xdr-review"><strong>Apple Studio Display XDR</strong></a></p></td><td  ><p>121.3%</p></td><td  ><p>89.5%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/reviews/apple-studio-display"><strong>Apple Studio Display</strong></a></p></td><td  ><p>114.1%</p></td><td  ><p>80.8%</p></td></tr></tbody></table></div><p>Dell says that the U3226Q “delivers vibrant visuals and true-to-life colors,” and my lab tests confirmed it. I’ve lab-tested plenty of monitors, and the U3226Q boasts the best color coverage and accuracy. As you can see from the table above, it covers 188.8% of the sRGB space and 133.7% of the wider DCI P3 gamut. It upstages the Apple Studio Display XDR (which doesn’t even cover 100% of the DCI P3 color space), and all of BenQ’s monitors on the list.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Delta-E</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Dell UltraSharp U3226Q</strong></p></td><td  ><p>0.08</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2732u-review"><strong>BenQ PD2732U</strong></a></p></td><td  ><p>0.11</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/dell-pro-p34-usb-c-hub-webcam-monitor-p3426wev-review"><strong>Dell Pro P3426WEV</strong></a></p></td><td  ><p>0.05</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-ma270s-review"><strong>BenQ MA270S</strong></a></p></td><td  ><p>0.09</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-pd3226g-review"><strong>BenQ PD3226G</strong></a></p></td><td  ><p>0.16</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2730s-5k-monitor-review"><strong>BenQ PD2730S</strong></a></p></td><td  ><p>0.1</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/alogic-edge-40-inch-5k-ultrawide-review"><strong>Alogic Edge 40-inch 5K Ultrawide</strong></a></p></td><td  ><p>0.08</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/apple-studio-display-xdr-review"><strong>Apple Studio Display XDR</strong></a></p></td><td  ><p>0.2</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/reviews/apple-studio-display"><strong>Apple Studio Display</strong></a></p></td><td  ><p>0.2</p></td></tr></tbody></table></div><p>Color accuracy is phenomenal, too. The U3226Q achieved a Delta-E score of 0.08 in my lab test. Delta E is a numerical representation of how much two colors differ, and it tells you how close the color relayed on the monitor is to the output from the source or laptop. You ideally want the score to be as close to zero as possible. 0.08 is, then, excellent, as it ascertains that the colors the U3226Q is displaying are extremely accurate. Again, Dell’s offering trumps the pricier Apple Studio Display XDR. The only monitor that beats it is the <a href="https://www.tomsguide.com/computing/monitors/dell-pro-p34-usb-c-hub-webcam-monitor-p3426wev-review">Dell Pro P3426WEV</a> ($749) with its 0.05 score — but the difference is negligible.</p><p>In real-world use, I’ve loved using the U3226Q for work, watching 4K YouTube videos, and playing games. Colors appear bright and vivid. Blues and greens are deep; reds are rich; and blacks are inky and deep. Highlights don’t appear too sharp in 4K videos either, making for an enjoyable and immersive watching experience. I used the monitor to edit some photos for my <a href="https://www.instagram.com/photos.bynikita" target="_blank" rel="nofollow">photography Instagram account</a>, too, and knowing that the colors were as accurate as  they could be helped me color-grade confidently.</p><h2 id="ports-galore">Ports galore!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1919px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="Pqprraz8rgevzXzyBrgF3Q" name="Dell_Ultrasharp32_9" alt="A black Dell UltraSharp U3226Q 4K UHD monitor" src="https://cdn.mos.cms.futurecdn.net/Pqprraz8rgevzXzyBrgF3Q-1920-80.jpg" mos="" align="middle" fullscreen="" width="1919" 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>Dell hasn’t skimped on the UltraSharp U3226Q’s ports, and you get everything you could ask for and more. Most of the ports are located on the back. There’s obviously a power port and located next to it are two HDMI 2.1, one DisplayPort 1.4, and two Thunderbolt 4 ports. One of the Thunderbolts is an upstream, DisplayPort Alt Mode port with 140W of power delivery, while the other is a downstream, daisy-chaining port with 15W of power delivery.</p><p>Just like on the Dell Pro P3426WEV, the DisplayPort Alt Mode enables the USB-C port to receive video signals using the DisplayPort protocol. It offers higher data bandwidth, and allows you to daisy-chain multiple monitors from a single port, too. Not only does this help you cut down on cables (who doesn’t love a bit of effective cable management?), it’s also handy if you’re routing graphics through a docking station via USB-C as you can continue accessing DisplayPort’s high resolutions and refresh rates.</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:1919px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="NWthPrY2bLBbXurUevSKiP" name="Dell_Ultrasharp32_4" alt="A black Dell UltraSharp U3226Q 4K UHD monitor" src="https://cdn.mos.cms.futurecdn.net/NWthPrY2bLBbXurUevSKiP-1920-80.jpg" mos="" align="middle" fullscreen="" width="1919" 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 addition to that, two USB-A downstream ports with 10Gbps speeds are also located on the back, as well as an RJ45 Ethernet one. Similar to the P3426WEV, the U3226Q features a pop-out port housing on the monitor’s bottom edge. Pushing it reveals a panel with a downstream USB-A and two USB-C ports (27W power delivery), each with 10Gbps speeds.</p><p>Similar to the <a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2732u-review">BenQ Creative Pro PD2732U</a> ($799), the U3226Q packs Smart KVM, too, which enables you to use a single keyboard and mouse with two computers when they’re hooked up to the monitor. It’s great for those who work across multiple computers.</p><h2 id="for-the-casual-gamers-too">For the casual gamers, too</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T7o98GxcYDcFg9VPYAnHAm" name="Dell Ultrasharp-2" alt="Dell UltraSharp U3226Q" src="https://cdn.mos.cms.futurecdn.net/T7o98GxcYDcFg9VPYAnHAm-1920-80.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" 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>Though the Dell UltraSharp U3226Q is a monitor for professionals, it’s a competent gaming machine, too. It packs a 120Hz refresh rate and a 0.03ms response time, which is more than sufficient for most casual gamers.</p><p>Motion isn’t as silky smooth as on monitors with extremely high refresh rates, like the <a href="https://www.tomsguide.com/computing/monitors/msi-mpg-341cqr-qd-oled-x36-review">MSI MPG 341CQR QD-OLED X36</a> (360Hz, $949) and the <a href="https://www.tomsguide.com/computing/monitors/msi-mag-272qp-qd-oled-x50-review">MSI MAG 272QP QD-OLED X50</a> (500Hz, $749), but it’s still excellent. I didn’t notice any choppiness while playing <a href="https://www.tomsguide.com/reviews/forza-horizon-5">Forza Horizon 5</a> and Counter-Strike 2, and I was comfortably running 100-115fps in the latter. Thanks to the 0.03ms response time — same as on the MSI X36 — I didn’t experience any motion blur or noticeable ghosting either.</p><h2 class="article-body__section" id="section-dell-ultrasharp-u3226q-review-the-downs"><span>Dell UltraSharp U3226Q review: The downs</span></h2><p>The Dell UltraSharp U3226Q doesn’t have many flaws. It’s expensive, and the 4K panel’s brightness is neither the best nor the worst.</p><h2 id="middle-of-the-road-brightness">Middle-of-the-road brightness</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1919px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="Y7Q7e49hboiL5vL3DSEbYP" name="Dell_Ultrasharp32_1" alt="A black Dell UltraSharp U3226Q 4K UHD monitor" src="https://cdn.mos.cms.futurecdn.net/Y7Q7e49hboiL5vL3DSEbYP-1920-80.jpg" mos="" align="middle" fullscreen="" width="1919" 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 Dell UltraSharp U3226Q is neither the brightest nor the dimmest monitor — it does well against some competitors while not performing that formidably against others. In my lab tests, the U3226Q achieved a peak brightness of 295.4 nits in SDR and 425 nits in HDR (10% window size).</p><p>When it comes to both SDR and HDR results, the U3226Q upstages the BenQ PD2732U, the Dell Pro P3426WEV, the <a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2730s-5k-monitor-review">BenQ PD2730S</a> ($1,199) and the <a href="https://www.tomsguide.com/computing/monitors/benq-pd3226g-review">BenQ PD3226G</a> ($1,099), as you can see in the table below. The P3426WEV doesn’t even support HDR, giving the U3226Q a leg-up.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Peak brightness (SDR)</strong></p></th><th  ><p><strong>Peak brightness (10% window size, HDR)</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Dell UltraSharp U3226Q</strong></p></td><td  ><p>295.4</p></td><td  ><p>425</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2732u-review"><strong>BenQ PD2732U</strong></a></p></td><td  ><p>182.6</p></td><td  ><p>184</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/dell-pro-p34-usb-c-hub-webcam-monitor-p3426wev-review"><strong>Dell Pro P3426WEV</strong></a></p></td><td  ><p>284.8</p></td><td  ><p>N/A</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-ma270s-review"><strong>BenQ MA270S</strong></a></p></td><td  ><p>387.4</p></td><td  ><p>272</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-pd3226g-review"><strong>BenQ PD3226G</strong></a></p></td><td  ><p>252.4</p></td><td  ><p>267</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2730s-5k-monitor-review"><strong>BenQ PD2730S</strong></a></p></td><td  ><p>346</p></td><td  ><p>346</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/alogic-edge-40-inch-5k-ultrawide-review"><strong>Alogic Edge 40-inch 5K Ultrawide</strong></a></p></td><td  ><p>417</p></td><td  ><p>216</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/apple-studio-display-xdr-review"><strong>Apple Studio Display XDR</strong></a></p></td><td  ><p>516</p></td><td  ><p>1,727</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/reviews/apple-studio-display"><strong>Apple Studio Display</strong></a></p></td><td  ><p>518</p></td><td  ><p>N/A</p></td></tr></tbody></table></div><p>However, the <a href="https://www.tomsguide.com/computing/monitors/benq-ma270s-review">BenQ MA270S</a> ($999), the <a href="https://www.tomsguide.com/reviews/apple-studio-display">Apple Studio Display</a> ($1,499) and the Apple Studio Display XDR outperform the U3226Q when it comes to Standard Dynamic Range. It isn’t surprising that the Apple Studio Display XDR does this (as it’s more expensive) but it’s disappointing that the U3226Q doesn’t get as bright as the MA270S, which is half the U3226Q’s price.</p><p>I don’t think this is necessarily a dealbreaker as you shouldn’t have your brightness turned all the way up anyway when editing photos, and this is a professional studio monitor after all. In real-world use, I had no problem using this monitor and clearly seeing what was on screen under bright studio lights. Of course, if you want a monitor with a brighter panel, I can’t recommend the MA270S enough.</p><h2 id="ridonculous-price">Ridonculous price</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1919px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="KUkBCpyTUZgajqyANVYJxP" name="Dell_Ultrasharp32_8" alt="A black Dell UltraSharp U3226Q 4K UHD monitor" src="https://cdn.mos.cms.futurecdn.net/KUkBCpyTUZgajqyANVYJxP-1920-80.jpg" mos="" align="middle" fullscreen="" width="1919" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As you’ve seen so far, the Dell UltraSharp U3226Q is not your average monitor, and it packs pro features that make it suitable for professionals… and it’s got a price tag to match. The U3226Q doesn’t come cheap. It has a retail price of <a href="https://www.bhphotovideo.com/c/product/1944478-REG/dell_ultrasharp_qd_oled_u3226q_32.html" target="_blank" rel="nofollow">$2,499 at B&H Photo</a> / <a href="https://www.dell.com/en-uk/shop/dell-ultrasharp-32-4k-qd-oled-monitor-u3226q/apd/210-bvcp/monitors-monitor-accessories" target="_blank" rel="nofollow">£2,404 at Dell U.K.</a>, making it one of the most expensive monitors I’ve tested so far.</p><p>This makes the U3226Q more expensive than some of the other productivity- and photography-focused monitors I’ve tested, like the BenQ MA270S ($999), the BenQ PD2732U ($799), the Dell Pro P3426WEV ($749) and the <a href="https://www.tomsguide.com/computing/monitors/alogic-edge-40-inch-5k-ultrawide-review">Alogic Edge 40-inch 5K Ultrawide</a> ($1,499). The U3226Q is slightly cheaper than the Apple Studio Display XDR ($3,499), though, if that’s any consolation.</p><h2 class="article-body__section" id="section-dell-ultrasharp-u3226q-review-verdict"><span>Dell UltraSharp U3226Q review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.20%;"><img id="HTzX9qUBydaVCHk46wLHmP" name="Dell_Ultrasharp32_5" alt="A black Dell UltraSharp U3226Q 4K UHD monitor" src="https://cdn.mos.cms.futurecdn.net/HTzX9qUBydaVCHk46wLHmP-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1079" 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 professional photographers, colorists and editors, the Dell UltraSharp U3226Q checks nearly every box. Stupendous color accuracy and coverage, self-calibration, a stunning QD-OLED display, and more ports than you could ask for make it a winner. For casual gamers, there’s a 120Hz refresh rate and response time of 0.03ms, too, so what more could you want?</p><p>You’re paying a premium for all the pro features, though, and the U3226Q costs $2,500. While it’s a lot, I think the U3226Q does plenty to justify it. The built-in colorimeter for self-calibration ensures color accuracy over time, thereby increasing the monitor’s lifespan. At the end of the day, the U3226Q is <em>the </em>monitor for professionals, and it’s the display I’d personally buy.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/monitors/dell-ultrasharp-u3226q-review</link>
                                                                            <description>
                            <![CDATA[ The Dell UltraSharp U3226Q boasts outstanding color coverage and accuracy, a 120Hz refresh rate, built-in self-calibration, and plenty of ports. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">qKzv2iayoPYmdM4yv3x8SE</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HTzX9qUBydaVCHk46wLHmP-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 11 Sep 2026 12:09:18 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Monitors]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Computing Hardware]]></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-320-70.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.&lt;/p&gt;&lt;p&gt;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/HTzX9qUBydaVCHk46wLHmP-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A black Dell UltraSharp U3226Q 4K UHD monitor]]></media:description>                                                            <media:text><![CDATA[A black Dell UltraSharp U3226Q 4K UHD monitor]]></media:text>
                                <media:title type="plain"><![CDATA[A black Dell UltraSharp U3226Q 4K UHD monitor]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HTzX9qUBydaVCHk46wLHmP-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Dell UltraSharp U3226Q is one of the <a href="https://www.tomsguide.com/best-picks/best-monitors">best monitors</a> for professional photographers, videographers, editors and creatives, period. This 32-inch beast features self-calibration that ensures superb color accuracy day in and out. With wide color coverage as well as an array of color modes, it doesn’t give you much to complain about. It also hosts more ports than you could ask for, and for casual gamers, there’s the 120Hz refresh rate and 0.03ms response time.</p><p>Is there anything wrong with it? Not particularly. Its 4K panel is neither the brightest nor the dullest in its weight class, and the price tag may make your eye twitch. Neither of these are outright dealbreakers, though. If you’re a professional looking for a monitor that doesn’t skimp on features, this is the one.</p><p>For the complete breakdown, read my full Dell UltraSharp U3226Q review.</p><h2 class="article-body__section" id="section-dell-ultrasharp-u3226q-review-specs"><span>Dell UltraSharp U3226Q review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.bhphotovideo.com/c/product/1944478-REG/dell_ultrasharp_qd_oled_u3226q_32.html" target="_blank" rel="nofollow">$2,499</a> / <a href="https://www.dell.com/en-uk/shop/dell-ultrasharp-32-4k-qd-oled-monitor-u3226q/apd/210-bvcp/monitors-monitor-accessories" target="_blank" rel="nofollow">£2,404</a></p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>32-inch</p></td></tr><tr><td class="firstcol " ><p><strong>Resolution</strong></p></td><td  ><p>3840 x 2160 (4K)</p></td></tr><tr><td class="firstcol " ><p><strong>Aspect ratio</strong></p></td><td  ><p>16:9</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Response time</strong></p></td><td  ><p>0.03ms</p></td></tr><tr><td class="firstcol " ><p><strong>Panel type</strong></p></td><td  ><p>QD-OLED</p></td></tr><tr><td class="firstcol " ><p><strong>Color depth</strong></p></td><td  ><p>10-bit</p></td></tr><tr><td class="firstcol " ><p><strong>DPI</strong></p></td><td  ><p>140</p></td></tr><tr><td class="firstcol " ><p><strong>Backlight</strong></p></td><td  ><p>LED</p></td></tr><tr><td class="firstcol " ><p><strong>Inputs</strong></p></td><td  ><p>Power, 2x HDMI 2.1, 1x DisplayPort 1.4, 1x Thunderbolt 4 (upstream, 40Gbps, DisplayPort 1.4 Alt Mode, 140W PD), 1x Thunderbolt 4 (downstream, 40Gbps, daisy-chain, 15W PD), 2x USB-A (downstream, 10Gbps), 1x USB-C (upstream, 10Gbps), 1x USB-A (downstream, 10Gbps), 2x USB-C (downstream, 10Gbps, 27W PD), 1x RJ45 Ethernet</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>28.28 x 24.56-18.65 x 8.55 inches (with stand)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>21.69lbs (with stand)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-dell-ultrasharp-u3226q-review-cheat-sheet"><span>Dell UltraSharp U3226Q review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A 32-inch QD-OLED monitor with a 4K UHD resolution</li><li><strong>Who is it for?</strong> For professional photographers, editors, creatives and everyone in between</li><li><strong>How much does it cost?</strong> It ain’t cheap — the Dell UltraSharp U3226Q costs <a href="https://www.bhphotovideo.com/c/product/1944478-REG/dell_ultrasharp_qd_oled_u3226q_32.html" target="_blank" rel="nofollow">$2,499</a> / <a href="https://www.dell.com/en-uk/shop/dell-ultrasharp-32-4k-qd-oled-monitor-u3226q/apd/210-bvcp/monitors-monitor-accessories" target="_blank" rel="nofollow">£2,404</a></li><li><strong>What do we like? </strong>The built-in colorimeter, outstanding color coverage and accuracy, 120Hz refresh rate, and the wide array of ports</li><li><strong>What don’t we like? </strong>The eye-watering price tag</li></ul><h2 class="article-body__section" id="section-dell-ultrasharp-u3226q-review-the-ups"><span>Dell UltraSharp U3226Q review: The ups</span></h2><p>The question isn’t, “What can the Dell UltraSharp U3226Q do?” It’s what it <em>can’t </em>do. Excellent color coverage and accuracy, a built-in colorimeter, plenty of color modes and ports, 120Hz refresh rate, 0.03ms response time. It’s got it all.</p><h2 id="pro-features-for-the-pros">Pro features for the pros</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MoUVMCkXN6NsGX5RJV8QoA" name="Dell Ultrasharp" alt="Dell UltraSharp U3226Q self-calibration" src="https://cdn.mos.cms.futurecdn.net/MoUVMCkXN6NsGX5RJV8QoA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" 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>There’s no doubt that the Dell UltraSharp U3226Q is a pro monitor meant for pros, and one quick glance at its specs sheet tells you as much. Alongside outstanding color coverage and accuracy (more on that shortly), the U3226Q features seven color factory-calibrated modes as well as six customizable ones. The seven modes include DCI-P3, Display P3, sRGB, BT.709, BT.2020, and Adobe RGB (with D50 and D65 white points). These make the U3226Q excellent for digital as well as print editing.</p><p>The U3226Q is a self-calibrating monitor, which means that it features a built-in colorimeter that automatically tests and adjusts the display’s color accuracy. You can choose between Express and Comprehensive self-calibration via the U3226Q’s menu. Once you’ve selected it, the U3226Q will calibrate itself to maintain its outstanding performance day in and out. This is very handy for professional editors, and it’s something that isn’t even offered by expensive monitors, like the <a href="https://www.tomsguide.com/computing/monitors/apple-studio-display-xdr-review">Apple Studio Display XDR</a> ($3,299).</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:1919px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="sYeXr7gsmMmGRjMn3J2FrP" name="Dell_Ultrasharp32_6" alt="A black Dell UltraSharp U3226Q 4K UHD monitor" src="https://cdn.mos.cms.futurecdn.net/sYeXr7gsmMmGRjMn3J2FrP-1920-80.jpg" mos="" align="middle" fullscreen="" width="1919" 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>Other key features for those who plan on staring at the screen for up to eight hours a day include a TÜV 4-star certification for enhanced eye comfort, and low blue light technology which reduces harmful blue light emissions to ≤35%. The 4K UHD panel features an anti-glare coating, too, which ensures clear visuals and consistent colors in any lighting conditions. Having used the monitor for a week, I can confirm that my eyes didn’t feel fatigued at all.</p><p>Dell also includes a monitor hood in the box which you can magnetically snap on to the U3226Q’s bezels. It helps minimize glare from overhead lighting, negates visual distractions, and helps improve color accuracy. All in all, the U3226Q is a fantastic package and really doesn’t give you much to complain about.</p><h2 id="outstanding-color-coverage-and-accuracy">Outstanding color coverage and accuracy</h2><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.20%;"><img id="bGj7BoxXSeSeKyy7A6wseP" name="Dell_Ultrasharp32_3" alt="A black Dell UltraSharp U3226Q 4K UHD monitor" src="https://cdn.mos.cms.futurecdn.net/bGj7BoxXSeSeKyy7A6wseP-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1079" 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 we’re on to the meat of this review. How’s the Dell UltraSharp U3226Q’s color coverage and accuracy? Outstanding, in one word. The U3226Q’s 4K QD-OLED panel has a resolution of 3840 x 2160, and it’s gorgeous to look at. It features 10-bit color depth which means it’s capable of displaying 1.07 billion individual hues.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>sRGB</strong></p></th><th  ><p><strong>DCI P3</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Dell UltraSharp U3226Q</strong></p></td><td  ><p>188.8%</p></td><td  ><p>133.7%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2732u-review"><strong>BenQ PD2732U</strong></a></p></td><td  ><p>147.1%</p></td><td  ><p>104.2%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/dell-pro-p34-usb-c-hub-webcam-monitor-p3426wev-review"><strong>Dell Pro P3426WEV</strong></a></p></td><td  ><p>122.8%</p></td><td  ><p>87%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-ma270s-review"><strong>BenQ MA270S</strong></a></p></td><td  ><p>158.7%</p></td><td  ><p>112.4%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-pd3226g-review"><strong>BenQ PD3226G</strong></a></p></td><td  ><p>147%</p></td><td  ><p>104.1%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2730s-5k-monitor-review"><strong>BenQ PD2730S</strong></a></p></td><td  ><p>104.9%</p></td><td  ><p>98.3%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/alogic-edge-40-inch-5k-ultrawide-review"><strong>Alogic Edge 40-inch 5K Ultrawide</strong></a></p></td><td  ><p>104.5%</p></td><td  ><p>99.8%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/apple-studio-display-xdr-review"><strong>Apple Studio Display XDR</strong></a></p></td><td  ><p>121.3%</p></td><td  ><p>89.5%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/reviews/apple-studio-display"><strong>Apple Studio Display</strong></a></p></td><td  ><p>114.1%</p></td><td  ><p>80.8%</p></td></tr></tbody></table></div><p>Dell says that the U3226Q “delivers vibrant visuals and true-to-life colors,” and my lab tests confirmed it. I’ve lab-tested plenty of monitors, and the U3226Q boasts the best color coverage and accuracy. As you can see from the table above, it covers 188.8% of the sRGB space and 133.7% of the wider DCI P3 gamut. It upstages the Apple Studio Display XDR (which doesn’t even cover 100% of the DCI P3 color space), and all of BenQ’s monitors on the list.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Delta-E</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Dell UltraSharp U3226Q</strong></p></td><td  ><p>0.08</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2732u-review"><strong>BenQ PD2732U</strong></a></p></td><td  ><p>0.11</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/dell-pro-p34-usb-c-hub-webcam-monitor-p3426wev-review"><strong>Dell Pro P3426WEV</strong></a></p></td><td  ><p>0.05</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-ma270s-review"><strong>BenQ MA270S</strong></a></p></td><td  ><p>0.09</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-pd3226g-review"><strong>BenQ PD3226G</strong></a></p></td><td  ><p>0.16</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2730s-5k-monitor-review"><strong>BenQ PD2730S</strong></a></p></td><td  ><p>0.1</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/alogic-edge-40-inch-5k-ultrawide-review"><strong>Alogic Edge 40-inch 5K Ultrawide</strong></a></p></td><td  ><p>0.08</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/apple-studio-display-xdr-review"><strong>Apple Studio Display XDR</strong></a></p></td><td  ><p>0.2</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/reviews/apple-studio-display"><strong>Apple Studio Display</strong></a></p></td><td  ><p>0.2</p></td></tr></tbody></table></div><p>Color accuracy is phenomenal, too. The U3226Q achieved a Delta-E score of 0.08 in my lab test. Delta E is a numerical representation of how much two colors differ, and it tells you how close the color relayed on the monitor is to the output from the source or laptop. You ideally want the score to be as close to zero as possible. 0.08 is, then, excellent, as it ascertains that the colors the U3226Q is displaying are extremely accurate. Again, Dell’s offering trumps the pricier Apple Studio Display XDR. The only monitor that beats it is the <a href="https://www.tomsguide.com/computing/monitors/dell-pro-p34-usb-c-hub-webcam-monitor-p3426wev-review">Dell Pro P3426WEV</a> ($749) with its 0.05 score — but the difference is negligible.</p><p>In real-world use, I’ve loved using the U3226Q for work, watching 4K YouTube videos, and playing games. Colors appear bright and vivid. Blues and greens are deep; reds are rich; and blacks are inky and deep. Highlights don’t appear too sharp in 4K videos either, making for an enjoyable and immersive watching experience. I used the monitor to edit some photos for my <a href="https://www.instagram.com/photos.bynikita" target="_blank" rel="nofollow">photography Instagram account</a>, too, and knowing that the colors were as accurate as  they could be helped me color-grade confidently.</p><h2 id="ports-galore">Ports galore!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1919px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="Pqprraz8rgevzXzyBrgF3Q" name="Dell_Ultrasharp32_9" alt="A black Dell UltraSharp U3226Q 4K UHD monitor" src="https://cdn.mos.cms.futurecdn.net/Pqprraz8rgevzXzyBrgF3Q-1920-80.jpg" mos="" align="middle" fullscreen="" width="1919" 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>Dell hasn’t skimped on the UltraSharp U3226Q’s ports, and you get everything you could ask for and more. Most of the ports are located on the back. There’s obviously a power port and located next to it are two HDMI 2.1, one DisplayPort 1.4, and two Thunderbolt 4 ports. One of the Thunderbolts is an upstream, DisplayPort Alt Mode port with 140W of power delivery, while the other is a downstream, daisy-chaining port with 15W of power delivery.</p><p>Just like on the Dell Pro P3426WEV, the DisplayPort Alt Mode enables the USB-C port to receive video signals using the DisplayPort protocol. It offers higher data bandwidth, and allows you to daisy-chain multiple monitors from a single port, too. Not only does this help you cut down on cables (who doesn’t love a bit of effective cable management?), it’s also handy if you’re routing graphics through a docking station via USB-C as you can continue accessing DisplayPort’s high resolutions and refresh rates.</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:1919px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="NWthPrY2bLBbXurUevSKiP" name="Dell_Ultrasharp32_4" alt="A black Dell UltraSharp U3226Q 4K UHD monitor" src="https://cdn.mos.cms.futurecdn.net/NWthPrY2bLBbXurUevSKiP-1920-80.jpg" mos="" align="middle" fullscreen="" width="1919" 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 addition to that, two USB-A downstream ports with 10Gbps speeds are also located on the back, as well as an RJ45 Ethernet one. Similar to the P3426WEV, the U3226Q features a pop-out port housing on the monitor’s bottom edge. Pushing it reveals a panel with a downstream USB-A and two USB-C ports (27W power delivery), each with 10Gbps speeds.</p><p>Similar to the <a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2732u-review">BenQ Creative Pro PD2732U</a> ($799), the U3226Q packs Smart KVM, too, which enables you to use a single keyboard and mouse with two computers when they’re hooked up to the monitor. It’s great for those who work across multiple computers.</p><h2 id="for-the-casual-gamers-too">For the casual gamers, too</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T7o98GxcYDcFg9VPYAnHAm" name="Dell Ultrasharp-2" alt="Dell UltraSharp U3226Q" src="https://cdn.mos.cms.futurecdn.net/T7o98GxcYDcFg9VPYAnHAm-1920-80.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" 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>Though the Dell UltraSharp U3226Q is a monitor for professionals, it’s a competent gaming machine, too. It packs a 120Hz refresh rate and a 0.03ms response time, which is more than sufficient for most casual gamers.</p><p>Motion isn’t as silky smooth as on monitors with extremely high refresh rates, like the <a href="https://www.tomsguide.com/computing/monitors/msi-mpg-341cqr-qd-oled-x36-review">MSI MPG 341CQR QD-OLED X36</a> (360Hz, $949) and the <a href="https://www.tomsguide.com/computing/monitors/msi-mag-272qp-qd-oled-x50-review">MSI MAG 272QP QD-OLED X50</a> (500Hz, $749), but it’s still excellent. I didn’t notice any choppiness while playing <a href="https://www.tomsguide.com/reviews/forza-horizon-5">Forza Horizon 5</a> and Counter-Strike 2, and I was comfortably running 100-115fps in the latter. Thanks to the 0.03ms response time — same as on the MSI X36 — I didn’t experience any motion blur or noticeable ghosting either.</p><h2 class="article-body__section" id="section-dell-ultrasharp-u3226q-review-the-downs"><span>Dell UltraSharp U3226Q review: The downs</span></h2><p>The Dell UltraSharp U3226Q doesn’t have many flaws. It’s expensive, and the 4K panel’s brightness is neither the best nor the worst.</p><h2 id="middle-of-the-road-brightness">Middle-of-the-road brightness</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1919px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="Y7Q7e49hboiL5vL3DSEbYP" name="Dell_Ultrasharp32_1" alt="A black Dell UltraSharp U3226Q 4K UHD monitor" src="https://cdn.mos.cms.futurecdn.net/Y7Q7e49hboiL5vL3DSEbYP-1920-80.jpg" mos="" align="middle" fullscreen="" width="1919" 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 Dell UltraSharp U3226Q is neither the brightest nor the dimmest monitor — it does well against some competitors while not performing that formidably against others. In my lab tests, the U3226Q achieved a peak brightness of 295.4 nits in SDR and 425 nits in HDR (10% window size).</p><p>When it comes to both SDR and HDR results, the U3226Q upstages the BenQ PD2732U, the Dell Pro P3426WEV, the <a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2730s-5k-monitor-review">BenQ PD2730S</a> ($1,199) and the <a href="https://www.tomsguide.com/computing/monitors/benq-pd3226g-review">BenQ PD3226G</a> ($1,099), as you can see in the table below. The P3426WEV doesn’t even support HDR, giving the U3226Q a leg-up.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Peak brightness (SDR)</strong></p></th><th  ><p><strong>Peak brightness (10% window size, HDR)</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Dell UltraSharp U3226Q</strong></p></td><td  ><p>295.4</p></td><td  ><p>425</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2732u-review"><strong>BenQ PD2732U</strong></a></p></td><td  ><p>182.6</p></td><td  ><p>184</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/dell-pro-p34-usb-c-hub-webcam-monitor-p3426wev-review"><strong>Dell Pro P3426WEV</strong></a></p></td><td  ><p>284.8</p></td><td  ><p>N/A</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-ma270s-review"><strong>BenQ MA270S</strong></a></p></td><td  ><p>387.4</p></td><td  ><p>272</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-pd3226g-review"><strong>BenQ PD3226G</strong></a></p></td><td  ><p>252.4</p></td><td  ><p>267</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2730s-5k-monitor-review"><strong>BenQ PD2730S</strong></a></p></td><td  ><p>346</p></td><td  ><p>346</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/alogic-edge-40-inch-5k-ultrawide-review"><strong>Alogic Edge 40-inch 5K Ultrawide</strong></a></p></td><td  ><p>417</p></td><td  ><p>216</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/apple-studio-display-xdr-review"><strong>Apple Studio Display XDR</strong></a></p></td><td  ><p>516</p></td><td  ><p>1,727</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/reviews/apple-studio-display"><strong>Apple Studio Display</strong></a></p></td><td  ><p>518</p></td><td  ><p>N/A</p></td></tr></tbody></table></div><p>However, the <a href="https://www.tomsguide.com/computing/monitors/benq-ma270s-review">BenQ MA270S</a> ($999), the <a href="https://www.tomsguide.com/reviews/apple-studio-display">Apple Studio Display</a> ($1,499) and the Apple Studio Display XDR outperform the U3226Q when it comes to Standard Dynamic Range. It isn’t surprising that the Apple Studio Display XDR does this (as it’s more expensive) but it’s disappointing that the U3226Q doesn’t get as bright as the MA270S, which is half the U3226Q’s price.</p><p>I don’t think this is necessarily a dealbreaker as you shouldn’t have your brightness turned all the way up anyway when editing photos, and this is a professional studio monitor after all. In real-world use, I had no problem using this monitor and clearly seeing what was on screen under bright studio lights. Of course, if you want a monitor with a brighter panel, I can’t recommend the MA270S enough.</p><h2 id="ridonculous-price">Ridonculous price</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1919px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="KUkBCpyTUZgajqyANVYJxP" name="Dell_Ultrasharp32_8" alt="A black Dell UltraSharp U3226Q 4K UHD monitor" src="https://cdn.mos.cms.futurecdn.net/KUkBCpyTUZgajqyANVYJxP-1920-80.jpg" mos="" align="middle" fullscreen="" width="1919" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As you’ve seen so far, the Dell UltraSharp U3226Q is not your average monitor, and it packs pro features that make it suitable for professionals… and it’s got a price tag to match. The U3226Q doesn’t come cheap. It has a retail price of <a href="https://www.bhphotovideo.com/c/product/1944478-REG/dell_ultrasharp_qd_oled_u3226q_32.html" target="_blank" rel="nofollow">$2,499 at B&H Photo</a> / <a href="https://www.dell.com/en-uk/shop/dell-ultrasharp-32-4k-qd-oled-monitor-u3226q/apd/210-bvcp/monitors-monitor-accessories" target="_blank" rel="nofollow">£2,404 at Dell U.K.</a>, making it one of the most expensive monitors I’ve tested so far.</p><p>This makes the U3226Q more expensive than some of the other productivity- and photography-focused monitors I’ve tested, like the BenQ MA270S ($999), the BenQ PD2732U ($799), the Dell Pro P3426WEV ($749) and the <a href="https://www.tomsguide.com/computing/monitors/alogic-edge-40-inch-5k-ultrawide-review">Alogic Edge 40-inch 5K Ultrawide</a> ($1,499). The U3226Q is slightly cheaper than the Apple Studio Display XDR ($3,499), though, if that’s any consolation.</p><h2 class="article-body__section" id="section-dell-ultrasharp-u3226q-review-verdict"><span>Dell UltraSharp U3226Q review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.20%;"><img id="HTzX9qUBydaVCHk46wLHmP" name="Dell_Ultrasharp32_5" alt="A black Dell UltraSharp U3226Q 4K UHD monitor" src="https://cdn.mos.cms.futurecdn.net/HTzX9qUBydaVCHk46wLHmP-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1079" 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 professional photographers, colorists and editors, the Dell UltraSharp U3226Q checks nearly every box. Stupendous color accuracy and coverage, self-calibration, a stunning QD-OLED display, and more ports than you could ask for make it a winner. For casual gamers, there’s a 120Hz refresh rate and response time of 0.03ms, too, so what more could you want?</p><p>You’re paying a premium for all the pro features, though, and the U3226Q costs $2,500. While it’s a lot, I think the U3226Q does plenty to justify it. The built-in colorimeter for self-calibration ensures color accuracy over time, thereby increasing the monitor’s lifespan. At the end of the day, the U3226Q is <em>the </em>monitor for professionals, and it’s the display I’d personally buy.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just tested the Turtle Beach Command Series KB5 — it’s a decent gaming keyboard but I’d love it more if it wasn’t for these flaws ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The <a href="https://www.tomsguide.com/best-picks/best-gaming-keyboard">best gaming keyboards</a> have come leaps and bounds in recent years, and the Turtle Beach Command Series KB5 hopes to join the ranks. Packing highly responsive linear switches, 8,000Hz polling, and features like ReacTap in a sturdy, aluminum body, the KB5 is a formidable performer. It’s great to type on, too, and it features a handy touchscreen for on-the-go customization.</p><p>But is that enough to be considered one of the best in 2026, when the competition is so fierce? The KB5 is competent but its flaws are difficult to overlook when it costs nearly $150. It’s wired only; it isn’t hot-swappable; and its touchscreen can be sluggish. Of course, if none of those matter to you, and you’ve got the cash, the KB5 is still an okay choice for gaming and productivity.</p><p>For the complete breakdown, read my full Turtle Beach Command Series KB5 review.</p><h2 class="article-body__section" id="section-turtle-beach-command-series-kb5-review-specs"><span>Turtle Beach Command Series KB5 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Turtle-Beach-Full-Sized-Mechanical-Keyboard/dp/B0GWCW4GX2/" target="_blank" rel="nofollow">$149</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Mechanical-Touchscreen-Low-Profile/dp/B0GXZW5BX3/" target="_blank" rel="nofollow">£139</a></p></td></tr><tr><td class="firstcol " ><p><strong>Switches</strong></p></td><td  ><p>Titan low-profile mechanical (linear)</p></td></tr><tr><td class="firstcol " ><p><strong>Keycaps</strong></p></td><td  ><p>Double-shot PBT</p></td></tr><tr><td class="firstcol " ><p><strong>Construction</strong></p></td><td  ><p>Aluminum + ABS plastic</p></td></tr><tr><td class="firstcol " ><p><strong>Mount</strong></p></td><td  ><p>Gasket</p></td></tr><tr><td class="firstcol " ><p><strong>Layout</strong></p></td><td  ><p>100%, 109 keys + 2.4-inch touchscreen</p></td></tr><tr><td class="firstcol " ><p><strong>Operating system</strong></p></td><td  ><p>macOS, Windows</p></td></tr><tr><td class="firstcol " ><p><strong>Backlighting</strong></p></td><td  ><p>Per-key RGB</p></td></tr><tr><td class="firstcol " ><p><strong>Polling rate</strong></p></td><td  ><p>8,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>1</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wired</p></td></tr><tr><td class="firstcol " ><p><strong>Measurements</strong></p></td><td  ><p>18.78 x 10.12 x 1.06 inches (with palm rest)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>2.43lbs (with palm rest)</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-turtle-beach-command-series-kb5-review-cheat-sheet"><span>Turtle Beach Command Series KB5 review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A full-size mechanical keyboard with a customizable touchscreen</li><li><strong>Who is it for? </strong>Gamers and typists alike</li><li><strong>How much does it cost?</strong> The Turtle Beach Command Series KB5 is available for <a href="https://www.amazon.com/Turtle-Beach-Full-Sized-Mechanical-Keyboard/dp/B0GWCW4GX2/" target="_blank" rel="nofollow">$149</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Mechanical-Touchscreen-Low-Profile/dp/B0GXZW5BX3/" target="_blank" rel="nofollow">£139</a></li><li><strong>What do we like? </strong>The sturdy build, 8KHz polling for gaming, responsive switches, and customizable touchscreen</li><li><strong>What don’t we like? </strong>The wired-only and non-hot-swappable design, sometimes sluggish touchscreen, and hefty price tag</li></ul><h2 class="article-body__section" id="section-turtle-beach-command-series-kb5-review-the-ups"><span>Turtle Beach Command Series KB5 review: The ups</span></h2><p>The Turtle Beach Command Series KB5 is well-built and it’s a joy to type on. 8,000Hz polling and ReacTap make it great for gaming, and the customizable touchscreen lets you make changes on the fly.</p><h2 id="sturdy-construction">Sturdy construction</h2><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="rSnJhT63ahsCQHkYRkf3eZ" name="Turtlebeach_KB7_ 12.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/rSnJhT63ahsCQHkYRkf3eZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The KB5 is part of Turtle Beach’s Command Series, so it shares a lot of similarities with the <a href="https://www.tomsguide.com/computing/keyboards/turtle-beach-command-series-kb7-tkl-review">KB7 TKL</a> ($199) — one of them being the sturdy construction. Just like the KB7 TKL, the KB5 is made of an anodized aluminum top plate and a plastic chassis. There’s no flex in the body and no rattling. The aluminum plate gives the keyboard some heft too, as the KB5 weighs 2.43lbs (with the included palm rest). Though a little heavy, the KB5 is nowhere near as gargantuan as some of Keychron’s all-metal keyboards, like the <a href="https://www.tomsguide.com/computing/peripherals/keychron-q65-max-review">Q65 Max</a> (5.33lbs, $209) and the <a href="https://www.tomsguide.com/computing/keyboards/keychron-q3-ultra-8k-review">Q3 Ultra 8K</a> (3.9lbs, $229).</p><p>As a full-size 100% keyboard, the KB5 has a large desk footprint too, measuring 18.78 x 10.12 x 1.06 inches (with palm rest), so it’s best suited to staying put at your desk. Given its length, the KB5 didn’t fit into my day bag. The keyboard’s wired-only nature may make you reluctant to travel with it anyway.</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="rQjzigPm2uYKVqLbAgdgkZ" name="Turtlebeach_KB7_ 8.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/rQjzigPm2uYKVqLbAgdgkZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Adding to the KB5’s appeal are its double-shot PBT keycaps which are more resistant to oil, wear and tear compared to their ABS counterparts. It’s nice to see Turtle Beach do away with the ABS keycaps its <a href="https://www.tomsguide.com/computing/keyboards/turtle-beach-vulcan-ii-max-review">Vulcan II Max</a> ($229) uses — they get <em>very </em>shiny with fingerprints.</p><p>I also like the notched clickable volume barrel located right above the first four Function keys. You can use this to adjust the volume and mute playback (or remap it completely in Swarm II). Rolling its barrel is what I’d imagine the thrust lever on an airplane would feel like.</p><h2 id="excellent-for-typing">Excellent for typing</h2><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="rMtEgDNLFJ48mcaM5AZTnZ" name="Turtlebeach_KB7_ 11.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/rMtEgDNLFJ48mcaM5AZTnZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Though the Turtle Beach Command Series KB5 is primarily a gaming keyboard, it’s a sheer delight to type on. While its clacky, hollow sound profile is nothing to write home about, it still offers an enjoyable typing experience. Its Titan low-profile mechanical switches have a pre-travel distance of 1.2mm (total 3.1mm) which means that they don’t need to be pressed all the way down to activate. This helps you type faster, and even after a full day’s worth of typing, my fingers and hands didn’t feel fatigued.</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Keyboard</strong></p></th><th  ><p><strong>Type test speed (WPM)</strong></p></th><th  ><p><strong>Type test accuracy</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p>Turtle Beach Command Series KB5</p></td><td  ><p>108</p></td><td  ><p>97%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/keyboards/mchose-k99-v2-review">MCHOSE K99 V2</a></p></td><td  ><p>98</p></td><td  ><p>91%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/peripherals/mchose-x75-v2-keyboard-review">MCHOSE X75 V2</a></p></td><td  ><p>94</p></td><td  ><p>95.37%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/peripherals/epomaker-rt100-review">Epomaker RT100 Pro</a></p></td><td  ><p>96</p></td><td  ><p>94.1%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/keyboards/iqunix-mq80-review">IQUNIX MQ80</a></p></td><td  ><p>95</p></td><td  ><p>92.8%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-review">Epomaker Glyph</a></p></td><td  ><p>109</p></td><td  ><p>93.2%</p></td></tr><tr><td class="firstcol " ><p>Nikita’s rolling averages (all keyboards)</p></td><td  ><p>92.84</p></td><td  ><p>91.25%</p></td></tr></tbody></table></div><p>I put the KB5 through its paces by taking a typing test at <a href="http://10fastfingers.com" target="_blank">10fastfingers.com</a> as soon as I unboxed the keyboard. I wasn’t expecting to type as fast as I did, because the KB5 isn’t marketed as a productivity deck, and yet, I was able to achieve 108 words per minute with 97% accuracy. The keyboard upstaged all but one deck when it came to sheer speed: the <a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-review">Epomaker Glyph</a> ($139). Color me impressed!</p><h2 id="8-000hz-polling-and-reactap">8,000Hz polling and ReacTap</h2><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="dzRYRKS2Z92qRVQpQ8YLkZ" name="Turtlebeach_KB7_ 10.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/dzRYRKS2Z92qRVQpQ8YLkZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Turtle Beach Command Series KB5’s biggest selling point is its 8,000Hz polling rate. Though impressive, 8KHz polling is overkill for 99% of gamers, and is an unnecessary drain on system resources. For most gamers, including myself, 1KHz polling is more than sufficient. You won’t notice latency issues or input lag regardless.</p><p>Still, I tested the KB5’s 8KHz polling by playing Counter-Strike 2 and <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a> on the <a href="https://www.tomsguide.com/computing/gaming-laptops/alienware-16x-aurora-review">Alienware 16X Aurora</a>. As predicted, there were no latency issues to make a big song and dance about. All of my commands were promptly registered. I found the Titan low-profile linear switches extremely responsive too, and their 1.3mm pre-travel distance meant that I could lightly tap one key after another to execute a series of actions in quick succession.</p><p>You can also enable ReacTap by tapping the screen’s left edge and swiping left. ReacTap is Turtle Beach’s term for Last Key Prioritization (LKP), and it’s a type of Simultaneous Opposite Key Detection (SOCD) resolution. As you can probably tell by the name, it prioritizes the last key pressed, and I primarily use it for counter-strafing. Basically, if you hold down A and press D, the LKP resolution overrides A and instantly registers D (or vice versa). Doing so results in an immediate end to movement and therefore accuracy penalties in titles that have inertia in their movement mechanics, like Counter-Strike 2 (where LKP will get you kicked) and Valorant.</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:2010px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="AZBC6A5DarGhgSqUqpir2P" name="1000013631" alt="Turtle Beach Command Series KB5's touchscreen" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:88,l:269,cw:2010,ch:1131,q:80/AZBC6A5DarGhgSqUqpir2P.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>The KB5 features five dedicated macro keys too, located on the keyboard’s left-hand side. These can be configured to execute commands with just the tap of a button. You can use these to launch another program, record the last 30 seconds of gameplay, what-have-you. Four different commands can be bound to each key, and these layers can be accessed via key combinations, such as holding down Caps Lock / Easy Shift [+].</p><p>These macro keys are useful in both gaming and productivity, and you can assign work- or game-specific commands and save them to five customizable profiles.</p><h2 id="built-in-touchscreen-for-on-the-fly-customization">Built-in touchscreen for on-the-fly customization</h2><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="zocSEXEgoS7w5Zni4adkmZ" name="Turtlebeach_KB7_ 7.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/zocSEXEgoS7w5Zni4adkmZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>LCD and even OLED screens are becoming more and more common on keyboards. We’ve seen them on the likes of the <a href="https://www.tomsguide.com/computing/peripherals/razer-blackwidow-v4-pro-75-percent-review">Razer BlackWidow V4 Pro</a> ($189), the <a href="https://www.tomsguide.com/computing/keyboards/epomaker-rt100-pro-review">Epomaker RT100 Pro</a> ($119), and now the Turtle Beach Command Series KB5. Unlike the large 4.3-inch touchscreen on the Turtle Beach Command Series KB7 TKL, the KB5’s 2.4-inch is much smaller but useful nonetheless.</p><p>The KB5’s touchscreen enables you to make adjustments to the keyboard’s settings on the fly and without having to launch Swarm II every time. You can use it to record macros, swap between five profiles, launch apps, manage audio playback, and more. Annoyingly, though, you can’t adjust the polling rate via the screen itself, and this can be done via Swarm II only.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/XsC3bU8BmS5RWJvcBGZYRe-1920-80.jpg" alt="Turtle Beach Swarm II screenshot" /><figcaption><small role="credit">Turtle Beach / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/j9XZ2kvXev3839ZJacp8Ne-1920-80.jpg" alt="Turtle Beach Swarm II screenshot" /><figcaption><small role="credit">Turtle Beach / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/59J2G9nCvAH7nhXbeT3TLe-1920-80.jpg" alt="Turtle Beach Swarm II screenshot" /><figcaption><small role="credit">Turtle Beach / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/GkW9Gpy674gcVyGWh7fYHe-1920-80.jpg" alt="Turtle Beach Swarm II screenshot" /><figcaption><small role="credit">Turtle Beach / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ffKyByfJkwg6ASzpkThXBe-1920-80.jpg" alt="Turtle Beach Swarm II screenshot" /><figcaption><small role="credit">Turtle Beach / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/NjoUKHhs53EJJujth4AS5e-1920-80.jpg" alt="Turtle Beach Swarm II screenshot" /><figcaption><small role="credit">Turtle Beach / Tom's Guide</small></figcaption></figure></figure><p>The touchscreen’s layout can be changed, too, and you’ll need to download the user-friendly Swarm II in order to do so. Via the Windows-only software (sorry, macOS users), you can add your preferred widgets to the screen, or select a preset template (productivity- or gaming-focused). If you play a lot of Counter-Strike, you might like the ‘KB5 CS’ preset, which displays stats like equipped weapon, bullets remaining, and total kills. </p><h2 class="article-body__section" id="section-turtle-beach-command-series-kb5-review-the-downs"><span>Turtle Beach Command Series KB5 review: The downs</span></h2><p>The Turtle Beach Command Series KB5 isn’t hot-swappable, can’t be used wirelessly, and its touchscreen can be finicky at times, so is it worth the premium? I’m not convinced.</p><h2 id="sluggish-touchscreen">Sluggish touchscreen</h2><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="oWjhbMyCZLbxnFkcUGrBkZ" name="Turtlebeach_KB7_ 5.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/oWjhbMyCZLbxnFkcUGrBkZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While the Turtle Beach Command Series KB5’s touchscreen is useful and behaves well for the most part, I found it sluggish at times. In my testing, I found that the touchscreen would randomly freeze and get stuck on one page, and I also noticed that my commands weren’t always registered. I had to tap a couple of times to get the touchscreen to skip the song I was listening to, for instance. Yes, even after updating the keyboard’s firmware, these issues didn’t magically disappear.</p><h2 id="wired-only">Wired-only</h2><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="t8fLDWp2nbVa8HjGWShMhZ" name="Turtlebeach_KB7_ 23.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/t8fLDWp2nbVa8HjGWShMhZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Sadly, the Turtle Beach Command Series KB5 is a wired-only keyboard so there’s no Bluetooth wireless connectivity. That also means the keyboard is designed to stay put at your desk. This isn’t necessarily a flaw but it’s disappointing given that so many mechanical keyboards today <em>are </em>wireless. This becomes an even bigger problem when you realize how expensive the KB5 is (more on that in a second).</p><p>If you want a wireless mechanical keyboard with 8,000Hz polling, I’d recommend the Keychron V1 Ultra 8K which features high polling over both wired and wireless connections. However, as I said earlier, 8,000Hz polling is overkill for most people anyway.</p><h2 id="not-hot-swappable">Not hot-swappable</h2><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="2JvrthQmGg75okaBQwQDnZ" name="Turtlebeach_KB7_ 9.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/2JvrthQmGg75okaBQwQDnZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Okay, so the Turtle Beach Command Series KB5 is wired-only. Big deal. But my biggest gripe with the keyboard is that its switches aren’t hot-swappable. I find that surprising in 2026, when most keyboards (especially in this price range) <em>are </em>hot-swappable. Because the KB5 isn’t, you can’t change its switches by simply popping them out — you’ll need to de- and re-solder them to the PCB which is not only time-consuming, but it requires specialist tools and skill, too.</p><p>This means that if, say, one switch stops working, you’ll have to take the entire keyboard apart. I also feel like if you’re spending short of $150 on a keyboard, the least you should expect is hot-swappable switches. If this irks you as much as it does me, I’d again recommend the Keychron V1 Ultra 8K, the <a href="https://www.tomsguide.com/computing/peripherals/keychron-c1-pro-8k-review">Keychron C1 Pro 8K</a> ($54) or the Razer BlackWidow V4 Pro (which does enough to justify its $189 price tag).</p><h2 id="expensive-for-what-you-get">Expensive for what 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:960px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oWjhbMyCZLbxnFkcUGrBkZ" name="Turtlebeach_KB7_ 5.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:388,l:0,cw:960,ch:540,q:80/oWjhbMyCZLbxnFkcUGrBkZ.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 brings me to my last argument: the Turtle Beach Command Series KB5’s price tag. The keyboard retails for <a href="https://www.amazon.com/Turtle-Beach-Full-Sized-Mechanical-Keyboard/dp/B0GWCW4GX2/" target="_blank" rel="nofollow">$149</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Mechanical-Touchscreen-Low-Profile/dp/B0GXZW5BX3/" target="_blank" rel="nofollow">£139 at Amazon</a>, which is quite steep given that the keyboard is wired-only and isn’t hot-swappable. Its touchscreen, though useful, can be sluggish and is also heavily reliant on Swarm II, which isn’t available on macOS. </p><p>When brands like Epomaker and Keychron continue making powerful keyboards for a fraction of the KB5’s price, Turtle Beach’s offering is a hard sell. The Keychron V1 Ultra 8K, the Keychron C1 Pro 8K, and the <a href="https://www.tomsguide.com/computing/keyboards/epomaker-p65-review">Epomaker P65</a> ($119) are much easier to recommend. Heck, even some outstanding Hall Effect decks, like the <a href="https://www.tomsguide.com/computing/peripherals/epomaker-he68-hall-effect-keyboard-review">Epomaker HE68</a> ($59), offer exceptional value for money while being cheaper than the KB5.</p><h2 class="article-body__section" id="section-turtle-beach-command-series-kb5-review-verdict"><span>Turtle Beach Command Series KB5 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="a4NMzgStLdNkLLAYXFfLkY" name="Turtlebeach_KB7_ 4.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/a4NMzgStLdNkLLAYXFfLkY-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Turtle Beach Command Series KB5 isn’t a <em>bad </em>keyboard — quite the opposite in fact. It boasts strong gaming performance thanks to features like 8,000Hz polling and ReacTap. It’s good for typing, too, and it’s fitted with a responsive touchscreen that lets you make adjustments on the go.</p><p>At the end of the day, though, are those features enough to justify the $150 asking price? The KB5, though well-built and capable, isn’t hot-swappable, and when its competitors are offering 8KHz polling over wireless connections, the KB5’s wired-only design leaves a lot to be desired. The sluggish touchscreen is frustrating at this price point, too. You’d be better off with the Keychron V1 8K, if it’s a bang-for-your-buck mechanical deck you’re after.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/keyboards/turtle-beach-command-series-kb5-review</link>
                                                                            <description>
                            <![CDATA[ The Turtle Beach Command Series KB5 is a good productivity and gaming keyboard with 8KHz polling and ReacTap, but at $150, its flaws are hard to overlook. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">prqiiujh3amBdnPzBb5Pbd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/oWjhbMyCZLbxnFkcUGrBkZ-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 11 Sep 2026 12:08:15 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Keyboards]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></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-320-70.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.&lt;/p&gt;&lt;p&gt;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/oWjhbMyCZLbxnFkcUGrBkZ-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming]]></media:description>                                                            <media:text><![CDATA[A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming]]></media:text>
                                <media:title type="plain"><![CDATA[A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/oWjhbMyCZLbxnFkcUGrBkZ-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/best-picks/best-gaming-keyboard">best gaming keyboards</a> have come leaps and bounds in recent years, and the Turtle Beach Command Series KB5 hopes to join the ranks. Packing highly responsive linear switches, 8,000Hz polling, and features like ReacTap in a sturdy, aluminum body, the KB5 is a formidable performer. It’s great to type on, too, and it features a handy touchscreen for on-the-go customization.</p><p>But is that enough to be considered one of the best in 2026, when the competition is so fierce? The KB5 is competent but its flaws are difficult to overlook when it costs nearly $150. It’s wired only; it isn’t hot-swappable; and its touchscreen can be sluggish. Of course, if none of those matter to you, and you’ve got the cash, the KB5 is still an okay choice for gaming and productivity.</p><p>For the complete breakdown, read my full Turtle Beach Command Series KB5 review.</p><h2 class="article-body__section" id="section-turtle-beach-command-series-kb5-review-specs"><span>Turtle Beach Command Series KB5 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Turtle-Beach-Full-Sized-Mechanical-Keyboard/dp/B0GWCW4GX2/" target="_blank" rel="nofollow">$149</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Mechanical-Touchscreen-Low-Profile/dp/B0GXZW5BX3/" target="_blank" rel="nofollow">£139</a></p></td></tr><tr><td class="firstcol " ><p><strong>Switches</strong></p></td><td  ><p>Titan low-profile mechanical (linear)</p></td></tr><tr><td class="firstcol " ><p><strong>Keycaps</strong></p></td><td  ><p>Double-shot PBT</p></td></tr><tr><td class="firstcol " ><p><strong>Construction</strong></p></td><td  ><p>Aluminum + ABS plastic</p></td></tr><tr><td class="firstcol " ><p><strong>Mount</strong></p></td><td  ><p>Gasket</p></td></tr><tr><td class="firstcol " ><p><strong>Layout</strong></p></td><td  ><p>100%, 109 keys + 2.4-inch touchscreen</p></td></tr><tr><td class="firstcol " ><p><strong>Operating system</strong></p></td><td  ><p>macOS, Windows</p></td></tr><tr><td class="firstcol " ><p><strong>Backlighting</strong></p></td><td  ><p>Per-key RGB</p></td></tr><tr><td class="firstcol " ><p><strong>Polling rate</strong></p></td><td  ><p>8,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>1</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wired</p></td></tr><tr><td class="firstcol " ><p><strong>Measurements</strong></p></td><td  ><p>18.78 x 10.12 x 1.06 inches (with palm rest)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>2.43lbs (with palm rest)</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-turtle-beach-command-series-kb5-review-cheat-sheet"><span>Turtle Beach Command Series KB5 review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A full-size mechanical keyboard with a customizable touchscreen</li><li><strong>Who is it for? </strong>Gamers and typists alike</li><li><strong>How much does it cost?</strong> The Turtle Beach Command Series KB5 is available for <a href="https://www.amazon.com/Turtle-Beach-Full-Sized-Mechanical-Keyboard/dp/B0GWCW4GX2/" target="_blank" rel="nofollow">$149</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Mechanical-Touchscreen-Low-Profile/dp/B0GXZW5BX3/" target="_blank" rel="nofollow">£139</a></li><li><strong>What do we like? </strong>The sturdy build, 8KHz polling for gaming, responsive switches, and customizable touchscreen</li><li><strong>What don’t we like? </strong>The wired-only and non-hot-swappable design, sometimes sluggish touchscreen, and hefty price tag</li></ul><h2 class="article-body__section" id="section-turtle-beach-command-series-kb5-review-the-ups"><span>Turtle Beach Command Series KB5 review: The ups</span></h2><p>The Turtle Beach Command Series KB5 is well-built and it’s a joy to type on. 8,000Hz polling and ReacTap make it great for gaming, and the customizable touchscreen lets you make changes on the fly.</p><h2 id="sturdy-construction">Sturdy construction</h2><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="rSnJhT63ahsCQHkYRkf3eZ" name="Turtlebeach_KB7_ 12.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/rSnJhT63ahsCQHkYRkf3eZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The KB5 is part of Turtle Beach’s Command Series, so it shares a lot of similarities with the <a href="https://www.tomsguide.com/computing/keyboards/turtle-beach-command-series-kb7-tkl-review">KB7 TKL</a> ($199) — one of them being the sturdy construction. Just like the KB7 TKL, the KB5 is made of an anodized aluminum top plate and a plastic chassis. There’s no flex in the body and no rattling. The aluminum plate gives the keyboard some heft too, as the KB5 weighs 2.43lbs (with the included palm rest). Though a little heavy, the KB5 is nowhere near as gargantuan as some of Keychron’s all-metal keyboards, like the <a href="https://www.tomsguide.com/computing/peripherals/keychron-q65-max-review">Q65 Max</a> (5.33lbs, $209) and the <a href="https://www.tomsguide.com/computing/keyboards/keychron-q3-ultra-8k-review">Q3 Ultra 8K</a> (3.9lbs, $229).</p><p>As a full-size 100% keyboard, the KB5 has a large desk footprint too, measuring 18.78 x 10.12 x 1.06 inches (with palm rest), so it’s best suited to staying put at your desk. Given its length, the KB5 didn’t fit into my day bag. The keyboard’s wired-only nature may make you reluctant to travel with it anyway.</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="rQjzigPm2uYKVqLbAgdgkZ" name="Turtlebeach_KB7_ 8.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/rQjzigPm2uYKVqLbAgdgkZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Adding to the KB5’s appeal are its double-shot PBT keycaps which are more resistant to oil, wear and tear compared to their ABS counterparts. It’s nice to see Turtle Beach do away with the ABS keycaps its <a href="https://www.tomsguide.com/computing/keyboards/turtle-beach-vulcan-ii-max-review">Vulcan II Max</a> ($229) uses — they get <em>very </em>shiny with fingerprints.</p><p>I also like the notched clickable volume barrel located right above the first four Function keys. You can use this to adjust the volume and mute playback (or remap it completely in Swarm II). Rolling its barrel is what I’d imagine the thrust lever on an airplane would feel like.</p><h2 id="excellent-for-typing">Excellent for typing</h2><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="rMtEgDNLFJ48mcaM5AZTnZ" name="Turtlebeach_KB7_ 11.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/rMtEgDNLFJ48mcaM5AZTnZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Though the Turtle Beach Command Series KB5 is primarily a gaming keyboard, it’s a sheer delight to type on. While its clacky, hollow sound profile is nothing to write home about, it still offers an enjoyable typing experience. Its Titan low-profile mechanical switches have a pre-travel distance of 1.2mm (total 3.1mm) which means that they don’t need to be pressed all the way down to activate. This helps you type faster, and even after a full day’s worth of typing, my fingers and hands didn’t feel fatigued.</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Keyboard</strong></p></th><th  ><p><strong>Type test speed (WPM)</strong></p></th><th  ><p><strong>Type test accuracy</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p>Turtle Beach Command Series KB5</p></td><td  ><p>108</p></td><td  ><p>97%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/keyboards/mchose-k99-v2-review">MCHOSE K99 V2</a></p></td><td  ><p>98</p></td><td  ><p>91%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/peripherals/mchose-x75-v2-keyboard-review">MCHOSE X75 V2</a></p></td><td  ><p>94</p></td><td  ><p>95.37%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/peripherals/epomaker-rt100-review">Epomaker RT100 Pro</a></p></td><td  ><p>96</p></td><td  ><p>94.1%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/keyboards/iqunix-mq80-review">IQUNIX MQ80</a></p></td><td  ><p>95</p></td><td  ><p>92.8%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-review">Epomaker Glyph</a></p></td><td  ><p>109</p></td><td  ><p>93.2%</p></td></tr><tr><td class="firstcol " ><p>Nikita’s rolling averages (all keyboards)</p></td><td  ><p>92.84</p></td><td  ><p>91.25%</p></td></tr></tbody></table></div><p>I put the KB5 through its paces by taking a typing test at <a href="http://10fastfingers.com" target="_blank">10fastfingers.com</a> as soon as I unboxed the keyboard. I wasn’t expecting to type as fast as I did, because the KB5 isn’t marketed as a productivity deck, and yet, I was able to achieve 108 words per minute with 97% accuracy. The keyboard upstaged all but one deck when it came to sheer speed: the <a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-review">Epomaker Glyph</a> ($139). Color me impressed!</p><h2 id="8-000hz-polling-and-reactap">8,000Hz polling and ReacTap</h2><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="dzRYRKS2Z92qRVQpQ8YLkZ" name="Turtlebeach_KB7_ 10.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/dzRYRKS2Z92qRVQpQ8YLkZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Turtle Beach Command Series KB5’s biggest selling point is its 8,000Hz polling rate. Though impressive, 8KHz polling is overkill for 99% of gamers, and is an unnecessary drain on system resources. For most gamers, including myself, 1KHz polling is more than sufficient. You won’t notice latency issues or input lag regardless.</p><p>Still, I tested the KB5’s 8KHz polling by playing Counter-Strike 2 and <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a> on the <a href="https://www.tomsguide.com/computing/gaming-laptops/alienware-16x-aurora-review">Alienware 16X Aurora</a>. As predicted, there were no latency issues to make a big song and dance about. All of my commands were promptly registered. I found the Titan low-profile linear switches extremely responsive too, and their 1.3mm pre-travel distance meant that I could lightly tap one key after another to execute a series of actions in quick succession.</p><p>You can also enable ReacTap by tapping the screen’s left edge and swiping left. ReacTap is Turtle Beach’s term for Last Key Prioritization (LKP), and it’s a type of Simultaneous Opposite Key Detection (SOCD) resolution. As you can probably tell by the name, it prioritizes the last key pressed, and I primarily use it for counter-strafing. Basically, if you hold down A and press D, the LKP resolution overrides A and instantly registers D (or vice versa). Doing so results in an immediate end to movement and therefore accuracy penalties in titles that have inertia in their movement mechanics, like Counter-Strike 2 (where LKP will get you kicked) and Valorant.</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:2010px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="AZBC6A5DarGhgSqUqpir2P" name="1000013631" alt="Turtle Beach Command Series KB5's touchscreen" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:88,l:269,cw:2010,ch:1131,q:80/AZBC6A5DarGhgSqUqpir2P.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>The KB5 features five dedicated macro keys too, located on the keyboard’s left-hand side. These can be configured to execute commands with just the tap of a button. You can use these to launch another program, record the last 30 seconds of gameplay, what-have-you. Four different commands can be bound to each key, and these layers can be accessed via key combinations, such as holding down Caps Lock / Easy Shift [+].</p><p>These macro keys are useful in both gaming and productivity, and you can assign work- or game-specific commands and save them to five customizable profiles.</p><h2 id="built-in-touchscreen-for-on-the-fly-customization">Built-in touchscreen for on-the-fly customization</h2><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="zocSEXEgoS7w5Zni4adkmZ" name="Turtlebeach_KB7_ 7.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/zocSEXEgoS7w5Zni4adkmZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>LCD and even OLED screens are becoming more and more common on keyboards. We’ve seen them on the likes of the <a href="https://www.tomsguide.com/computing/peripherals/razer-blackwidow-v4-pro-75-percent-review">Razer BlackWidow V4 Pro</a> ($189), the <a href="https://www.tomsguide.com/computing/keyboards/epomaker-rt100-pro-review">Epomaker RT100 Pro</a> ($119), and now the Turtle Beach Command Series KB5. Unlike the large 4.3-inch touchscreen on the Turtle Beach Command Series KB7 TKL, the KB5’s 2.4-inch is much smaller but useful nonetheless.</p><p>The KB5’s touchscreen enables you to make adjustments to the keyboard’s settings on the fly and without having to launch Swarm II every time. You can use it to record macros, swap between five profiles, launch apps, manage audio playback, and more. Annoyingly, though, you can’t adjust the polling rate via the screen itself, and this can be done via Swarm II only.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/XsC3bU8BmS5RWJvcBGZYRe-1920-80.jpg" alt="Turtle Beach Swarm II screenshot" /><figcaption><small role="credit">Turtle Beach / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/j9XZ2kvXev3839ZJacp8Ne-1920-80.jpg" alt="Turtle Beach Swarm II screenshot" /><figcaption><small role="credit">Turtle Beach / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/59J2G9nCvAH7nhXbeT3TLe-1920-80.jpg" alt="Turtle Beach Swarm II screenshot" /><figcaption><small role="credit">Turtle Beach / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/GkW9Gpy674gcVyGWh7fYHe-1920-80.jpg" alt="Turtle Beach Swarm II screenshot" /><figcaption><small role="credit">Turtle Beach / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ffKyByfJkwg6ASzpkThXBe-1920-80.jpg" alt="Turtle Beach Swarm II screenshot" /><figcaption><small role="credit">Turtle Beach / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/NjoUKHhs53EJJujth4AS5e-1920-80.jpg" alt="Turtle Beach Swarm II screenshot" /><figcaption><small role="credit">Turtle Beach / Tom's Guide</small></figcaption></figure></figure><p>The touchscreen’s layout can be changed, too, and you’ll need to download the user-friendly Swarm II in order to do so. Via the Windows-only software (sorry, macOS users), you can add your preferred widgets to the screen, or select a preset template (productivity- or gaming-focused). If you play a lot of Counter-Strike, you might like the ‘KB5 CS’ preset, which displays stats like equipped weapon, bullets remaining, and total kills. </p><h2 class="article-body__section" id="section-turtle-beach-command-series-kb5-review-the-downs"><span>Turtle Beach Command Series KB5 review: The downs</span></h2><p>The Turtle Beach Command Series KB5 isn’t hot-swappable, can’t be used wirelessly, and its touchscreen can be finicky at times, so is it worth the premium? I’m not convinced.</p><h2 id="sluggish-touchscreen">Sluggish touchscreen</h2><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="oWjhbMyCZLbxnFkcUGrBkZ" name="Turtlebeach_KB7_ 5.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/oWjhbMyCZLbxnFkcUGrBkZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While the Turtle Beach Command Series KB5’s touchscreen is useful and behaves well for the most part, I found it sluggish at times. In my testing, I found that the touchscreen would randomly freeze and get stuck on one page, and I also noticed that my commands weren’t always registered. I had to tap a couple of times to get the touchscreen to skip the song I was listening to, for instance. Yes, even after updating the keyboard’s firmware, these issues didn’t magically disappear.</p><h2 id="wired-only">Wired-only</h2><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="t8fLDWp2nbVa8HjGWShMhZ" name="Turtlebeach_KB7_ 23.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/t8fLDWp2nbVa8HjGWShMhZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Sadly, the Turtle Beach Command Series KB5 is a wired-only keyboard so there’s no Bluetooth wireless connectivity. That also means the keyboard is designed to stay put at your desk. This isn’t necessarily a flaw but it’s disappointing given that so many mechanical keyboards today <em>are </em>wireless. This becomes an even bigger problem when you realize how expensive the KB5 is (more on that in a second).</p><p>If you want a wireless mechanical keyboard with 8,000Hz polling, I’d recommend the Keychron V1 Ultra 8K which features high polling over both wired and wireless connections. However, as I said earlier, 8,000Hz polling is overkill for most people anyway.</p><h2 id="not-hot-swappable">Not hot-swappable</h2><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="2JvrthQmGg75okaBQwQDnZ" name="Turtlebeach_KB7_ 9.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/2JvrthQmGg75okaBQwQDnZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Okay, so the Turtle Beach Command Series KB5 is wired-only. Big deal. But my biggest gripe with the keyboard is that its switches aren’t hot-swappable. I find that surprising in 2026, when most keyboards (especially in this price range) <em>are </em>hot-swappable. Because the KB5 isn’t, you can’t change its switches by simply popping them out — you’ll need to de- and re-solder them to the PCB which is not only time-consuming, but it requires specialist tools and skill, too.</p><p>This means that if, say, one switch stops working, you’ll have to take the entire keyboard apart. I also feel like if you’re spending short of $150 on a keyboard, the least you should expect is hot-swappable switches. If this irks you as much as it does me, I’d again recommend the Keychron V1 Ultra 8K, the <a href="https://www.tomsguide.com/computing/peripherals/keychron-c1-pro-8k-review">Keychron C1 Pro 8K</a> ($54) or the Razer BlackWidow V4 Pro (which does enough to justify its $189 price tag).</p><h2 id="expensive-for-what-you-get">Expensive for what 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:960px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oWjhbMyCZLbxnFkcUGrBkZ" name="Turtlebeach_KB7_ 5.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:388,l:0,cw:960,ch:540,q:80/oWjhbMyCZLbxnFkcUGrBkZ.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 brings me to my last argument: the Turtle Beach Command Series KB5’s price tag. The keyboard retails for <a href="https://www.amazon.com/Turtle-Beach-Full-Sized-Mechanical-Keyboard/dp/B0GWCW4GX2/" target="_blank" rel="nofollow">$149</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Mechanical-Touchscreen-Low-Profile/dp/B0GXZW5BX3/" target="_blank" rel="nofollow">£139 at Amazon</a>, which is quite steep given that the keyboard is wired-only and isn’t hot-swappable. Its touchscreen, though useful, can be sluggish and is also heavily reliant on Swarm II, which isn’t available on macOS. </p><p>When brands like Epomaker and Keychron continue making powerful keyboards for a fraction of the KB5’s price, Turtle Beach’s offering is a hard sell. The Keychron V1 Ultra 8K, the Keychron C1 Pro 8K, and the <a href="https://www.tomsguide.com/computing/keyboards/epomaker-p65-review">Epomaker P65</a> ($119) are much easier to recommend. Heck, even some outstanding Hall Effect decks, like the <a href="https://www.tomsguide.com/computing/peripherals/epomaker-he68-hall-effect-keyboard-review">Epomaker HE68</a> ($59), offer exceptional value for money while being cheaper than the KB5.</p><h2 class="article-body__section" id="section-turtle-beach-command-series-kb5-review-verdict"><span>Turtle Beach Command Series KB5 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="a4NMzgStLdNkLLAYXFfLkY" name="Turtlebeach_KB7_ 4.JPG" alt="A Turtle Beach Command Series KB5 wired-only mechanical keyboard for gaming" src="https://cdn.mos.cms.futurecdn.net/a4NMzgStLdNkLLAYXFfLkY-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Turtle Beach Command Series KB5 isn’t a <em>bad </em>keyboard — quite the opposite in fact. It boasts strong gaming performance thanks to features like 8,000Hz polling and ReacTap. It’s good for typing, too, and it’s fitted with a responsive touchscreen that lets you make adjustments on the go.</p><p>At the end of the day, though, are those features enough to justify the $150 asking price? The KB5, though well-built and capable, isn’t hot-swappable, and when its competitors are offering 8KHz polling over wireless connections, the KB5’s wired-only design leaves a lot to be desired. The sluggish touchscreen is frustrating at this price point, too. You’d be better off with the Keychron V1 8K, if it’s a bang-for-your-buck mechanical deck you’re after.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I ran Counter-Strike at 600fps to test out Sony’s elite esports monitor — here’s my verdict ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Sony’s elite esports gaming monitor just got, well, even more elite. The Inzone M10S II succeeds (you guessed it) the original M10S — a monitor I know well. I attended the original M10S launch at Gamescom 2024, where I spoke with the Fnatic esports team, who were heavily involved in its design, and the Sony engineers who brought Fnatic’s requests to life.</p><p>The new model shares the same core objectives as its predecessor: to provide professional esports gamers, or those aspiring to be one, with everything they need. As such, the core formula remains largely unchanged: blazing refresh and response rates; an array of features tailored entirely to esports; all combined with Sony’s premium design.</p><p>This time, refresh rates have been boosted in QHD and FHD modes; there’s a new anti-glare coating and a brightness boost, at least on paper. So, is this the <a href="https://www.tomsguide.com/us/best-gaming-monitors,review-3114.html"><u>best gaming monitor</u></a> for elite players? Find out in my full Sony Inzone M10S II review.</p><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-cheat-sheet"><span>Sony Inzone M10S II review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>An elite esports gaming monitor</li><li><strong>Who is it for? </strong>Pro esports gamers, or those aspiring to be</li><li><strong>What does it cost? </strong><a href="https://electronics.sony.com/tv-video/gaming-monitors/all-inzone-monitors/p/sdm27q102-b" target="_blank" rel="nofollow">$1,099</a> / <a href="https://www.amazon.co.uk/Sony-INZONE-M10S-Gaming-Monitor/dp/B0GVJFDTB3/" target="_blank" rel="nofollow">£1,199</a></li><li><strong>What do we like? </strong>Be-all, end-all gaming performance and features; premium and thoughtful design</li><li><strong>What don’t we like? </strong>Not the brightest compared to other OLED monitors; USB-A and -B ports only</li></ul><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-specs"><span>Sony Inzone M10S II review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://electronics.sony.com/tv-video/gaming-monitors/all-inzone-monitors/p/sdm27q102-b" target="_blank" rel="nofollow">$1,099</a> / <a href="https://www.amazon.co.uk/Sony-INZONE-M10S-Gaming-Monitor/dp/B0GVJFDTB3/" target="_blank" rel="nofollow">£1,199</a></p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>27-inch</p></td></tr><tr><td class="firstcol " ><p><strong>Resolution</strong></p></td><td  ><p>2560 x 1440</p></td></tr><tr><td class="firstcol " ><p><strong>Aspect ratio</strong></p></td><td  ><p>16:9</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>540Hz (QHD); 720Hz (HD)</p></td></tr><tr><td class="firstcol " ><p><strong>Response time</strong></p></td><td  ><p>0.02ms</p></td></tr><tr><td class="firstcol " ><p><strong>Panel type</strong></p></td><td  ><p>OLED</p></td></tr><tr><td class="firstcol " ><p><strong>Color depth</strong></p></td><td  ><p>10-bit</p></td></tr><tr><td class="firstcol " ><p><strong>Inputs</strong></p></td><td  ><p>DisplayPort 2.1; 2x HDMI 2.1; 1x USB Type-B upstream; 2x USB Type-A downstream; 1x USB Type-A (software update only); 3.5mm jack</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>23.8 x 19.8 x 7.8 inches (with stand)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>13.67 lbs (with stand)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-the-ups"><span>Sony Inzone M10S II review: The ups</span></h2><p>The M10S II has one job: to be the ultimate gaming monitor for esports players. With its impressive specs and an extensive array of performance and quality-of-life features, it succeeds. And as a Sony product, it boasts premium looks and a high-quality build.</p><h2 id="ultra-fast-performance">Ultra-fast performance</h2><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="dgELH7YWCoEkHwQJffwJaZ" name="Sony_M10S2_ 2.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/dgELH7YWCoEkHwQJffwJaZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide reviews gaming platform</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Supplied by: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/" target="_blank" rel="nofollow"><strong>MSI</strong></a><strong> | Tom's Guide</strong><br><strong></strong><br><strong>CPU:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/AMD-7700X-16-Thread-Unlocked-Processor/dp/B0BBHHT8LY/" target="_blank" rel="nofollow">AMD Ryzen 7 7700X</a><strong> </strong>|<strong> Graphics card:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Graphics-Card/GeForce-RTX-5070-Ti-16G-VANGUARD-SOC" target="_blank" rel="nofollow">MSI RTX 5070 Ti 16GB Vanguard SOC</a><strong> </strong>|<strong> Motherboard: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/Motherboard/B850-GAMING-PLUS-WIFI" target="_blank" rel="nofollow">MSI B850E Gaming Plus WiFi</a><strong> </strong>|<strong> RAM: </strong><a data-analytics-id="inline-link" href="https://www.newegg.com/kingston-technology-corp-fury-renegade-32gb-ddr5-8000-cas-latency-cl38-desktop-memory-silver-black/p/N82E16820242829" target="_blank" rel="nofollow">Kingston Fury Renegade DDR5 32GB</a><strong> </strong>|<strong> Cooler:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/Noctua-NH-U12S-chromax-Black-Single-Tower-Cooler/dp/B07Y88BNYZ" target="_blank">Noctua NH-U12S</a><strong> </strong>|<strong> PSU:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Power-Supply/MEG-Ai1300P-PCIE5" target="_blank" rel="nofollow">MSI MEG Ai1300P PCIE5</a><strong> </strong>|<strong> Case: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/PC-Case/MPG-GUNGNIR-110R" target="_blank" rel="nofollow">MSI MPG GUNGNIR 110R</a></p></div></div><p>The M10S II packs so many gaming features that I’ll have to break them up. First, I’ll cover the hardware side of things. And <em>that</em> refresh rate! With 540Hz in QHD mode and up to 720Hz when dropping to 720p (HD), this monitor is absolutely rapid, relaying enemy movement as accurately as possible, with no motion blur or lag.</p><p>With an ultra low response time of 0.02ms gtg (gray to gray, which means how fast the pixels can change color), plus Sony’s Motion Blur Reduction, ghosting is effectively removed. There’s also G-Sync to remove tearing, especially in situations with rapidly changing frame rates. All this means the enemy you’re shooting at is more likely to be exactly where you’re seeing it, and you aren’t shooting its ghost trail or some other artefact.</p><p>I’m not an esports pro, of course, but playing Counter-Strike 2 at 600fps was a smooth experience — though not particularly enjoyable at 720p. Our TG testing rig couldn’t hit the maximum 720fps, even with Counter-Strike set to low and running at 720p, but topping out at 600fps was still pretty cool. At 1440p with Counter-Strike on high settings, our testing rig still hit around 400fps.</p><p>The original M10S looks like a tortoise in comparison, topping out at <em><strong>only</strong></em> 480Hz and a <em><strong>mere</strong></em> 0.03ms response time. Our favorite high-refresh-rate monitor (up to now), the <a href="https://www.tomsguide.com/computing/monitors/msi-mag-272qp-qd-oled-x50-review"><u>MSI MAG 272QP QD-OLED X50</u></a> ($749), manages <em><strong>just</strong></em> 500Hz.</p><h2 id="plethora-of-gaming-features">Plethora of gaming features</h2><p>The M10S II also offers a comprehensive array of gaming features designed to suit elite gamers — like the Fnatic team. There’s a 24.5-inch tournament crop for competition practice, and two FPS modes, FPS Pro (which simulates an LCD) and FPS Pro+, which adjust contrast ratios to make enemy detection easier, especially in dimly lit game scenarios. I especially enjoyed using FPS Pro when playing Hell Let Loose, particularly on darker nighttime maps, as it lifted the blacks a little to help me spot enemies hiding in bushes.</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="S4SAwUmha8JfVBRu7TriZa" name="Sony_M10S2_ 5.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/S4SAwUmha8JfVBRu7TriZa-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Those aren’t the only game modes, though, as there’s a specific MOBA/RTS mode, as well as a general game mode for casual play.</p><p>There’s also an on-screen crosshair with a variety of crosshair types to choose from. I found this really handy in Counter-Strike 2, where many guns have no ADS mode and the in-game crosshair expands and contracts with movement and movement penalties. It was also super useful in Hell Let Loose, as it allowed me to more accurately fire from the hip and score reflex kills on enemies popping up from bushes or around corners, which I might otherwise have missed.</p><p>On that note, there’s also a black equalizer mode to brighten shadows without affecting lighter areas of the screen. This is handy if you’re already in a game-specific mode and only want to boost shadows, or if affecting highlights would hamper your performance.</p><h2 id="plus-some-useful-qol-features">Plus some useful QoL features</h2><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="6ZRAudYR7PuyXrwbVscXiZ" name="Sony_M10S2_ 3.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/6ZRAudYR7PuyXrwbVscXiZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I also appreciate some of the quality-of-life (QoL) features found in the M10S range. The M10S II, like its predecessor, is designed with setup flexibility as a key consideration, and plenty of attention has been paid to the details.</p><p>In particular, there’s the stand. The M10S II features the same cantilevered stand as its predecessor. I actually spoke to the engineer who designed this stand at the original M10S press briefing — the stand was his passion project because he was trying to solve an issue he had with monitors. The cantilever channels all the weight into the center for perfect balance, allowing Sony to keep the base small.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/EmMsEVzXmWDZwR9XjPvFYF-1920-80.jpg" alt="A keyboard about to be slid over the M10S II's base stand" /><figcaption>Before!<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/xD4knPrxjzJpq95fLuAYTF-1920-80.jpg" alt="A keyboard over the M10S II's base stand" /><figcaption>After!<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/AmxfvLVC93t7jNrUE2ZFaF-1920-80.jpg" alt="The Sony M10S II's cable tidy" /><figcaption>And the cable tidy doing its job admirably.<small role="credit">Future</small></figcaption></figure></figure><p>The M10S II is therefore much easier to position than many other monitors. The M10S II replaced my <a href="https://www.tomsguide.com/computing/monitors/lenovo-legion-r27qe-gen-2-review"><u>Lenovo Legion R27qe Gen 2</u></a> (£199, U.K. only), with its enormous tripod stand — with the Sony, my desk felt so much more spacious and open, and for once I had room for other products I was testing. The base is also extremely thin, deliberately designed so you can slide your keyboard over it and keep your desk tidy when not in use. The arm swivels, so you can adjust the monitor's rotation without having to pick up and move the whole assembly. And there's a neat cable tidy to, well, keep your cables tidy!</p><p>I’m also a big fan of the anti-glare coating on the screen. I work with a window behind me in the office, along with overhead lighting. I was able to game and work on the M10S II for hours without eye strain or headaches.</p><h2 id="accurate-color-rendition">Accurate color rendition</h2><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="s2sHA2gKHAZTa69V3Et8Ha" name="Sony_M10S2_ 4.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/s2sHA2gKHAZTa69V3Et8Ha-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While the M10S II isn’t a production monitor, it’s still important that the panel reproduces color accurately. Thankfully, the M10S II does! As you can see in our lab test results below, the M10S II achieved a Delta-E score of 0.26. This score measures how closely the on-screen color matches the color sent to the display by the computer, and the lower the better.</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Product name</strong></p></th><th  ><p><strong>Panel type</strong></p></th><th  ><p><strong>Delta E</strong></p></th><th  ><p><strong>sRGB volume</strong></p></th><th  ><p><strong>DCI P3 volume</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Sony Inzone M10S II</strong></p></td><td  ><p>OLED</p></td><td  ><p>0.26</p></td><td  ><p>185.80%</p></td><td  ><p>131.60%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/msi-mpg-272urx-qd-oled-monitor-review"><strong>MSI MPG 272URX QD-OLED</strong></a></p></td><td  ><p>OLED</p></td><td  ><p>0.15</p></td><td  ><p>131%</p></td><td  ><p>97%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/lenovo-legion-pro-34wd-10-oled-review"><strong>Lenovo Legion Pro 34WD10</strong></a></p></td><td  ><p>OLED</p></td><td  ><p>0.08</p></td><td  ><p>156.40%</p></td><td  ><p>110.80%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/alienware-aw2725q-gaming-monitor-review"><strong>Alienware AW2725Q</strong></a></p></td><td  ><p>QD-OLED</p></td><td  ><p>0.06</p></td><td  ><p>182.50%</p></td><td  ><p>129.30%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/msi-mag-272qp-qd-oled-x50-review"><strong>MSI MAG 272 QP QD-OLED X50</strong></a></p></td><td  ><p>OLED</p></td><td  ><p>0.11</p></td><td  ><p>192.90%</p></td><td  ><p>136.70%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/msi-mpg-341cqr-qd-oled-x36-review"><strong>MSI MPG 341CQR QD-OLED X36</strong></a></p></td><td  ><p>QD-OLED</p></td><td  ><p>0.15</p></td><td  ><p>166.30%</p></td><td  ><p>117.80%</p></td></tr></tbody></table></div><p>A 0.26 Delta-E isn’t as good as some of the other gaming monitors we’ve tested, such as the Alienware AW2525HM, MSI MAG 272 QP, or MSI MPG 341CQR QD-OLED X36. But it’s still fairly respectable, and it means the colors you’re seeing on screen are rendered accurately.</p><p>The M10S II also covers both the sRGB and DCI-P3 color gamuts. What does that mean? Games are mastered in sRGB for SDR and in DCI-P3 for HDR, so the M10S II can reproduce every unique color in every game you play.</p><p>Now, an ultra-wide gamut can cause oversaturation in those spaces, resulting in an unnatural, neon effect. So, more technically isn’t always better. But while colors appear very bold and vivid on the M10S II, they didn’t feel overdone. And besides, there are sRGB and Cinema (for DCI-P3) color modes if you want to ensure strict accuracy to those gamuts.</p><h2 id="sony-s-typically-premium-design">Sony’s typically premium design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TKK6c4T63tdmtZJU3kNfba" name="Sony_M10S2_ 8.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/TKK6c4T63tdmtZJU3kNfba-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Unsurprisingly, as this is a Sony product, the M10S II is built extremely well. The monitor looks and feels premium, with high-quality materials used throughout.</p><p>The rear of the display is finished in textured metal rather than plastic. The stand and base are also made from metal and feel extremely sturdy. It simply feels built to last, and there’s a three-year warranty to back it up anyway.</p><h2 id="arguably-good-value">Arguably good value</h2><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="LarUzNpMtjrLRDAFWrQmuZ" name="Sony_M10S2_ 6.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/LarUzNpMtjrLRDAFWrQmuZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This might sound a little odd given that the M10S II costs <a href="https://electronics.sony.com/tv-video/gaming-monitors/all-inzone-monitors/p/sdm27q102-b" target="_blank" rel="nofollow"><u>$1,099</u></a> / <a href="https://www.amazon.co.uk/Sony-INZONE-M10S-Gaming-Monitor/dp/B0GVJFDTB3/" target="_blank" rel="nofollow"><u>£1,199</u></a>, but I’d argue it’s fairly good value. It’s not uncommon for gaming monitors to push well beyond the $1,000 mark. The <a href="https://www.tomsguide.com/computing/monitors/lenovo-legion-pro-34wd-10-oled-review"><u>Lenovo Legion Pro 34WD-10 OLED</u></a>, for example, launched at $1,099. The <a href="https://www.tomsguide.com/reviews/samsung-odyssey-oled-g9"><u>Samsung Odyssey OLED G9</u></a>, meanwhile, launched at $1,799.</p><p>I know: those are ultrawides, and their prices have dropped since launch. But what I mean here is that the M10S II isn’t priced beyond the pale. And yet it offers superb performance for elite gamers. If you’re one of those people, the M10S II could make strong financial and competitive sense.</p><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-the-downs"><span>Sony Inzone M10S II review: The downs</span></h2><p>The Inzone M10S II doesn’t have many faults. However, it’s not the brightest OLED we’ve lab tested, and the USB ports on the underside are pretty dated.</p><h2 id="not-the-brightest">Not the brightest</h2><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="HZwVkRiBJBLqzXttnbMSga" name="Sony_M10S2_ 7.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/HZwVkRiBJBLqzXttnbMSga-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>We don’t like to rely on manufacturer claims, which are often best-case scenarios and can be a tad (to say the least) unrealistic. As such, as part of our lab testing process, we also measure peak SDR and HDR brightness.</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Product name</strong></p></th><th  ><p><strong>Panel type</strong></p></th><th  ><p><strong>Nits (HDR, at 10%)</strong></p></th><th  ><p><strong>Nits (SDR)</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Sony Inzone M10S II</strong></p></td><td  ><p>OLED</p></td><td  ><p>146 </p></td><td  ><p>231</p></td></tr><tr><td class="firstcol " ><p><strong>MSI MPG 272URX QD-OLED</strong></p></td><td  ><p>OLED</p></td><td  ><p>449 </p></td><td  ><p>254</p></td></tr><tr><td class="firstcol " ><p><strong>Lenovo Legion Pro 34WD10</strong></p></td><td  ><p>OLED</p></td><td  ><p>443</p></td><td  ><p>265</p></td></tr><tr><td class="firstcol " ><p><strong>Alienware AW2725Q</strong></p></td><td  ><p>QD-OLED</p></td><td  ><p>334</p></td><td  ><p>250 </p></td></tr><tr><td class="firstcol " ><p><strong>MSI MAG 272 QP</strong></p></td><td  ><p>OLED</p></td><td  ><p>284 </p></td><td  ><p>289</p></td></tr><tr><td class="firstcol " ><p><strong>MSI MPG 341CQR QD-OLED X36</strong></p></td><td  ><p>QD-OLED</p></td><td  ><p>413</p></td><td  ><p>280</p></td></tr></tbody></table></div><p>As you can see in the test results, the M10S II isn’t as bright as other OLED gaming panels we’ve tested and is well below the (rather ambitious) 1,500-nit peak brightness claimed by Sony.</p><p>Still, when you think about it, this monitor’s primary purpose is to be used in a dark room. And besides, figures alone don’t always tell the full story, and I certainly wouldn’t let our measured peak brightness put you off buying this monitor. I’ve had no issues using it in bright environments, largely thanks to the anti-glare coating. And I never struggled with darker in-game scenarios, thanks to the different color modes and black point equalizer.</p><h2 id="dated-usb-ports">Dated USB ports</h2><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="QMNtiWvm7wPDH9KhHvZa3a" name="Sony_M10S2_ 9.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/QMNtiWvm7wPDH9KhHvZa3a-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>My only other gripe with the M10S II is that it uses fairly dated ports, at least when it comes to USB (with HDMI 2.1 and DisplayPort 2.1, the video ports are just fine). There are two USB-A downstream ports and a USB-B upstream port. These are outdated, and it would’ve been nice to see at least a USB-C port or two.</p><p>Again, it’s important to remember use cases here. I’m not going to complain about the lack of a Thunderbolt port or KVM controller on a monitor that isn’t designed for productivity, but come on, it’s 2026… how can Sony fit a Type-B but not a single Type-C?</p><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-verdict"><span>Sony Inzone M10S II review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xdncXHJiq6rPWsCo2R3LFa" name="Sony_M10S2_.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/xdncXHJiq6rPWsCo2R3LFa-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you want the fastest and most feature-packed gaming monitor around, especially if you’re an elite competitive player or aspiring pro, I wholeheartedly recommend the Sony Inzone M10S II.</p><p>Its flaws are very few and fairly minor. What’s more, it not only delivers blazing-fast hardware performance but also a huge roster of genuinely useful gaming tools and thoughtful quality-of-life features! Then there’s Sony’s usual build quality and a fairly reasonable price tag, all things considered. I’m genuinely rather sad to be giving it back to Sony!</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/monitors/sony-inzone-m10s-ii-review</link>
                                                                            <description>
                            <![CDATA[ The Sony Inzone M10S II is ultra fast, built beautifully and packs plenty of gaming features. Its flaws are few, although it isn't the brightest. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JbAH7NarBmT6NbfUPdwVZR</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/xdncXHJiq6rPWsCo2R3LFa-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 11 Sep 2026 12:02:35 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Monitors]]></category>
                                                    <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Computing Hardware]]></category>
                                                    <category><![CDATA[Gaming]]></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-320-70.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/xdncXHJiq6rPWsCo2R3LFa-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Sony Inzone M10S II against a blue gradient background]]></media:description>                                                            <media:text><![CDATA[The Sony Inzone M10S II against a blue gradient background]]></media:text>
                                <media:title type="plain"><![CDATA[The Sony Inzone M10S II against a blue gradient background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/xdncXHJiq6rPWsCo2R3LFa-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Sony’s elite esports gaming monitor just got, well, even more elite. The Inzone M10S II succeeds (you guessed it) the original M10S — a monitor I know well. I attended the original M10S launch at Gamescom 2024, where I spoke with the Fnatic esports team, who were heavily involved in its design, and the Sony engineers who brought Fnatic’s requests to life.</p><p>The new model shares the same core objectives as its predecessor: to provide professional esports gamers, or those aspiring to be one, with everything they need. As such, the core formula remains largely unchanged: blazing refresh and response rates; an array of features tailored entirely to esports; all combined with Sony’s premium design.</p><p>This time, refresh rates have been boosted in QHD and FHD modes; there’s a new anti-glare coating and a brightness boost, at least on paper. So, is this the <a href="https://www.tomsguide.com/us/best-gaming-monitors,review-3114.html"><u>best gaming monitor</u></a> for elite players? Find out in my full Sony Inzone M10S II review.</p><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-cheat-sheet"><span>Sony Inzone M10S II review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>An elite esports gaming monitor</li><li><strong>Who is it for? </strong>Pro esports gamers, or those aspiring to be</li><li><strong>What does it cost? </strong><a href="https://electronics.sony.com/tv-video/gaming-monitors/all-inzone-monitors/p/sdm27q102-b" target="_blank" rel="nofollow">$1,099</a> / <a href="https://www.amazon.co.uk/Sony-INZONE-M10S-Gaming-Monitor/dp/B0GVJFDTB3/" target="_blank" rel="nofollow">£1,199</a></li><li><strong>What do we like? </strong>Be-all, end-all gaming performance and features; premium and thoughtful design</li><li><strong>What don’t we like? </strong>Not the brightest compared to other OLED monitors; USB-A and -B ports only</li></ul><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-specs"><span>Sony Inzone M10S II review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://electronics.sony.com/tv-video/gaming-monitors/all-inzone-monitors/p/sdm27q102-b" target="_blank" rel="nofollow">$1,099</a> / <a href="https://www.amazon.co.uk/Sony-INZONE-M10S-Gaming-Monitor/dp/B0GVJFDTB3/" target="_blank" rel="nofollow">£1,199</a></p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>27-inch</p></td></tr><tr><td class="firstcol " ><p><strong>Resolution</strong></p></td><td  ><p>2560 x 1440</p></td></tr><tr><td class="firstcol " ><p><strong>Aspect ratio</strong></p></td><td  ><p>16:9</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>540Hz (QHD); 720Hz (HD)</p></td></tr><tr><td class="firstcol " ><p><strong>Response time</strong></p></td><td  ><p>0.02ms</p></td></tr><tr><td class="firstcol " ><p><strong>Panel type</strong></p></td><td  ><p>OLED</p></td></tr><tr><td class="firstcol " ><p><strong>Color depth</strong></p></td><td  ><p>10-bit</p></td></tr><tr><td class="firstcol " ><p><strong>Inputs</strong></p></td><td  ><p>DisplayPort 2.1; 2x HDMI 2.1; 1x USB Type-B upstream; 2x USB Type-A downstream; 1x USB Type-A (software update only); 3.5mm jack</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>23.8 x 19.8 x 7.8 inches (with stand)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>13.67 lbs (with stand)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-the-ups"><span>Sony Inzone M10S II review: The ups</span></h2><p>The M10S II has one job: to be the ultimate gaming monitor for esports players. With its impressive specs and an extensive array of performance and quality-of-life features, it succeeds. And as a Sony product, it boasts premium looks and a high-quality build.</p><h2 id="ultra-fast-performance">Ultra-fast performance</h2><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="dgELH7YWCoEkHwQJffwJaZ" name="Sony_M10S2_ 2.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/dgELH7YWCoEkHwQJffwJaZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide reviews gaming platform</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Supplied by: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/" target="_blank" rel="nofollow"><strong>MSI</strong></a><strong> | Tom's Guide</strong><br><strong></strong><br><strong>CPU:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/AMD-7700X-16-Thread-Unlocked-Processor/dp/B0BBHHT8LY/" target="_blank" rel="nofollow">AMD Ryzen 7 7700X</a><strong> </strong>|<strong> Graphics card:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Graphics-Card/GeForce-RTX-5070-Ti-16G-VANGUARD-SOC" target="_blank" rel="nofollow">MSI RTX 5070 Ti 16GB Vanguard SOC</a><strong> </strong>|<strong> Motherboard: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/Motherboard/B850-GAMING-PLUS-WIFI" target="_blank" rel="nofollow">MSI B850E Gaming Plus WiFi</a><strong> </strong>|<strong> RAM: </strong><a data-analytics-id="inline-link" href="https://www.newegg.com/kingston-technology-corp-fury-renegade-32gb-ddr5-8000-cas-latency-cl38-desktop-memory-silver-black/p/N82E16820242829" target="_blank" rel="nofollow">Kingston Fury Renegade DDR5 32GB</a><strong> </strong>|<strong> Cooler:</strong> <a data-analytics-id="inline-link" href="https://www.amazon.com/Noctua-NH-U12S-chromax-Black-Single-Tower-Cooler/dp/B07Y88BNYZ" target="_blank">Noctua NH-U12S</a><strong> </strong>|<strong> PSU:</strong> <a data-analytics-id="inline-link" href="https://www.msi.com/Power-Supply/MEG-Ai1300P-PCIE5" target="_blank" rel="nofollow">MSI MEG Ai1300P PCIE5</a><strong> </strong>|<strong> Case: </strong><a data-analytics-id="inline-link" href="https://www.msi.com/PC-Case/MPG-GUNGNIR-110R" target="_blank" rel="nofollow">MSI MPG GUNGNIR 110R</a></p></div></div><p>The M10S II packs so many gaming features that I’ll have to break them up. First, I’ll cover the hardware side of things. And <em>that</em> refresh rate! With 540Hz in QHD mode and up to 720Hz when dropping to 720p (HD), this monitor is absolutely rapid, relaying enemy movement as accurately as possible, with no motion blur or lag.</p><p>With an ultra low response time of 0.02ms gtg (gray to gray, which means how fast the pixels can change color), plus Sony’s Motion Blur Reduction, ghosting is effectively removed. There’s also G-Sync to remove tearing, especially in situations with rapidly changing frame rates. All this means the enemy you’re shooting at is more likely to be exactly where you’re seeing it, and you aren’t shooting its ghost trail or some other artefact.</p><p>I’m not an esports pro, of course, but playing Counter-Strike 2 at 600fps was a smooth experience — though not particularly enjoyable at 720p. Our TG testing rig couldn’t hit the maximum 720fps, even with Counter-Strike set to low and running at 720p, but topping out at 600fps was still pretty cool. At 1440p with Counter-Strike on high settings, our testing rig still hit around 400fps.</p><p>The original M10S looks like a tortoise in comparison, topping out at <em><strong>only</strong></em> 480Hz and a <em><strong>mere</strong></em> 0.03ms response time. Our favorite high-refresh-rate monitor (up to now), the <a href="https://www.tomsguide.com/computing/monitors/msi-mag-272qp-qd-oled-x50-review"><u>MSI MAG 272QP QD-OLED X50</u></a> ($749), manages <em><strong>just</strong></em> 500Hz.</p><h2 id="plethora-of-gaming-features">Plethora of gaming features</h2><p>The M10S II also offers a comprehensive array of gaming features designed to suit elite gamers — like the Fnatic team. There’s a 24.5-inch tournament crop for competition practice, and two FPS modes, FPS Pro (which simulates an LCD) and FPS Pro+, which adjust contrast ratios to make enemy detection easier, especially in dimly lit game scenarios. I especially enjoyed using FPS Pro when playing Hell Let Loose, particularly on darker nighttime maps, as it lifted the blacks a little to help me spot enemies hiding in bushes.</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="S4SAwUmha8JfVBRu7TriZa" name="Sony_M10S2_ 5.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/S4SAwUmha8JfVBRu7TriZa-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Those aren’t the only game modes, though, as there’s a specific MOBA/RTS mode, as well as a general game mode for casual play.</p><p>There’s also an on-screen crosshair with a variety of crosshair types to choose from. I found this really handy in Counter-Strike 2, where many guns have no ADS mode and the in-game crosshair expands and contracts with movement and movement penalties. It was also super useful in Hell Let Loose, as it allowed me to more accurately fire from the hip and score reflex kills on enemies popping up from bushes or around corners, which I might otherwise have missed.</p><p>On that note, there’s also a black equalizer mode to brighten shadows without affecting lighter areas of the screen. This is handy if you’re already in a game-specific mode and only want to boost shadows, or if affecting highlights would hamper your performance.</p><h2 id="plus-some-useful-qol-features">Plus some useful QoL features</h2><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="6ZRAudYR7PuyXrwbVscXiZ" name="Sony_M10S2_ 3.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/6ZRAudYR7PuyXrwbVscXiZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I also appreciate some of the quality-of-life (QoL) features found in the M10S range. The M10S II, like its predecessor, is designed with setup flexibility as a key consideration, and plenty of attention has been paid to the details.</p><p>In particular, there’s the stand. The M10S II features the same cantilevered stand as its predecessor. I actually spoke to the engineer who designed this stand at the original M10S press briefing — the stand was his passion project because he was trying to solve an issue he had with monitors. The cantilever channels all the weight into the center for perfect balance, allowing Sony to keep the base small.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/EmMsEVzXmWDZwR9XjPvFYF-1920-80.jpg" alt="A keyboard about to be slid over the M10S II's base stand" /><figcaption>Before!<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/xD4knPrxjzJpq95fLuAYTF-1920-80.jpg" alt="A keyboard over the M10S II's base stand" /><figcaption>After!<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/AmxfvLVC93t7jNrUE2ZFaF-1920-80.jpg" alt="The Sony M10S II's cable tidy" /><figcaption>And the cable tidy doing its job admirably.<small role="credit">Future</small></figcaption></figure></figure><p>The M10S II is therefore much easier to position than many other monitors. The M10S II replaced my <a href="https://www.tomsguide.com/computing/monitors/lenovo-legion-r27qe-gen-2-review"><u>Lenovo Legion R27qe Gen 2</u></a> (£199, U.K. only), with its enormous tripod stand — with the Sony, my desk felt so much more spacious and open, and for once I had room for other products I was testing. The base is also extremely thin, deliberately designed so you can slide your keyboard over it and keep your desk tidy when not in use. The arm swivels, so you can adjust the monitor's rotation without having to pick up and move the whole assembly. And there's a neat cable tidy to, well, keep your cables tidy!</p><p>I’m also a big fan of the anti-glare coating on the screen. I work with a window behind me in the office, along with overhead lighting. I was able to game and work on the M10S II for hours without eye strain or headaches.</p><h2 id="accurate-color-rendition">Accurate color rendition</h2><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="s2sHA2gKHAZTa69V3Et8Ha" name="Sony_M10S2_ 4.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/s2sHA2gKHAZTa69V3Et8Ha-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While the M10S II isn’t a production monitor, it’s still important that the panel reproduces color accurately. Thankfully, the M10S II does! As you can see in our lab test results below, the M10S II achieved a Delta-E score of 0.26. This score measures how closely the on-screen color matches the color sent to the display by the computer, and the lower the better.</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Product name</strong></p></th><th  ><p><strong>Panel type</strong></p></th><th  ><p><strong>Delta E</strong></p></th><th  ><p><strong>sRGB volume</strong></p></th><th  ><p><strong>DCI P3 volume</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Sony Inzone M10S II</strong></p></td><td  ><p>OLED</p></td><td  ><p>0.26</p></td><td  ><p>185.80%</p></td><td  ><p>131.60%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/msi-mpg-272urx-qd-oled-monitor-review"><strong>MSI MPG 272URX QD-OLED</strong></a></p></td><td  ><p>OLED</p></td><td  ><p>0.15</p></td><td  ><p>131%</p></td><td  ><p>97%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/lenovo-legion-pro-34wd-10-oled-review"><strong>Lenovo Legion Pro 34WD10</strong></a></p></td><td  ><p>OLED</p></td><td  ><p>0.08</p></td><td  ><p>156.40%</p></td><td  ><p>110.80%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/alienware-aw2725q-gaming-monitor-review"><strong>Alienware AW2725Q</strong></a></p></td><td  ><p>QD-OLED</p></td><td  ><p>0.06</p></td><td  ><p>182.50%</p></td><td  ><p>129.30%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/msi-mag-272qp-qd-oled-x50-review"><strong>MSI MAG 272 QP QD-OLED X50</strong></a></p></td><td  ><p>OLED</p></td><td  ><p>0.11</p></td><td  ><p>192.90%</p></td><td  ><p>136.70%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/msi-mpg-341cqr-qd-oled-x36-review"><strong>MSI MPG 341CQR QD-OLED X36</strong></a></p></td><td  ><p>QD-OLED</p></td><td  ><p>0.15</p></td><td  ><p>166.30%</p></td><td  ><p>117.80%</p></td></tr></tbody></table></div><p>A 0.26 Delta-E isn’t as good as some of the other gaming monitors we’ve tested, such as the Alienware AW2525HM, MSI MAG 272 QP, or MSI MPG 341CQR QD-OLED X36. But it’s still fairly respectable, and it means the colors you’re seeing on screen are rendered accurately.</p><p>The M10S II also covers both the sRGB and DCI-P3 color gamuts. What does that mean? Games are mastered in sRGB for SDR and in DCI-P3 for HDR, so the M10S II can reproduce every unique color in every game you play.</p><p>Now, an ultra-wide gamut can cause oversaturation in those spaces, resulting in an unnatural, neon effect. So, more technically isn’t always better. But while colors appear very bold and vivid on the M10S II, they didn’t feel overdone. And besides, there are sRGB and Cinema (for DCI-P3) color modes if you want to ensure strict accuracy to those gamuts.</p><h2 id="sony-s-typically-premium-design">Sony’s typically premium design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TKK6c4T63tdmtZJU3kNfba" name="Sony_M10S2_ 8.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/TKK6c4T63tdmtZJU3kNfba-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Unsurprisingly, as this is a Sony product, the M10S II is built extremely well. The monitor looks and feels premium, with high-quality materials used throughout.</p><p>The rear of the display is finished in textured metal rather than plastic. The stand and base are also made from metal and feel extremely sturdy. It simply feels built to last, and there’s a three-year warranty to back it up anyway.</p><h2 id="arguably-good-value">Arguably good value</h2><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="LarUzNpMtjrLRDAFWrQmuZ" name="Sony_M10S2_ 6.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/LarUzNpMtjrLRDAFWrQmuZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This might sound a little odd given that the M10S II costs <a href="https://electronics.sony.com/tv-video/gaming-monitors/all-inzone-monitors/p/sdm27q102-b" target="_blank" rel="nofollow"><u>$1,099</u></a> / <a href="https://www.amazon.co.uk/Sony-INZONE-M10S-Gaming-Monitor/dp/B0GVJFDTB3/" target="_blank" rel="nofollow"><u>£1,199</u></a>, but I’d argue it’s fairly good value. It’s not uncommon for gaming monitors to push well beyond the $1,000 mark. The <a href="https://www.tomsguide.com/computing/monitors/lenovo-legion-pro-34wd-10-oled-review"><u>Lenovo Legion Pro 34WD-10 OLED</u></a>, for example, launched at $1,099. The <a href="https://www.tomsguide.com/reviews/samsung-odyssey-oled-g9"><u>Samsung Odyssey OLED G9</u></a>, meanwhile, launched at $1,799.</p><p>I know: those are ultrawides, and their prices have dropped since launch. But what I mean here is that the M10S II isn’t priced beyond the pale. And yet it offers superb performance for elite gamers. If you’re one of those people, the M10S II could make strong financial and competitive sense.</p><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-the-downs"><span>Sony Inzone M10S II review: The downs</span></h2><p>The Inzone M10S II doesn’t have many faults. However, it’s not the brightest OLED we’ve lab tested, and the USB ports on the underside are pretty dated.</p><h2 id="not-the-brightest">Not the brightest</h2><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="HZwVkRiBJBLqzXttnbMSga" name="Sony_M10S2_ 7.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/HZwVkRiBJBLqzXttnbMSga-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>We don’t like to rely on manufacturer claims, which are often best-case scenarios and can be a tad (to say the least) unrealistic. As such, as part of our lab testing process, we also measure peak SDR and HDR brightness.</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Product name</strong></p></th><th  ><p><strong>Panel type</strong></p></th><th  ><p><strong>Nits (HDR, at 10%)</strong></p></th><th  ><p><strong>Nits (SDR)</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Sony Inzone M10S II</strong></p></td><td  ><p>OLED</p></td><td  ><p>146 </p></td><td  ><p>231</p></td></tr><tr><td class="firstcol " ><p><strong>MSI MPG 272URX QD-OLED</strong></p></td><td  ><p>OLED</p></td><td  ><p>449 </p></td><td  ><p>254</p></td></tr><tr><td class="firstcol " ><p><strong>Lenovo Legion Pro 34WD10</strong></p></td><td  ><p>OLED</p></td><td  ><p>443</p></td><td  ><p>265</p></td></tr><tr><td class="firstcol " ><p><strong>Alienware AW2725Q</strong></p></td><td  ><p>QD-OLED</p></td><td  ><p>334</p></td><td  ><p>250 </p></td></tr><tr><td class="firstcol " ><p><strong>MSI MAG 272 QP</strong></p></td><td  ><p>OLED</p></td><td  ><p>284 </p></td><td  ><p>289</p></td></tr><tr><td class="firstcol " ><p><strong>MSI MPG 341CQR QD-OLED X36</strong></p></td><td  ><p>QD-OLED</p></td><td  ><p>413</p></td><td  ><p>280</p></td></tr></tbody></table></div><p>As you can see in the test results, the M10S II isn’t as bright as other OLED gaming panels we’ve tested and is well below the (rather ambitious) 1,500-nit peak brightness claimed by Sony.</p><p>Still, when you think about it, this monitor’s primary purpose is to be used in a dark room. And besides, figures alone don’t always tell the full story, and I certainly wouldn’t let our measured peak brightness put you off buying this monitor. I’ve had no issues using it in bright environments, largely thanks to the anti-glare coating. And I never struggled with darker in-game scenarios, thanks to the different color modes and black point equalizer.</p><h2 id="dated-usb-ports">Dated USB ports</h2><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="QMNtiWvm7wPDH9KhHvZa3a" name="Sony_M10S2_ 9.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/QMNtiWvm7wPDH9KhHvZa3a-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>My only other gripe with the M10S II is that it uses fairly dated ports, at least when it comes to USB (with HDMI 2.1 and DisplayPort 2.1, the video ports are just fine). There are two USB-A downstream ports and a USB-B upstream port. These are outdated, and it would’ve been nice to see at least a USB-C port or two.</p><p>Again, it’s important to remember use cases here. I’m not going to complain about the lack of a Thunderbolt port or KVM controller on a monitor that isn’t designed for productivity, but come on, it’s 2026… how can Sony fit a Type-B but not a single Type-C?</p><h2 class="article-body__section" id="section-sony-inzone-m10s-ii-review-verdict"><span>Sony Inzone M10S II review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xdncXHJiq6rPWsCo2R3LFa" name="Sony_M10S2_.JPG" alt="The Sony Inzone M10S II against a blue gradient background" src="https://cdn.mos.cms.futurecdn.net/xdncXHJiq6rPWsCo2R3LFa-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you want the fastest and most feature-packed gaming monitor around, especially if you’re an elite competitive player or aspiring pro, I wholeheartedly recommend the Sony Inzone M10S II.</p><p>Its flaws are very few and fairly minor. What’s more, it not only delivers blazing-fast hardware performance but also a huge roster of genuinely useful gaming tools and thoughtful quality-of-life features! Then there’s Sony’s usual build quality and a fairly reasonable price tag, all things considered. I’m genuinely rather sad to be giving it back to Sony!</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tried the RayNeo GT Max, and they're easily the most comfortable AR glasses I've worn yet ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Donning a pair of AR glasses lets you carry a massive virtual screen anywhere you go, and after trying the new RayNeo GT Max, I could easily see myself wearing them for hours.</p><p>I’ve been wearing a pair of the <a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">best smart glasses</a> from both Xreal and Viture while traveling and at home for almost a year now. Doing so has made a huge difference, as I no longer need to haul a portable monitor around when I want a larger display. However, after wearing them for hours at a time, comfort always becomes an issue.</p><p>After trying RayNeo’s new GT Max AR glasses at <a href="https://www.tomsguide.com/tech-events/best-of-ifa-2026-we-found-the-26-top-new-gadgets">IFA 2026</a>, I was completely taken aback by just how comfortable they were. At 78 grams, they’re not the lightest on paper — the <a href="https://www.tomsguide.com/computing/smart-glasses/viture-pro-2-xr-glasses-review">Viture Pro 2</a> at 63 grams still wins there — but by ditching the traditional birdbath optical design, they don’t feel front-heavy on your face at all.</p><p>Here’s what it was like trying out the RayNeo GT Max, and why they might be the perfect display glasses for long sessions.</p><div class="product"><a data-dimension112="af359510-ad52-11f1-b555-63ad9091ea50" data-action="Deal Block" data-label="GT Max" data-dimension48="GT Max" data-dimension25="$399" href="https://www.amazon.com/RayNeo-Glasses-Native-3DoF-Audio/dp/B0H8725ZZR" 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:50.47%;"><img id="NqtV8yEUtjtbGckSJceudU" name="51XVTZbmFFL._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NqtV8yEUtjtbGckSJceudU-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="757" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The RayNeo GT Max AR glasses deliver a massive virtual display experience powered by innovative prism optics that shift weight away from your nose bridge. Packed with dedicated onboard 3DoF tracking, Bang & Olufsen spatial audio, and an ultra-wide 59-degree field of view, they offer incredible comfort for long sessions.<a class="view-deal button" href="https://www.amazon.com/RayNeo-Glasses-Native-3DoF-Audio/dp/B0H8725ZZR" target="_blank" rel="nofollow" data-dimension112="af359510-ad52-11f1-b555-63ad9091ea50" data-action="Deal Block" data-label="GT Max" data-dimension48="GT Max" data-dimension25="$399">View Deal</a></p></div><h2 id="curved-in-all-the-right-places">Curved in all the right places</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JUaXSGMhWu2ZNFGLUP98Si" name="RayNeo-GT-Max-2" alt="A close-up shot of the right side of the RayNeo GT Max AR glasses" src="https://cdn.mos.cms.futurecdn.net/JUaXSGMhWu2ZNFGLUP98Si-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>With a launch price of $399, the RayNeo GT Max are somewhat more expensive than budget options like the $299 Viture Pro 2 or the $299 <a href="https://www.tomsguide.com/computing/smart-glasses/x-by-xreal-a01-plus-review">Xreal XBX a01</a>, but you’re getting a lot of premium features you often have to pay extra for.</p><p>For instance, you get built-in three Degrees of Freedom thanks to their dedicated Zone 360 3DoF Chip. As such, the glasses track rotational movement like pitch (tilting up and down), yaw (swiveling left and right), and roll (tilting side to side). This lets you pin the GT Max’s screen in place or set it to follow your line of sight as you move around. There’s also a Steady mode that follows you with a slight delay, which I found to be much more comfortable — especially if you’re prone to motion sickness while wearing one of the <a href="https://www.tomsguide.com/best-picks/best-vr-headsets">best VR headsets</a>.</p><p>Just like with other AR glasses, you get built-in audio on the GT Max. Tuned by Bang & Olufsen, the four-speaker system delivered great sound during my time wearing them. However, RayNeo also includes Whisper Mode 2.0 for low-volume private listening. There’s even an optional accessory called Sound Tubes that clip onto the frame to focus the audio straight toward your ears for a more private, headphone-like experience.</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="TWwoq2QTMgfNqZacdBF4am" name="RayNeo-GT-Max-4" alt="An overhead shot showing the Mode Switch button on the RayNeo GT Max  AR glasses" src="https://cdn.mos.cms.futurecdn.net/TWwoq2QTMgfNqZacdBF4am-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While you have dedicated volume and brightness controls on the left temple arm, there’s an orange Mode Button on the right to toggle between spatial tracking modes. Switching between them was fast, and I really liked how clean all of the on-screen menus looked.</p><p>One major element that sets the RayNeo GT Max apart from the competition is its wider field of view. While the Viture Pro 2 and Xreal XBX cap out at 50 degrees, the GT Max pushes all the way up to 59 degrees. Just like their balanced weight distribution, this comes down to their prism architecture. While birdbath optics beam light down off an angled mirror into your eye, prism optics pass light through a solid, thin piece of glass that sits flush against the frame.</p><p>I’ll admit that the optics on the GT Max looked a bit different to me at first, given that all the AR glasses I’ve tried up until now use birdbath setups. However, once I had them on my face and was watching a movie, everything clicked. I didn’t feel the frame weighing down on the bridge of my nose, and they were light enough that I could easily see myself wearing them for long stretches. Of course, I’ll need to get a pair in for testing at home to see how they perform beyond a brief run on the IFA show floor.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OKylGe"></div>                            </div>                            <script src="https://kwizly.com/embed/OKylGe.js" async></script><h2 id="peering-through-a-prism">Peering through a prism</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FGzDp32yMooeDXKAsFREg4" name="RayNeo-GT-Max-3" alt="A close-up shot of a person wearing the RayNeo GT Max AR glasses and looking through their prism optics" src="https://cdn.mos.cms.futurecdn.net/FGzDp32yMooeDXKAsFREg4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When it comes to AR glasses — or more accurately, display glasses — we’re still very early on in their evolution. In fact, this current wave of consumer-focused glasses didn’t really start hitting the mainstream until around 2022. In the brief time since, we’ve seen dramatically thinner and lighter designs, wider fields of view, and more recently, onboard spatial tracking powered by dedicated chips inside their frames.</p><p>The RayNeo GT Max feels like a standout entry point for anyone looking to get into display glasses. While they are a bit more expensive than some of the other recent budget options, you’re getting a stack of premium features that genuinely elevate the day-to-day experience.</p><p>At the end of the day, if you want to use a pair of glasses like these for more than just watching a movie on a long flight, comfort is king. Having used both the original <a href="https://www.tomsguide.com/computing/vr-ar/viture-pro-xr-glasses-review">Viture Pro</a> glasses and the upgraded Pro 2s, shaving off extra weight makes a world of difference. Yet compared to the GT Max, I was genuinely impressed by how RayNeo’s glasses managed to feel lighter on my face despite technically being heavier on paper.</p><p>If you haven't tried a pair of AR glasses yet, there’s never been a better time to dive in now that we have both solid budget choices and feature-packed premium models to pick from. The RayNeo GT Max hits that sweet spot between capability and everyday wearability, and I can’t wait to spend more time testing them out beyond the show floor.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/computing/i-ditched-my-laptop-for-a-pocketable-mini-pc-and-a-pair-of-ar-glasses-heres-what-happened"><strong>I ditched my laptop for a pocketable mini PC and a pair of AR glasses — here’s what happened</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/smart-glasses/i-wore-virtue-and-xreals-new-budget-friendly-ar-glasses-for-a-week-and-this-is-the-pair-id-buy"><strong>I wore Virtue and Xreal's new budget-friendly AR glasses for a week and this is the pair I'd buy</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-the-worlds-first-mobile-game-controller-with-ar-glasses-support-and-it-completely-transformed-my-16-hour-flight"><strong>I tested the world's first mobile game controller with AR glasses support and it completely transformed my 16-hour flight</strong></a><strong></strong></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/smart-glasses/i-tried-the-rayneo-gt-max-and-theyre-easily-the-most-comfortable-ar-glasses-ive-worn-yet</link>
                                                                            <description>
                            <![CDATA[ RayNeo’s new GT Max packs built-in spatial tracking and a wider 59-degree FOV into a pair of AR glasses that cost just slightly more than budget options. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">TYSWZmjUksJ7326T2ujR8h</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/nyXQbsRJrsmo5sKsQ9GPVe-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 11 Sep 2026 11:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smart Glasses]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[VR & AR]]></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-320-70.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;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;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/nyXQbsRJrsmo5sKsQ9GPVe-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A person wearing the RayNeo GT Max AR glasses]]></media:description>                                                            <media:text><![CDATA[A person wearing the RayNeo GT Max AR glasses]]></media:text>
                                <media:title type="plain"><![CDATA[A person wearing the RayNeo GT Max AR glasses]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/nyXQbsRJrsmo5sKsQ9GPVe-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Donning a pair of AR glasses lets you carry a massive virtual screen anywhere you go, and after trying the new RayNeo GT Max, I could easily see myself wearing them for hours.</p><p>I’ve been wearing a pair of the <a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">best smart glasses</a> from both Xreal and Viture while traveling and at home for almost a year now. Doing so has made a huge difference, as I no longer need to haul a portable monitor around when I want a larger display. However, after wearing them for hours at a time, comfort always becomes an issue.</p><p>After trying RayNeo’s new GT Max AR glasses at <a href="https://www.tomsguide.com/tech-events/best-of-ifa-2026-we-found-the-26-top-new-gadgets">IFA 2026</a>, I was completely taken aback by just how comfortable they were. At 78 grams, they’re not the lightest on paper — the <a href="https://www.tomsguide.com/computing/smart-glasses/viture-pro-2-xr-glasses-review">Viture Pro 2</a> at 63 grams still wins there — but by ditching the traditional birdbath optical design, they don’t feel front-heavy on your face at all.</p><p>Here’s what it was like trying out the RayNeo GT Max, and why they might be the perfect display glasses for long sessions.</p><div class="product"><a data-dimension112="af359510-ad52-11f1-b555-63ad9091ea50" data-action="Deal Block" data-label="GT Max" data-dimension48="GT Max" data-dimension25="$399" href="https://www.amazon.com/RayNeo-Glasses-Native-3DoF-Audio/dp/B0H8725ZZR" 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:50.47%;"><img id="NqtV8yEUtjtbGckSJceudU" name="51XVTZbmFFL._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NqtV8yEUtjtbGckSJceudU-1920-80.jpg" mos="" align="middle" fullscreen="" width="1500" height="757" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The RayNeo GT Max AR glasses deliver a massive virtual display experience powered by innovative prism optics that shift weight away from your nose bridge. Packed with dedicated onboard 3DoF tracking, Bang & Olufsen spatial audio, and an ultra-wide 59-degree field of view, they offer incredible comfort for long sessions.<a class="view-deal button" href="https://www.amazon.com/RayNeo-Glasses-Native-3DoF-Audio/dp/B0H8725ZZR" target="_blank" rel="nofollow" data-dimension112="af359510-ad52-11f1-b555-63ad9091ea50" data-action="Deal Block" data-label="GT Max" data-dimension48="GT Max" data-dimension25="$399">View Deal</a></p></div><h2 id="curved-in-all-the-right-places">Curved in all the right places</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JUaXSGMhWu2ZNFGLUP98Si" name="RayNeo-GT-Max-2" alt="A close-up shot of the right side of the RayNeo GT Max AR glasses" src="https://cdn.mos.cms.futurecdn.net/JUaXSGMhWu2ZNFGLUP98Si-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>With a launch price of $399, the RayNeo GT Max are somewhat more expensive than budget options like the $299 Viture Pro 2 or the $299 <a href="https://www.tomsguide.com/computing/smart-glasses/x-by-xreal-a01-plus-review">Xreal XBX a01</a>, but you’re getting a lot of premium features you often have to pay extra for.</p><p>For instance, you get built-in three Degrees of Freedom thanks to their dedicated Zone 360 3DoF Chip. As such, the glasses track rotational movement like pitch (tilting up and down), yaw (swiveling left and right), and roll (tilting side to side). This lets you pin the GT Max’s screen in place or set it to follow your line of sight as you move around. There’s also a Steady mode that follows you with a slight delay, which I found to be much more comfortable — especially if you’re prone to motion sickness while wearing one of the <a href="https://www.tomsguide.com/best-picks/best-vr-headsets">best VR headsets</a>.</p><p>Just like with other AR glasses, you get built-in audio on the GT Max. Tuned by Bang & Olufsen, the four-speaker system delivered great sound during my time wearing them. However, RayNeo also includes Whisper Mode 2.0 for low-volume private listening. There’s even an optional accessory called Sound Tubes that clip onto the frame to focus the audio straight toward your ears for a more private, headphone-like experience.</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="TWwoq2QTMgfNqZacdBF4am" name="RayNeo-GT-Max-4" alt="An overhead shot showing the Mode Switch button on the RayNeo GT Max  AR glasses" src="https://cdn.mos.cms.futurecdn.net/TWwoq2QTMgfNqZacdBF4am-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While you have dedicated volume and brightness controls on the left temple arm, there’s an orange Mode Button on the right to toggle between spatial tracking modes. Switching between them was fast, and I really liked how clean all of the on-screen menus looked.</p><p>One major element that sets the RayNeo GT Max apart from the competition is its wider field of view. While the Viture Pro 2 and Xreal XBX cap out at 50 degrees, the GT Max pushes all the way up to 59 degrees. Just like their balanced weight distribution, this comes down to their prism architecture. While birdbath optics beam light down off an angled mirror into your eye, prism optics pass light through a solid, thin piece of glass that sits flush against the frame.</p><p>I’ll admit that the optics on the GT Max looked a bit different to me at first, given that all the AR glasses I’ve tried up until now use birdbath setups. However, once I had them on my face and was watching a movie, everything clicked. I didn’t feel the frame weighing down on the bridge of my nose, and they were light enough that I could easily see myself wearing them for long stretches. Of course, I’ll need to get a pair in for testing at home to see how they perform beyond a brief run on the IFA show floor.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OKylGe"></div>                            </div>                            <script src="https://kwizly.com/embed/OKylGe.js" async></script><h2 id="peering-through-a-prism">Peering through a prism</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FGzDp32yMooeDXKAsFREg4" name="RayNeo-GT-Max-3" alt="A close-up shot of a person wearing the RayNeo GT Max AR glasses and looking through their prism optics" src="https://cdn.mos.cms.futurecdn.net/FGzDp32yMooeDXKAsFREg4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When it comes to AR glasses — or more accurately, display glasses — we’re still very early on in their evolution. In fact, this current wave of consumer-focused glasses didn’t really start hitting the mainstream until around 2022. In the brief time since, we’ve seen dramatically thinner and lighter designs, wider fields of view, and more recently, onboard spatial tracking powered by dedicated chips inside their frames.</p><p>The RayNeo GT Max feels like a standout entry point for anyone looking to get into display glasses. While they are a bit more expensive than some of the other recent budget options, you’re getting a stack of premium features that genuinely elevate the day-to-day experience.</p><p>At the end of the day, if you want to use a pair of glasses like these for more than just watching a movie on a long flight, comfort is king. Having used both the original <a href="https://www.tomsguide.com/computing/vr-ar/viture-pro-xr-glasses-review">Viture Pro</a> glasses and the upgraded Pro 2s, shaving off extra weight makes a world of difference. Yet compared to the GT Max, I was genuinely impressed by how RayNeo’s glasses managed to feel lighter on my face despite technically being heavier on paper.</p><p>If you haven't tried a pair of AR glasses yet, there’s never been a better time to dive in now that we have both solid budget choices and feature-packed premium models to pick from. The RayNeo GT Max hits that sweet spot between capability and everyday wearability, and I can’t wait to spend more time testing them out beyond the show floor.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/computing/i-ditched-my-laptop-for-a-pocketable-mini-pc-and-a-pair-of-ar-glasses-heres-what-happened"><strong>I ditched my laptop for a pocketable mini PC and a pair of AR glasses — here’s what happened</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/smart-glasses/i-wore-virtue-and-xreals-new-budget-friendly-ar-glasses-for-a-week-and-this-is-the-pair-id-buy"><strong>I wore Virtue and Xreal's new budget-friendly AR glasses for a week and this is the pair I'd buy</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-the-worlds-first-mobile-game-controller-with-ar-glasses-support-and-it-completely-transformed-my-16-hour-flight"><strong>I tested the world's first mobile game controller with AR glasses support and it completely transformed my 16-hour flight</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I stress-tested the Asus Zenbook 14 for college — it’s a great fit, but Windows on 8GB RAM is a problem ]]></title>
                                                                                                <dc:content><![CDATA[ <p>College studies have changed a lot since I was there, but in some ways, it’s remained the same. Because sure, there are now local AI tools to help with your studies. However, whether it was in the early 2010s for me or 2026 for you: RAM is always the key bottleneck.</p><p>And that’s been put to the test in the current pricing crisis we find ourselves in, which gave birth to the <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>, and subsequently all the budget Windows laptop competitors. Out of all of them that’s launched, the <a href="https://uk.store.asus.com/asus-zenbook-14-ux3480-snapdragon-copilot-pc-with-free-asus-vigour-backpack5603-37959.html" target="_blank" rel="nofollow">£799 Asus Zenbook 14</a> is one I’m particularly excited about throwing in my rucksack!</p><p>That’s because this is a fantastic frame — definitely feels cheaper than its more expensive brother the Zenbook A14, but quite the looker and solid ergonomics. Plus the OLED screen is a real difference maker from the competition, and that Snapdragon X chip ensures zippy single-core speeds for opening apps fast.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZTiuibZ7yKffRs7dL6h5WG" name="Asus Zenbook 14" alt="Asus Zenbook 14" src="https://cdn.mos.cms.futurecdn.net/ZTiuibZ7yKffRs7dL6h5WG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>However, it’s worth noting that the model I was given comes packed with 16GB RAM (priced at £1,199 at the time of writing). For running Windows 11 and your broader study load — a bunch of Chrome tabs, a Spotify playlist and AnythingLLM, this is enough. However, I wanted to go deeper, so I went into the bios and restricted RAM usage of Windows to 8GB.</p><p>Put simply, it’s ok-ish, but clearly only for the basics at this level. Windows 11 eats memory in a different way to macOS, and you can really feel it in some sluggish app opens and especially when you’re trying to do the classic 20+ Chrome tab study session, or the time taken to get a response from a local chatbot about your ingested coursework.</p><p>None of this is to say this is a bad laptop. Asus has taken one of my favorite Zenbooks and made it cheap — this is a great system with solid entry-level performance that outstrips the Neo, and good battery life to boot. But there’s definitely a mistaken identity in what it is and who it’s for.</p><p>That £799 model is strong for a very specific kind of studier: the ones who are focused solely on essay writing with a little bit of web research. </p><p>Until Microsoft starts optimizing memory usage (which is coming), it’s going to be tricky. No, I’d point you more towards that 16GB option as the sound investment here for not just your studies but your extracurriculars too like creating projects on CapCut or some super casual gaming on the side.</p><p>Oh and P.S. This will be launching in the U.S. We just don't know when and for how much!</p><h2 class="article-body__section" id="section-asus-zenbook-14-cheat-sheet"><span>Asus Zenbook 14: Cheat Sheet</span></h2><ul><li><strong>What is it? </strong>This is a budget Windows laptop — made to compete with the MacBook Neo.</li><li><strong>Who is it for? </strong>This is an entry-level system for the kinds of students with casual workloads.</li><li><strong>What does it cost? </strong><a href="https://uk.store.asus.com/asus-zenbook-14-ux3480-snapdragon-copilot-pc-with-free-asus-vigour-backpack5603-37959.html" target="_blank" rel="nofollow">Pricing starts at £799</a>, but the option I snagged is £1,199. No pricing has been announced for U.S., but expect it to be similar (starting from $799).</li><li><strong>What do we like? </strong>I’m a big fan of the design — looks premium and feels durable with solid ergonomics. And with enough memory, Snapdragon X is a good performer that slow-sips battery life.</li><li><strong>What don’t we like? </strong>Windows 11 is a RAM hog, which makes an 8GB capacity tricky to recommend to students.</li></ul><h2 class="article-body__section" id="section-asus-zenbook-14-specs"><span>Asus Zenbook 14: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Screen</strong></p></td><td  ><p>14-inch 1080p OLED 60Hz</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Snapdragon X</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>From 8GB </p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>50Wh</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>2x USB 3.2 Gen 2 Type-C, 1x USB 3.2 Gen 1 Type-A, 1x HDMI 2.1, 1x 3.5mm audio jack</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 6E, Bluetooth 5.3</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>12.2 x 8.5 x 0.7 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>2.4 pounds</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-asus-zenbook-14-the-ups"><span>Asus Zenbook 14: The ups</span></h2><p>So I spoke to a few students at my local university, to figure out (and replicate a various course load demands). In case you’re curious, these were history, science and media studies. The Zenbook A14 kept up with a lot more of it than I expected.</p><h2 id="more-premium-than-the-price">More premium than the price </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QdLwFyC89hwgeY4bpxPAiG" name="Asus Zenbook 14" alt="Asus Zenbook 14" src="https://cdn.mos.cms.futurecdn.net/QdLwFyC89hwgeY4bpxPAiG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>For all the beef I had with the Zenbook A14 and A16 earlier this year, one thing I loved about them is the lightweight, durable design and great-feeling ergonomics. And while this Zenbook 14 doesn’t quite have that same premium-feeling ceraluminum surface, it takes enough of the A-series’ essence to be a well-built system.</p><p>It’s lightweight, feels durable enough to stash in a backpack, and comes with a nice-feeling keyboard for rapid note taking or essay writing, alongside a sizable touchpad with good click ability. Oh, and shout-out to the color finishes — I love this blue option.</p><p>Ports-wise, you’ve got everything you’d need for your standard array of accessories, and while the screen side of the clamshell can flex a bit (like the A-series laptops), the keyboard deck has very minimal flex when pushing down on it. All-in-all, this felt like a system that could keep up with the demands of college.</p><h2 id="good-for-the-eyes-and-ears">Good for the eyes and ears</h2><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="tkSUKsTnXjdpWthYcsRFbG" name="Asus Zenbook 14" alt="Asus Zenbook 14" src="https://cdn.mos.cms.futurecdn.net/tkSUKsTnXjdpWthYcsRFbG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ve tested a fair few of these MacBook Neo alternatives, and one place they all fall down is that college dorm job of being the central focal point of both working by day and chilling out by night. That means a good screen and speakers are a must — something that’s nice on the eyes and can fill a room with sound.</p><p>The speakers on the Zenbook 14 are surprisingly loud with zero noticeable distortion (thanks to Snapdragon Sound), which meant I could keep a room of my friends entertained with my Spotify playlist (which descended quickly into finding Vine compilations to reminisce about being young).</p><p>And let’s not forget about that 1080p OLED, which has a decent level of sharpness, a good level of brightness and mightily impressive color reproduction. Great for your work, and great for binge watching by night.</p><h2 id="decent-performance-and-strong-battery-life">Decent performance and strong battery life</h2><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="ELWnXogYJ3SoU77scEjPtG" name="Asus Zenbook 14" alt="Asus Zenbook 14" src="https://cdn.mos.cms.futurecdn.net/ELWnXogYJ3SoU77scEjPtG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>All this talk of Intel Wildcat Lake has almost made people forget about Snapdragon X — a stellar budget-end chipset that is quite the formidable foe to the A18 Pro in the Neo with better multicore processing to crunch tasks and zippy speeds across media encoding and app opens.</p><div ><table><thead><tr><th class="firstcol " ><p>Laptop</p></th><th  ><p>Geekbench single / multi-core</p></th><th  ><p>Handbrake transcore 4K video to 1080p (mm:ss)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Asus Zenbook 14 (Snapdragon X)</strong></p></td><td  ><p>2181 / 10676</p></td><td  ><p>09:48</p></td></tr><tr><td class="firstcol " ><p><strong>Dell XPS 13 (Intel Core 5 Series 3)</strong></p></td><td  ><p>2684 / 7952</p></td><td  ><p>10:38</p></td></tr><tr><td class="firstcol " ><p><strong>MacBook Neo (A18 Pro)</strong></p></td><td  ><p>3535 / 8920</p></td><td  ><p>09:57</p></td></tr></tbody></table></div><p>What this means in practice is fast program opens, decently quick hot-swapping between different apps and browser tabs, and even a little bit of light photo editing in Photoshop or CapCut edits.</p><p>It’s also strong in AI processing too when you go for the 16GB model. There’s a lot of tools out there for keeping on top of your study materials in a convenient way that enhances your learning, and with the headroom of RAM, these run zippy enough.</p><div ><table><thead><tr><th class="firstcol " ><p>Laptop</p></th><th  ><p>Battery life test result (hh:mm)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Asus Zenbook 14</strong></p></td><td  ><p>13:38</p></td></tr><tr><td class="firstcol " ><p><strong>Dell XPS 13</strong></p></td><td  ><p>14:26</p></td></tr><tr><td class="firstcol " ><p><strong>MacBook Neo</strong></p></td><td  ><p>13:26</p></td></tr></tbody></table></div><p>Finally, the battery life demands of being on campus means you can spend a lot of time away from any outlets. All-day usage is necessary, and in my battery life testing, it’s clear this will keep up with your demands.</p><h2 class="article-body__section" id="section-asus-zenbook-14-the-downs"><span>Asus Zenbook 14: The downs</span></h2><p>But as I got into the more intensive coursework demos here with that reduced memory profile to the 8GB baseline, I realized that the macOS and the MacBook Neo has a serious leg-up on the competition. And there’s one reason why.</p><h2 id="windows-11-is-the-problem">Windows 11 is the problem</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="f2r9QFGa4FgQdJBuCBh6pG" name="Asus Zenbook 14" alt="Asus Zenbook 14" src="https://cdn.mos.cms.futurecdn.net/f2r9QFGa4FgQdJBuCBh6pG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Yes, I said it. Microsoft is improving Windows 11 over time, but the key thing of memory utilization is still an issue that can cripple performance of that Snapdragon X chip when you try to do too much.</p><p>On 8GB, for example, I found myself being able to play a Spotify playlist, have a Google Docs tab for an essay and a few other tabs with research notes. The moment I hit the seventh tab, I started to feel a little stuttering. And then the moment I opened up AnythingLLM, it all froze up working through the tasks one by one.</p><p>It’s a sticky situation, which makes the 16GB the only real option if you’re wanting to stretch your legs a little more than the bare essentials.</p><h2 id="pricing-can-get-out-of-hand-fast">Pricing can get out of hand fast</h2><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="3JpBhBUBajbaF5Z7XshjjG" name="Asus Zenbook 14" alt="Asus Zenbook 14" src="https://cdn.mos.cms.futurecdn.net/3JpBhBUBajbaF5Z7XshjjG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>And if you do, things can spiral fast pricing-wise because of the memory crisis going on right now. That jump to 16GB with additional SSD storage is a £400 uplift, and going further causes more problems.</p><p>This is entering <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-m5-review">M5 MacBook Air</a> territory, which becomes an issue. When you go up against the ultrabook king, you best not miss, and those pros from before come with some flaws that prove fatal.</p><p>For example, the MacBook Air (and Neo for that matter) are aluminum builds, whereas the Zenbook feels a little cheaper in the hand. The MacBook Air benefits from seriously fast Apple Silicon, but Snapdragon X can’t keep up.</p><p>The math stops mathing at a particular point.</p><h2 class="article-body__section" id="section-asus-zenbook-14-verdict"><span>Asus Zenbook 14: Verdict</span></h2><p>So I find the Zenbook 14 is ideal for a very particular kind of student in very particular courses.</p><p>If you’re working in essay-centric/coursework-heavy fields with some light local AI use like transcribing lectures and processing notes, you’ll find enough here for what you need to do.</p><p>But if you’re a serious studier with multiple tabs and various apps, this is going to be an issue. I can’t deny this is a great laptop for most learners and beyond, and a breath of value fresh air (provided you only need the baseline model). </p><p>And if you fit in that category, this is a seriously good looker and good worker that comes in gorgeous color finishes.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/asus-zenbook-14-2026-review</link>
                                                                            <description>
                            <![CDATA[ The Asus Zenbook 14 is another great MacBook Neo competitor with a vibrant colorful design, gorgeous OLED display and stellar ergonomics with a good performing chip inside. Just stick to the base model, as the price goes out of control with more RAM. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">brbHMHPuWJThhMK2FcWNpN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/yHj2fnqxNzMYPTWtWadDsG-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 10 Sep 2026 12:00:00 +0000</pubDate>                                                                                                                                <updated>Fri, 11 Sep 2026 03:18:25 +0000</updated>
                                                                                                                                            <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/yHj2fnqxNzMYPTWtWadDsG-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Asus Zenbook 14]]></media:description>                                                            <media:text><![CDATA[Asus Zenbook 14]]></media:text>
                                <media:title type="plain"><![CDATA[Asus Zenbook 14]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/yHj2fnqxNzMYPTWtWadDsG-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>College studies have changed a lot since I was there, but in some ways, it’s remained the same. Because sure, there are now local AI tools to help with your studies. However, whether it was in the early 2010s for me or 2026 for you: RAM is always the key bottleneck.</p><p>And that’s been put to the test in the current pricing crisis we find ourselves in, which gave birth to the <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>, and subsequently all the budget Windows laptop competitors. Out of all of them that’s launched, the <a href="https://uk.store.asus.com/asus-zenbook-14-ux3480-snapdragon-copilot-pc-with-free-asus-vigour-backpack5603-37959.html" target="_blank" rel="nofollow">£799 Asus Zenbook 14</a> is one I’m particularly excited about throwing in my rucksack!</p><p>That’s because this is a fantastic frame — definitely feels cheaper than its more expensive brother the Zenbook A14, but quite the looker and solid ergonomics. Plus the OLED screen is a real difference maker from the competition, and that Snapdragon X chip ensures zippy single-core speeds for opening apps fast.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZTiuibZ7yKffRs7dL6h5WG" name="Asus Zenbook 14" alt="Asus Zenbook 14" src="https://cdn.mos.cms.futurecdn.net/ZTiuibZ7yKffRs7dL6h5WG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>However, it’s worth noting that the model I was given comes packed with 16GB RAM (priced at £1,199 at the time of writing). For running Windows 11 and your broader study load — a bunch of Chrome tabs, a Spotify playlist and AnythingLLM, this is enough. However, I wanted to go deeper, so I went into the bios and restricted RAM usage of Windows to 8GB.</p><p>Put simply, it’s ok-ish, but clearly only for the basics at this level. Windows 11 eats memory in a different way to macOS, and you can really feel it in some sluggish app opens and especially when you’re trying to do the classic 20+ Chrome tab study session, or the time taken to get a response from a local chatbot about your ingested coursework.</p><p>None of this is to say this is a bad laptop. Asus has taken one of my favorite Zenbooks and made it cheap — this is a great system with solid entry-level performance that outstrips the Neo, and good battery life to boot. But there’s definitely a mistaken identity in what it is and who it’s for.</p><p>That £799 model is strong for a very specific kind of studier: the ones who are focused solely on essay writing with a little bit of web research. </p><p>Until Microsoft starts optimizing memory usage (which is coming), it’s going to be tricky. No, I’d point you more towards that 16GB option as the sound investment here for not just your studies but your extracurriculars too like creating projects on CapCut or some super casual gaming on the side.</p><p>Oh and P.S. This will be launching in the U.S. We just don't know when and for how much!</p><h2 class="article-body__section" id="section-asus-zenbook-14-cheat-sheet"><span>Asus Zenbook 14: Cheat Sheet</span></h2><ul><li><strong>What is it? </strong>This is a budget Windows laptop — made to compete with the MacBook Neo.</li><li><strong>Who is it for? </strong>This is an entry-level system for the kinds of students with casual workloads.</li><li><strong>What does it cost? </strong><a href="https://uk.store.asus.com/asus-zenbook-14-ux3480-snapdragon-copilot-pc-with-free-asus-vigour-backpack5603-37959.html" target="_blank" rel="nofollow">Pricing starts at £799</a>, but the option I snagged is £1,199. No pricing has been announced for U.S., but expect it to be similar (starting from $799).</li><li><strong>What do we like? </strong>I’m a big fan of the design — looks premium and feels durable with solid ergonomics. And with enough memory, Snapdragon X is a good performer that slow-sips battery life.</li><li><strong>What don’t we like? </strong>Windows 11 is a RAM hog, which makes an 8GB capacity tricky to recommend to students.</li></ul><h2 class="article-body__section" id="section-asus-zenbook-14-specs"><span>Asus Zenbook 14: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Screen</strong></p></td><td  ><p>14-inch 1080p OLED 60Hz</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Snapdragon X</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>From 8GB </p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>50Wh</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>2x USB 3.2 Gen 2 Type-C, 1x USB 3.2 Gen 1 Type-A, 1x HDMI 2.1, 1x 3.5mm audio jack</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 6E, Bluetooth 5.3</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>12.2 x 8.5 x 0.7 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>2.4 pounds</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-asus-zenbook-14-the-ups"><span>Asus Zenbook 14: The ups</span></h2><p>So I spoke to a few students at my local university, to figure out (and replicate a various course load demands). In case you’re curious, these were history, science and media studies. The Zenbook A14 kept up with a lot more of it than I expected.</p><h2 id="more-premium-than-the-price">More premium than the price </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QdLwFyC89hwgeY4bpxPAiG" name="Asus Zenbook 14" alt="Asus Zenbook 14" src="https://cdn.mos.cms.futurecdn.net/QdLwFyC89hwgeY4bpxPAiG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>For all the beef I had with the Zenbook A14 and A16 earlier this year, one thing I loved about them is the lightweight, durable design and great-feeling ergonomics. And while this Zenbook 14 doesn’t quite have that same premium-feeling ceraluminum surface, it takes enough of the A-series’ essence to be a well-built system.</p><p>It’s lightweight, feels durable enough to stash in a backpack, and comes with a nice-feeling keyboard for rapid note taking or essay writing, alongside a sizable touchpad with good click ability. Oh, and shout-out to the color finishes — I love this blue option.</p><p>Ports-wise, you’ve got everything you’d need for your standard array of accessories, and while the screen side of the clamshell can flex a bit (like the A-series laptops), the keyboard deck has very minimal flex when pushing down on it. All-in-all, this felt like a system that could keep up with the demands of college.</p><h2 id="good-for-the-eyes-and-ears">Good for the eyes and ears</h2><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="tkSUKsTnXjdpWthYcsRFbG" name="Asus Zenbook 14" alt="Asus Zenbook 14" src="https://cdn.mos.cms.futurecdn.net/tkSUKsTnXjdpWthYcsRFbG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ve tested a fair few of these MacBook Neo alternatives, and one place they all fall down is that college dorm job of being the central focal point of both working by day and chilling out by night. That means a good screen and speakers are a must — something that’s nice on the eyes and can fill a room with sound.</p><p>The speakers on the Zenbook 14 are surprisingly loud with zero noticeable distortion (thanks to Snapdragon Sound), which meant I could keep a room of my friends entertained with my Spotify playlist (which descended quickly into finding Vine compilations to reminisce about being young).</p><p>And let’s not forget about that 1080p OLED, which has a decent level of sharpness, a good level of brightness and mightily impressive color reproduction. Great for your work, and great for binge watching by night.</p><h2 id="decent-performance-and-strong-battery-life">Decent performance and strong battery life</h2><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="ELWnXogYJ3SoU77scEjPtG" name="Asus Zenbook 14" alt="Asus Zenbook 14" src="https://cdn.mos.cms.futurecdn.net/ELWnXogYJ3SoU77scEjPtG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>All this talk of Intel Wildcat Lake has almost made people forget about Snapdragon X — a stellar budget-end chipset that is quite the formidable foe to the A18 Pro in the Neo with better multicore processing to crunch tasks and zippy speeds across media encoding and app opens.</p><div ><table><thead><tr><th class="firstcol " ><p>Laptop</p></th><th  ><p>Geekbench single / multi-core</p></th><th  ><p>Handbrake transcore 4K video to 1080p (mm:ss)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Asus Zenbook 14 (Snapdragon X)</strong></p></td><td  ><p>2181 / 10676</p></td><td  ><p>09:48</p></td></tr><tr><td class="firstcol " ><p><strong>Dell XPS 13 (Intel Core 5 Series 3)</strong></p></td><td  ><p>2684 / 7952</p></td><td  ><p>10:38</p></td></tr><tr><td class="firstcol " ><p><strong>MacBook Neo (A18 Pro)</strong></p></td><td  ><p>3535 / 8920</p></td><td  ><p>09:57</p></td></tr></tbody></table></div><p>What this means in practice is fast program opens, decently quick hot-swapping between different apps and browser tabs, and even a little bit of light photo editing in Photoshop or CapCut edits.</p><p>It’s also strong in AI processing too when you go for the 16GB model. There’s a lot of tools out there for keeping on top of your study materials in a convenient way that enhances your learning, and with the headroom of RAM, these run zippy enough.</p><div ><table><thead><tr><th class="firstcol " ><p>Laptop</p></th><th  ><p>Battery life test result (hh:mm)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Asus Zenbook 14</strong></p></td><td  ><p>13:38</p></td></tr><tr><td class="firstcol " ><p><strong>Dell XPS 13</strong></p></td><td  ><p>14:26</p></td></tr><tr><td class="firstcol " ><p><strong>MacBook Neo</strong></p></td><td  ><p>13:26</p></td></tr></tbody></table></div><p>Finally, the battery life demands of being on campus means you can spend a lot of time away from any outlets. All-day usage is necessary, and in my battery life testing, it’s clear this will keep up with your demands.</p><h2 class="article-body__section" id="section-asus-zenbook-14-the-downs"><span>Asus Zenbook 14: The downs</span></h2><p>But as I got into the more intensive coursework demos here with that reduced memory profile to the 8GB baseline, I realized that the macOS and the MacBook Neo has a serious leg-up on the competition. And there’s one reason why.</p><h2 id="windows-11-is-the-problem">Windows 11 is the problem</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="f2r9QFGa4FgQdJBuCBh6pG" name="Asus Zenbook 14" alt="Asus Zenbook 14" src="https://cdn.mos.cms.futurecdn.net/f2r9QFGa4FgQdJBuCBh6pG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Yes, I said it. Microsoft is improving Windows 11 over time, but the key thing of memory utilization is still an issue that can cripple performance of that Snapdragon X chip when you try to do too much.</p><p>On 8GB, for example, I found myself being able to play a Spotify playlist, have a Google Docs tab for an essay and a few other tabs with research notes. The moment I hit the seventh tab, I started to feel a little stuttering. And then the moment I opened up AnythingLLM, it all froze up working through the tasks one by one.</p><p>It’s a sticky situation, which makes the 16GB the only real option if you’re wanting to stretch your legs a little more than the bare essentials.</p><h2 id="pricing-can-get-out-of-hand-fast">Pricing can get out of hand fast</h2><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="3JpBhBUBajbaF5Z7XshjjG" name="Asus Zenbook 14" alt="Asus Zenbook 14" src="https://cdn.mos.cms.futurecdn.net/3JpBhBUBajbaF5Z7XshjjG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>And if you do, things can spiral fast pricing-wise because of the memory crisis going on right now. That jump to 16GB with additional SSD storage is a £400 uplift, and going further causes more problems.</p><p>This is entering <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-m5-review">M5 MacBook Air</a> territory, which becomes an issue. When you go up against the ultrabook king, you best not miss, and those pros from before come with some flaws that prove fatal.</p><p>For example, the MacBook Air (and Neo for that matter) are aluminum builds, whereas the Zenbook feels a little cheaper in the hand. The MacBook Air benefits from seriously fast Apple Silicon, but Snapdragon X can’t keep up.</p><p>The math stops mathing at a particular point.</p><h2 class="article-body__section" id="section-asus-zenbook-14-verdict"><span>Asus Zenbook 14: Verdict</span></h2><p>So I find the Zenbook 14 is ideal for a very particular kind of student in very particular courses.</p><p>If you’re working in essay-centric/coursework-heavy fields with some light local AI use like transcribing lectures and processing notes, you’ll find enough here for what you need to do.</p><p>But if you’re a serious studier with multiple tabs and various apps, this is going to be an issue. I can’t deny this is a great laptop for most learners and beyond, and a breath of value fresh air (provided you only need the baseline model). </p><p>And if you fit in that category, this is a seriously good looker and good worker that comes in gorgeous color finishes.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ macOS 27 Golden Gate has me excited for the MacBook Ultra — here's why ]]></title>
                                                                                                <dc:content><![CDATA[ <p><a href="https://www.tomsguide.com/computing/macos/apple-macos-tahoe-review">macOS Tahoe</a> was one of the worst updates I’ve used in years. Not since <a href="https://www.tomsguide.com/computing/windows-operating-systems/windows-is-40-today-heres-the-20-best-and-worst-moments-in-windows-history">Windows Vista</a> have I seen so many design and usability mistakes—unusual for Apple, of all companies. Long known for its reputation in design and thinking about the user first, 2025’s Tahoe update for the <a href="https://www.tomsguide.com/best-picks/best-macbook">best Macs</a> felt like a huge misstep. But <a href="https://www.tomsguide.com/computing/macos/macos-27">macOS Golden Gate</a> feels like a redemption for Tahoe’s mistakes.</p><p>I’ve owned a Mac since 2005, when the computers transitioned from PowerPC processors to Intel processors. For several years, I’ve owned an <a href="https://www.tomsguide.com/reviews/macbook-pro-2021-14-inch">M1 Pro MacBook Pro</a>, and it’s one of the <a href="https://www.tomsguide.com/computing/laptops/best-laptops">best laptops</a> I’ve ever owned. From its keyboard to the display, everything felt like a home run after years of strange hardware design choices, like the butterfly keyboard.</p><p>But as we get close to the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks">iPhone 18 Pro</a> and the rumored <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-expected-release-date-price-colors-pre-orders-specs-and-everything-you-need-to-know">iPhone Ultra/Duo</a> foldable, I’m also looking forward to finally updating my Mac to macOS Golden Gate, the newest update that fixes almost all of Tahoe’s mistakes. However, its other design changes have me wondering what comes next for the Mac. So, with rumors of a touchscreen Mac allegedly called the <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Ultra</a>, here’s why I’m very tempted to upgrade when Golden Gate officially launches.</p><h2 id="golden-gate-redeems-macos">Golden Gate redeems macOS</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4349px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="6onBfgc6zZedV7zQBmGFw8" name="macOS 27 Golden Gate Siri AI-2" alt="macOS 27" src="https://cdn.mos.cms.futurecdn.net/6onBfgc6zZedV7zQBmGFw8-1920-80.jpg" mos="" align="middle" fullscreen="" width="4349" height="2446" 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>After trying the <a href="https://www.tomsguide.com/computing/macos/macos-golden-gate-public-beta-hands-on-preview">macOS Golden Gate public beta</a> over the summer, I was struck by how good Liquid Glass finally looks on my Mac. Tahoe showcased the new design in all the wrong ways—from bizarre layers that separated columns within windows to mismatched window sizes. In Golden Gate, that’s nonexistent, with everything looking sharp and far easier on the eye when you’re working with multiple apps on one screen.</p><p>It’s restored my faith that Apple has clearly realized what a mistake Tahoe was in its design, and whilst I’ll be upgrading my current MacBook Pro to Golden Gate once it’s out, it also feels like it’s laying the foundation for the <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Ultra</a>.</p><p>For anyone unaware, this rumored Mac seems to be the opposite of the <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>. Instead of being an entry point, the MacBook Ultra seems aimed at those who want the ultimate portable Mac at a high price. Alleged features include an OLED touchscreen, a first for the Mac to accept touch input, as well as coming with M6 Pro or Ultra chips that give even better performance and battery life.</p><p>Apple silicon has been a huge leap for the Mac. It’s hard to think back to a time when an Intel MacBook Pro could barely manage 4 hours under heavy load, or struggle with games like BioShock Infinite that were then 3 years old since their PC release. Now, even in 2026, my M1 Pro MacBook Pro can still play games like <a href="https://www.tomsguide.com/reviews/resident-evil-4">Resident Evil 4 Remake</a> and others with ease, and I rarely hear the fan whirl. So thinking about what a 5-year leap could do for my Mac gaming, alongside everything else, has me excited.</p><p>These rumored features, combined with macOS Golden Gate, make me consider the Ultra as my next Mac, since it replaces two devices in one go.</p><h2 id="the-ultra-could-also-be-an-ipad-replacement">The Ultra could also be an iPad replacement</h2><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.23%;"><img id="Kg4cbghayrcgsaf6yZstBB" name="iPadOS 27-5" alt="iPadOS 27" src="https://cdn.mos.cms.futurecdn.net/Kg4cbghayrcgsaf6yZstBB-1920-80.jpg" mos="" align="middle" fullscreen="" width="3000" height="1687" 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 been a fan of the <a href="https://www.tomsguide.com/best-picks/best-ipad">iPad</a> since its 2010 debut, and whilst recent software updates, especially <a href="https://www.tomsguide.com/computing/ipads/apple-ipados-26-review">iPadOS 26</a>, have made Apple’s tablet far more productive, its locked ecosystem has always made me go back to the Mac.</p><p>But there are moments when a touch-screen can work well, such as editing videos for TikTok via LumaFusion, or reading comics from my childhood. It’s why I can see these two examples, and many others, working well on a touchscreen Mac, without macOS leaving the mouse behind.</p><p>Golden Gate clearly hints towards a touchscreen Mac—from being able to slide down to refresh in Safari and Mail, to every button designed as if they’re meant to be touched by a finger. Even <a href="https://www.tomsguide.com/phones/iphones/i-spent-a-week-with-siri-ai-here-are-my-honest-pros-and-cons">Siri AI</a> lets users send an email, record a voice note, take a selfie, and more with their voice or via the Siri app. The newest macOS update looks set to be ready for the MacBook Ultra.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYx7ZO"></div>                            </div>                            <script src="https://kwizly.com/embed/XYx7ZO.js" async></script><h2 id="outlook">Outlook</h2><p>When an ultra-high-end Mac seems like it will improve on what my M1 MacBook Pro offers, while replacing the use cases I’ve had for my iPad Pro for several years, it feels like the natural next step for me and how I work. Even for Mac gaming, with ways to play Windows games via Crossover or decompilations like Donkey Kong 64 or GoldenEye, the extra power thanks to the M6 architecture will be a huge step up from what I’ve been using since 2021.</p><p>So while many will be excited to own an iPhone Ultra or an iPhone 18 Pro model, I’m more excited to use the MacBook Ultra. From the much-improved macOS Golden Gate update to the OLED touchscreen, it feels like the MacBook Ultra could be one of the best Macs to use for at least another five years. If that happens, then I'll have to say goodbye to my M1 MacBook Pro.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-ultra-may-arrive-running-on-some-of-the-same-chips-as-macbook-pro-heres-why">Apple MacBook Ultra may run on some of the same chips as MacBook Pro</a></li><li><a href="https://www.tomsguide.com/computing/apple-desktops/apple-just-announced-the-new-mac-studio-with-m5-ultra-and-it-will-be-a-local-ai-powerhouse">Apple just announced the new Mac Studio with M5 Ultra</a></li><li><a href="https://www.tomsguide.com/computing/laptops/best-laptops-of-ifa-2026-wild-colors-ultrathin-designs-and-rollable-displays">Best laptops of IFA 2026: Wild colors, ultrathin designs and rollable displays</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=laptops&brands=Apple&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="8">8 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), 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: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(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 finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                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)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/macbooks/macos-27-golden-gate-has-me-excited-for-the-macbook-ultra-heres-why</link>
                                                                            <description>
                            <![CDATA[ After the disappointing macOS Tahoe, Golden Gate looks like a huge improvement. And it also has me tempted by the rumored MacBook Ultra. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">DhERMXDA5AYv6uzCR9D3G9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/gQb27riPj5CeJQa2gZqQVC-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 09 Sep 2026 10:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                                                                                    <dc:creator><![CDATA[ Daryl Baxter ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/P9iJP4ECuoNHX6uZuFdine-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Daryl&#039;s first writing piece was during his days at Nottingham Trent University in 2012, where his interview with original Tomb Raider composer Nathan McCree was published in the Uni magazine across all its campuses, helping Daryl to discover the career he wanted to follow. Even though he was currently studying (and eventually graduated) a degree in Computer Systems (Networks) at the time.&lt;/p&gt;&lt;p&gt;He had been working as tech support in many forms while freelancing on the side, when he decided to freelance full-time towards the end of 2018. Eventually, it led to a position building out a new tech site at Gfinity, and after 18 months, moved to Tom&#039;s Guide&#039;s sister site TechRadar to help build out the Software &amp; Downloads section.&lt;/p&gt;&lt;p&gt;During this, Daryl also published a now bestselling book that&#039;s available in most shops in town and online, called &#039;&lt;a href=&quot;https://www.pen-and-sword.co.uk/The-Making-of-Tomb-Raider-Hardback/p/20165&quot; target=&quot;_blank&quot;&gt;The Making of Tomb Raider&lt;/a&gt;&#039;, which tells the story of the beginnings of Lara Croft, up until the original team disbanded at the release of Tomb Raider 2 in 1997. His second book, &#039;&lt;a href=&quot;https://www.pen-and-sword.co.uk/50-Years-of-Boss-Fights-Hardback/p/50605&quot; target=&quot;_blank&quot;&gt;50 Years of Boss Fights&lt;/a&gt;&#039;, came out in June 2024, and he has a newsletter called &#039;&lt;a href=&quot;https://darylbaxter.com/springboard/&quot; target=&quot;_blank&quot;&gt;Springboard&lt;/a&gt;&#039;.&lt;/p&gt;&lt;p&gt;But in his spare time, he&#039;s usually found in a coffee shop, playing many retro games. Alongside this, he&#039;s currently replaying Tomb Raider VI thanks to the Remastered Collection, as well as quoting Simpsons quotes to whomever is nearby.&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/gQb27riPj5CeJQa2gZqQVC-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[MacBook Pro 16-inch M5 Pro on a desk]]></media:description>                                                            <media:text><![CDATA[MacBook Pro 16-inch M5 Pro on a desk]]></media:text>
                                <media:title type="plain"><![CDATA[MacBook Pro 16-inch M5 Pro on a desk]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/gQb27riPj5CeJQa2gZqQVC-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/computing/macos/apple-macos-tahoe-review">macOS Tahoe</a> was one of the worst updates I’ve used in years. Not since <a href="https://www.tomsguide.com/computing/windows-operating-systems/windows-is-40-today-heres-the-20-best-and-worst-moments-in-windows-history">Windows Vista</a> have I seen so many design and usability mistakes—unusual for Apple, of all companies. Long known for its reputation in design and thinking about the user first, 2025’s Tahoe update for the <a href="https://www.tomsguide.com/best-picks/best-macbook">best Macs</a> felt like a huge misstep. But <a href="https://www.tomsguide.com/computing/macos/macos-27">macOS Golden Gate</a> feels like a redemption for Tahoe’s mistakes.</p><p>I’ve owned a Mac since 2005, when the computers transitioned from PowerPC processors to Intel processors. For several years, I’ve owned an <a href="https://www.tomsguide.com/reviews/macbook-pro-2021-14-inch">M1 Pro MacBook Pro</a>, and it’s one of the <a href="https://www.tomsguide.com/computing/laptops/best-laptops">best laptops</a> I’ve ever owned. From its keyboard to the display, everything felt like a home run after years of strange hardware design choices, like the butterfly keyboard.</p><p>But as we get close to the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks">iPhone 18 Pro</a> and the rumored <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-expected-release-date-price-colors-pre-orders-specs-and-everything-you-need-to-know">iPhone Ultra/Duo</a> foldable, I’m also looking forward to finally updating my Mac to macOS Golden Gate, the newest update that fixes almost all of Tahoe’s mistakes. However, its other design changes have me wondering what comes next for the Mac. So, with rumors of a touchscreen Mac allegedly called the <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Ultra</a>, here’s why I’m very tempted to upgrade when Golden Gate officially launches.</p><h2 id="golden-gate-redeems-macos">Golden Gate redeems macOS</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4349px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="6onBfgc6zZedV7zQBmGFw8" name="macOS 27 Golden Gate Siri AI-2" alt="macOS 27" src="https://cdn.mos.cms.futurecdn.net/6onBfgc6zZedV7zQBmGFw8-1920-80.jpg" mos="" align="middle" fullscreen="" width="4349" height="2446" 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>After trying the <a href="https://www.tomsguide.com/computing/macos/macos-golden-gate-public-beta-hands-on-preview">macOS Golden Gate public beta</a> over the summer, I was struck by how good Liquid Glass finally looks on my Mac. Tahoe showcased the new design in all the wrong ways—from bizarre layers that separated columns within windows to mismatched window sizes. In Golden Gate, that’s nonexistent, with everything looking sharp and far easier on the eye when you’re working with multiple apps on one screen.</p><p>It’s restored my faith that Apple has clearly realized what a mistake Tahoe was in its design, and whilst I’ll be upgrading my current MacBook Pro to Golden Gate once it’s out, it also feels like it’s laying the foundation for the <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Ultra</a>.</p><p>For anyone unaware, this rumored Mac seems to be the opposite of the <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>. Instead of being an entry point, the MacBook Ultra seems aimed at those who want the ultimate portable Mac at a high price. Alleged features include an OLED touchscreen, a first for the Mac to accept touch input, as well as coming with M6 Pro or Ultra chips that give even better performance and battery life.</p><p>Apple silicon has been a huge leap for the Mac. It’s hard to think back to a time when an Intel MacBook Pro could barely manage 4 hours under heavy load, or struggle with games like BioShock Infinite that were then 3 years old since their PC release. Now, even in 2026, my M1 Pro MacBook Pro can still play games like <a href="https://www.tomsguide.com/reviews/resident-evil-4">Resident Evil 4 Remake</a> and others with ease, and I rarely hear the fan whirl. So thinking about what a 5-year leap could do for my Mac gaming, alongside everything else, has me excited.</p><p>These rumored features, combined with macOS Golden Gate, make me consider the Ultra as my next Mac, since it replaces two devices in one go.</p><h2 id="the-ultra-could-also-be-an-ipad-replacement">The Ultra could also be an iPad replacement</h2><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.23%;"><img id="Kg4cbghayrcgsaf6yZstBB" name="iPadOS 27-5" alt="iPadOS 27" src="https://cdn.mos.cms.futurecdn.net/Kg4cbghayrcgsaf6yZstBB-1920-80.jpg" mos="" align="middle" fullscreen="" width="3000" height="1687" 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 been a fan of the <a href="https://www.tomsguide.com/best-picks/best-ipad">iPad</a> since its 2010 debut, and whilst recent software updates, especially <a href="https://www.tomsguide.com/computing/ipads/apple-ipados-26-review">iPadOS 26</a>, have made Apple’s tablet far more productive, its locked ecosystem has always made me go back to the Mac.</p><p>But there are moments when a touch-screen can work well, such as editing videos for TikTok via LumaFusion, or reading comics from my childhood. It’s why I can see these two examples, and many others, working well on a touchscreen Mac, without macOS leaving the mouse behind.</p><p>Golden Gate clearly hints towards a touchscreen Mac—from being able to slide down to refresh in Safari and Mail, to every button designed as if they’re meant to be touched by a finger. Even <a href="https://www.tomsguide.com/phones/iphones/i-spent-a-week-with-siri-ai-here-are-my-honest-pros-and-cons">Siri AI</a> lets users send an email, record a voice note, take a selfie, and more with their voice or via the Siri app. The newest macOS update looks set to be ready for the MacBook Ultra.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYx7ZO"></div>                            </div>                            <script src="https://kwizly.com/embed/XYx7ZO.js" async></script><h2 id="outlook">Outlook</h2><p>When an ultra-high-end Mac seems like it will improve on what my M1 MacBook Pro offers, while replacing the use cases I’ve had for my iPad Pro for several years, it feels like the natural next step for me and how I work. Even for Mac gaming, with ways to play Windows games via Crossover or decompilations like Donkey Kong 64 or GoldenEye, the extra power thanks to the M6 architecture will be a huge step up from what I’ve been using since 2021.</p><p>So while many will be excited to own an iPhone Ultra or an iPhone 18 Pro model, I’m more excited to use the MacBook Ultra. From the much-improved macOS Golden Gate update to the OLED touchscreen, it feels like the MacBook Ultra could be one of the best Macs to use for at least another five years. If that happens, then I'll have to say goodbye to my M1 MacBook Pro.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-ultra-may-arrive-running-on-some-of-the-same-chips-as-macbook-pro-heres-why">Apple MacBook Ultra may run on some of the same chips as MacBook Pro</a></li><li><a href="https://www.tomsguide.com/computing/apple-desktops/apple-just-announced-the-new-mac-studio-with-m5-ultra-and-it-will-be-a-local-ai-powerhouse">Apple just announced the new Mac Studio with M5 Ultra</a></li><li><a href="https://www.tomsguide.com/computing/laptops/best-laptops-of-ifa-2026-wild-colors-ultrathin-designs-and-rollable-displays">Best laptops of IFA 2026: Wild colors, ultrathin designs and rollable displays</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=laptops&brands=Apple&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="8">8 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const finalHref = cardLink.href || cardLink.getAttribute('href') || '';                let actualRevenueId = cardLink.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.getFilteredDeals().slice(0, this.displayLimit), 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: this.decodeHTML(item.name || item.title || item.model_name || item.product_name || 'Unknown Product'),            brand: this.decodeHTML(item.brand || ''),            productName: this.decodeHTML(item.model_name || item.product_name || item.name || ''),            merchant: this.decodeHTML(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 finalHref = btn.href || btn.getAttribute('href') || '';                let actualRevenueId = btn.getAttribute('data-revenue-id');                const revMatch = finalHref.match(/(?:subId1|xcust|clickref|ascsubtag)=[^&]*?(\d{18,20})(?:&|$)/i);                if (revMatch && revMatch[1]) {                  actualRevenueId = revMatch[1];                }                const rewrittenLink = finalHref;                const revenueId = actualRevenueId;                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)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ AI is turning ordinary photos of kids into sexual abuse imagery — here's how to protect your family ]]></title>
                                                                                                <dc:content><![CDATA[ <p>A picture of my children at the beach, my son playing soccer or even my entire family, smiling in front of our house are all examples of photos I've posted to social media. I know I'm not alone, considering just how often I've seen similar images highlighting the goings-on of modern lives. <br><br>But AI has created a disturbing new risk that allows the use of ordinary photos of real children like the ones I mentioned above, to be manipulated into sexual abuse imagery without the child — or their parents — ever knowing.<br><br>To be clear, this is not a theoretical threat.</p><h2 id="332-ai-generated-child-sexual-abuse-ads-slipped-through">332 AI-generated child sexual abuse ads slipped through</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:7110px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="bZGXCBzoz5wEX4K8t872MR" name="shutterstock_2652715669" alt="This illustrates digital connectivity with a mobile device, highlighting the Meta platform, signifying modern communication, virtual reality, and engagement in the metaverse." src="https://cdn.mos.cms.futurecdn.net/bZGXCBzoz5wEX4K8t872MR-1920-80.jpg" mos="" align="middle" fullscreen="" width="7110" height="4000" 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>A new investigation from the Tech Transparency Project (TTP) found hundreds of ads containing AI-generated child sexual abuse material (CSAM) running across Facebook and Instagram. Researchers identified four real children whose ordinary photos had been manipulated, according to <a href="https://www.wired.com/story/meta-failed-to-catch-hundreds-of-ai-child-abuse-ads-some-included-images-of-real-kids/" target="_blank">WIRED</a>, including two teenage influencers, a preteen whose image appeared on a stock-photo site and a young member of a European royal family.</p><p>In total, TTP found 332 ads containing AI-generated child sexual abuse material, or CSAM. Most depicted a child whose photograph had been manipulated using AI to make it appear they were performing a sexual act.</p><p>The findings are an alarming reminder of <a href="https://www.tomsguide.com/ai/ai-image-video/all-she-did-was-change-the-face-i-spoke-to-a-creator-whose-video-was-stolen-and-reskinned-with-ai">how generative AI has changed the risks around sharing photos of children online</a>. Creating convincing fake imagery no longer requires an explicit photograph in the first place. An ordinary picture can provide the raw material.</p><h2 id="how-ordinary-photos-become-ai-generated-abuse">How ordinary photos become AI-generated abuse</h2><p><a href="https://www.tomsguide.com/phones/i-tested-the-ai-photo-editing-tools-for-iphone-vs-google-pixel-vs-samsung-galaxy-and-theres-a-clear-winner">Generative AI image tools can take an existing photograph and modify parts of it</a> while preserving recognizable features of the person in the original.</p><p>That's what researchers say happened to several of the children identified in the <a href="https://www.tomsguide.com/ai/meta-will-start-using-your-ai-chats-to-target-ads-heres-what-that-means-and-why-critics-like-joseph-gordon-levitt-are-pushing-back">Meta ads</a>.</p><p>According to WIRED, researchers were able to trace images of four minors back to their original sources. Two were teenage influencers with public social media accounts. Another was a preteen whose photograph was available through a stock-photo website. The fourth was a young member of a European royal family.</p><p>None of those original photographs needed to contain sexual material for them to be misused.</p><p>"AI apps are making it far too easy to create realistic criminal imagery of child sexual abuse, creating the new risk of everyday photos of children being taken and transformed into sexual content," Emma Hardy, director of communications at the Internet Watch Foundation, told WIRED.</p><p>Once an ordinary image is publicly accessible, someone can potentially download it and feed it into an AI tool designed to alter photographs.</p><h2 id="meta-39-s-ai-didn-39-t-catch-hundreds-of-the-ads">Meta's AI didn't catch hundreds of the ads</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:9375px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="d6qmGSnFFXo6yGiczVTtSb" name="shutterstock_2663776741-2" alt="mark zuckerberg" src="https://cdn.mos.cms.futurecdn.net/d6qmGSnFFXo6yGiczVTtSb-1920-80.jpg" mos="" align="middle" fullscreen="" width="9375" height="5273" 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>The scale of the latest investigation also shows how difficult the resulting content can be to stop. </p><p>In August, TTP researchers initially uncovered 53 ads containing child sexual abuse material across Meta's platforms. Meta subsequently said many of those ads had appeared before the company introduced new AI technology intended to improve its ability to detect violating ads when they were uploaded.</p><p>However, researchers kept finding them. In fact, TTP says it ultimately identified 332 ads containing AI-generated CSAM, with hundreds appearing after Meta had announced its improved detection technology.</p><p>That is particularly significant because these weren't simply Facebook or Instagram posts that escaped moderation. They were paid advertisements.</p><p>Meta says ads are reviewed before they're allowed to run and that automated systems play a major role in that process.</p><p>Meta spokesperson Tracy Clayton told WIRED that the company does not tolerate nudify apps or child exploitation, whether the imagery involves real children or is generated by AI. Meta said bad actors deliberately attempt to evade its detection systems and that some of the videos were harder to detect because images of children appeared only briefly or were blurred.</p><p>The company said many of the ads researchers identified had already been removed, most received fewer than 200 impressions and it received less than $5,000 in payments from the ads. But researchers documented instances in which exposure increased after an ad was reported.</p><p>TTP says one ad involving a real teenager had reached four European accounts when it was reported to Meta. Several days later, when Meta removed it, the ad had reached more than 330.</p><h2 id="the-investigation-shows-the-tools-are-mainstream">The investigation shows the tools are mainstream</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nr2x3V7xnj4xZB2RREsezb" name="year in AI 2023.jpg" alt="An AI generated image of Elon Musk on a unicorn, the ChatGPT logo on a phone and a screen shot from a video of a robot from Runway" src="https://cdn.mos.cms.futurecdn.net/nr2x3V7xnj4xZB2RREsezb-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Midjourney, Shutterstock, Runway )</span></figcaption></figure><p>Researchers found ads directing people toward nearly 50 apps available through Apple's App Store and Google's Play Store. Around 300 of the roughly 350 ads examined in the broader investigation promoted AI image or video generators, according to WIRED.</p><p>Apple told WIRED that some developers initially submitted compliant versions of their apps before subsequently adding prohibited nudification capabilities. Apple said it removed 17 of 20 apps identified by researchers and took action against the remaining three, as well as seven additional apps WIRED identified.</p><p>Google said it removed all apps included in the report and suspended hundreds of other apps for violating its policies. </p><p>Still, these finding reveal a problem that extends beyond any single platform because AI can be used to create the imagery. An app store can distribute the tool used to make it. An advertising platform can then distribute ads promoting it.</p><p>Each layer may have its own safety systems, but abusive material only needs to slip through those systems once to reach users.</p><h2 id="what-to-do-if-you-find-an-ai-generated-image-of-your-child">What to do if you find an AI-generated image of your child</h2><p>If you discover sexualized AI imagery involving your child, don't repost or widely share the image in an attempt to warn others.</p><p>Instead, preserve information that can help identify where the material appeared, such as the account name, page address and other surrounding details, and report the content directly to the platform.</p><p>In the U.S., suspected child sexual exploitation can also be reported to the <a href="https://www.missingkids.org/gethelpnow/cybertipline" target="_blank">National Center for Missing & Exploited Children's CyberTipline.</a></p><p>Parents can also use <a href="https://takeitdown.ncmec.org/" target="_blank">NCMEC's Take It Down service</a>, which is designed to help stop the online sharing of nude, partially nude or sexually explicit images or videos involving someone who was under 18. The system creates a digital fingerprint, or hash, from an image without requiring the image itself to be uploaded.</p><p>Since AI-generated imagery creates newer and more complicated scenarios, parents who aren't sure whether a manipulated image qualifies should still report what they've found rather than trying to determine that themselves.</p><h2 id="the-takeaway">The takeaway</h2><p>Parents have been warned about "sharenting" and children's digital footprints for years. Sharenting is a term that combines "sharing" and "parenting" and is the practice of parents sharing images, videos and personal details about their children on social media. </p><p>Although parents can't entirely eliminate the risk of AI abuse on the images or videos they post, but reducing the number of publicly accessible photos of your children and being more selective about what you share, can reduce the amount of material available to people who might misuse it.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/chatgpt/chatgpt-6-astra-is-here-this-one-prompt-shows-what-it-can-really-do"><strong>ChatGPT-6 Astra is here — this one prompt shows what it can really do</strong></a></li><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-gemini-claude-and-perplexity-to-rank-the-10-jobs-most-likely-to-be-replaced-by-ai-heres-what-they-all-agreed-on"><strong>I asked ChatGPT, Gemini, Claude and Perplexity to rank the 10 jobs most likely to be replaced by AI — here's what they all agreed on</strong></a></li><li><a href="https://www.tomsguide.com/ai/claude/claude-fable-5-1-is-here-this-one-prompt-shows-what-it-can-really-do"><strong>Claude Fable 5.1 is here — this one prompt shows what it can really do</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/ai-is-turning-ordinary-photos-of-kids-into-sexual-abuse-imagery-heres-how-to-protect-your-family</link>
                                                                            <description>
                            <![CDATA[ AI tools can turn ordinary photos of children into sexual abuse imagery. Here's how parents can reduce the risk and what to do if it happens. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">SMyC9P7sQtUNikxoA6MWin</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mxDfB2VNSY5Z4wWT6gPDxm-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 08 Sep 2026 17:16:27 +0000</pubDate>                                                                                                                                <updated>Tue, 08 Sep 2026 19:00:32 +0000</updated>
                                                                                                                                            <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Online Security]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Internet]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/mxDfB2VNSY5Z4wWT6gPDxm-1920-80.jpg">
                                                            <media:credit><![CDATA[Getty Images/Pavol Svantner]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Silohuette of children]]></media:description>                                                            <media:text><![CDATA[Silohuette of children]]></media:text>
                                <media:title type="plain"><![CDATA[Silohuette of children]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mxDfB2VNSY5Z4wWT6gPDxm-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>A picture of my children at the beach, my son playing soccer or even my entire family, smiling in front of our house are all examples of photos I've posted to social media. I know I'm not alone, considering just how often I've seen similar images highlighting the goings-on of modern lives. <br><br>But AI has created a disturbing new risk that allows the use of ordinary photos of real children like the ones I mentioned above, to be manipulated into sexual abuse imagery without the child — or their parents — ever knowing.<br><br>To be clear, this is not a theoretical threat.</p><h2 id="332-ai-generated-child-sexual-abuse-ads-slipped-through">332 AI-generated child sexual abuse ads slipped through</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:7110px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="bZGXCBzoz5wEX4K8t872MR" name="shutterstock_2652715669" alt="This illustrates digital connectivity with a mobile device, highlighting the Meta platform, signifying modern communication, virtual reality, and engagement in the metaverse." src="https://cdn.mos.cms.futurecdn.net/bZGXCBzoz5wEX4K8t872MR-1920-80.jpg" mos="" align="middle" fullscreen="" width="7110" height="4000" 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>A new investigation from the Tech Transparency Project (TTP) found hundreds of ads containing AI-generated child sexual abuse material (CSAM) running across Facebook and Instagram. Researchers identified four real children whose ordinary photos had been manipulated, according to <a href="https://www.wired.com/story/meta-failed-to-catch-hundreds-of-ai-child-abuse-ads-some-included-images-of-real-kids/" target="_blank">WIRED</a>, including two teenage influencers, a preteen whose image appeared on a stock-photo site and a young member of a European royal family.</p><p>In total, TTP found 332 ads containing AI-generated child sexual abuse material, or CSAM. Most depicted a child whose photograph had been manipulated using AI to make it appear they were performing a sexual act.</p><p>The findings are an alarming reminder of <a href="https://www.tomsguide.com/ai/ai-image-video/all-she-did-was-change-the-face-i-spoke-to-a-creator-whose-video-was-stolen-and-reskinned-with-ai">how generative AI has changed the risks around sharing photos of children online</a>. Creating convincing fake imagery no longer requires an explicit photograph in the first place. An ordinary picture can provide the raw material.</p><h2 id="how-ordinary-photos-become-ai-generated-abuse">How ordinary photos become AI-generated abuse</h2><p><a href="https://www.tomsguide.com/phones/i-tested-the-ai-photo-editing-tools-for-iphone-vs-google-pixel-vs-samsung-galaxy-and-theres-a-clear-winner">Generative AI image tools can take an existing photograph and modify parts of it</a> while preserving recognizable features of the person in the original.</p><p>That's what researchers say happened to several of the children identified in the <a href="https://www.tomsguide.com/ai/meta-will-start-using-your-ai-chats-to-target-ads-heres-what-that-means-and-why-critics-like-joseph-gordon-levitt-are-pushing-back">Meta ads</a>.</p><p>According to WIRED, researchers were able to trace images of four minors back to their original sources. Two were teenage influencers with public social media accounts. Another was a preteen whose photograph was available through a stock-photo website. The fourth was a young member of a European royal family.</p><p>None of those original photographs needed to contain sexual material for them to be misused.</p><p>"AI apps are making it far too easy to create realistic criminal imagery of child sexual abuse, creating the new risk of everyday photos of children being taken and transformed into sexual content," Emma Hardy, director of communications at the Internet Watch Foundation, told WIRED.</p><p>Once an ordinary image is publicly accessible, someone can potentially download it and feed it into an AI tool designed to alter photographs.</p><h2 id="meta-39-s-ai-didn-39-t-catch-hundreds-of-the-ads">Meta's AI didn't catch hundreds of the ads</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:9375px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="d6qmGSnFFXo6yGiczVTtSb" name="shutterstock_2663776741-2" alt="mark zuckerberg" src="https://cdn.mos.cms.futurecdn.net/d6qmGSnFFXo6yGiczVTtSb-1920-80.jpg" mos="" align="middle" fullscreen="" width="9375" height="5273" 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>The scale of the latest investigation also shows how difficult the resulting content can be to stop. </p><p>In August, TTP researchers initially uncovered 53 ads containing child sexual abuse material across Meta's platforms. Meta subsequently said many of those ads had appeared before the company introduced new AI technology intended to improve its ability to detect violating ads when they were uploaded.</p><p>However, researchers kept finding them. In fact, TTP says it ultimately identified 332 ads containing AI-generated CSAM, with hundreds appearing after Meta had announced its improved detection technology.</p><p>That is particularly significant because these weren't simply Facebook or Instagram posts that escaped moderation. They were paid advertisements.</p><p>Meta says ads are reviewed before they're allowed to run and that automated systems play a major role in that process.</p><p>Meta spokesperson Tracy Clayton told WIRED that the company does not tolerate nudify apps or child exploitation, whether the imagery involves real children or is generated by AI. Meta said bad actors deliberately attempt to evade its detection systems and that some of the videos were harder to detect because images of children appeared only briefly or were blurred.</p><p>The company said many of the ads researchers identified had already been removed, most received fewer than 200 impressions and it received less than $5,000 in payments from the ads. But researchers documented instances in which exposure increased after an ad was reported.</p><p>TTP says one ad involving a real teenager had reached four European accounts when it was reported to Meta. Several days later, when Meta removed it, the ad had reached more than 330.</p><h2 id="the-investigation-shows-the-tools-are-mainstream">The investigation shows the tools are mainstream</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nr2x3V7xnj4xZB2RREsezb" name="year in AI 2023.jpg" alt="An AI generated image of Elon Musk on a unicorn, the ChatGPT logo on a phone and a screen shot from a video of a robot from Runway" src="https://cdn.mos.cms.futurecdn.net/nr2x3V7xnj4xZB2RREsezb-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Midjourney, Shutterstock, Runway )</span></figcaption></figure><p>Researchers found ads directing people toward nearly 50 apps available through Apple's App Store and Google's Play Store. Around 300 of the roughly 350 ads examined in the broader investigation promoted AI image or video generators, according to WIRED.</p><p>Apple told WIRED that some developers initially submitted compliant versions of their apps before subsequently adding prohibited nudification capabilities. Apple said it removed 17 of 20 apps identified by researchers and took action against the remaining three, as well as seven additional apps WIRED identified.</p><p>Google said it removed all apps included in the report and suspended hundreds of other apps for violating its policies. </p><p>Still, these finding reveal a problem that extends beyond any single platform because AI can be used to create the imagery. An app store can distribute the tool used to make it. An advertising platform can then distribute ads promoting it.</p><p>Each layer may have its own safety systems, but abusive material only needs to slip through those systems once to reach users.</p><h2 id="what-to-do-if-you-find-an-ai-generated-image-of-your-child">What to do if you find an AI-generated image of your child</h2><p>If you discover sexualized AI imagery involving your child, don't repost or widely share the image in an attempt to warn others.</p><p>Instead, preserve information that can help identify where the material appeared, such as the account name, page address and other surrounding details, and report the content directly to the platform.</p><p>In the U.S., suspected child sexual exploitation can also be reported to the <a href="https://www.missingkids.org/gethelpnow/cybertipline" target="_blank">National Center for Missing & Exploited Children's CyberTipline.</a></p><p>Parents can also use <a href="https://takeitdown.ncmec.org/" target="_blank">NCMEC's Take It Down service</a>, which is designed to help stop the online sharing of nude, partially nude or sexually explicit images or videos involving someone who was under 18. The system creates a digital fingerprint, or hash, from an image without requiring the image itself to be uploaded.</p><p>Since AI-generated imagery creates newer and more complicated scenarios, parents who aren't sure whether a manipulated image qualifies should still report what they've found rather than trying to determine that themselves.</p><h2 id="the-takeaway">The takeaway</h2><p>Parents have been warned about "sharenting" and children's digital footprints for years. Sharenting is a term that combines "sharing" and "parenting" and is the practice of parents sharing images, videos and personal details about their children on social media. </p><p>Although parents can't entirely eliminate the risk of AI abuse on the images or videos they post, but reducing the number of publicly accessible photos of your children and being more selective about what you share, can reduce the amount of material available to people who might misuse it.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/chatgpt/chatgpt-6-astra-is-here-this-one-prompt-shows-what-it-can-really-do"><strong>ChatGPT-6 Astra is here — this one prompt shows what it can really do</strong></a></li><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-gemini-claude-and-perplexity-to-rank-the-10-jobs-most-likely-to-be-replaced-by-ai-heres-what-they-all-agreed-on"><strong>I asked ChatGPT, Gemini, Claude and Perplexity to rank the 10 jobs most likely to be replaced by AI — here's what they all agreed on</strong></a></li><li><a href="https://www.tomsguide.com/ai/claude/claude-fable-5-1-is-here-this-one-prompt-shows-what-it-can-really-do"><strong>Claude Fable 5.1 is here — this one prompt shows what it can really do</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve been using MelGeek’s Made68 Ultra V2 for three weeks and I’m in love with its magnetic switches, slick styling and clean sound ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I’ve been through a handful of magnetic‑switch boards over the last few months, and in that time I’ve figured out what I actually want from them — precise actuation, a clean, non‑ringy acoustic, and a weighty, stable case that keeps the sound consistent. MelGeek’s Made68 Ultra V2 is the closest to that sweet spot I’ve tested so far: the magnetic action hits the right balance of smooth and snappy, the chassis keeps resonance in check, and the overall sound leans towards deep and satisfying rather than bright or clacky.</p><p>It also looks the business, with a simple yet stylish vibe that’s undeniably aimed at gamers — its translucent keycaps and personalised lighting are testaments to that — but still manages to bring a level of refinement and precision that’d let it slip onto the desk of the average ultra‑modern professional without looking too out of place.</p><p>As someone who hardly ever uses a numpad, 75% keyboards are typically my favourite layout. However, the Made68 Ultra V2’s 65% layout doesn’t feel compromised to me — it’s compact without feeling cramped, and every key is within easy reach for smooth, accurate typing. </p><p>As for gaming, the Ultra V2 delivers all the high end features you’d expect from a keyboard with Hall effect switches, along with some sweet AI-powered lighting control options that give the board a personality all of its own.</p><p>While I can think of a couple of small additions that would make it the perfect keyboard for me, I could easily see myself using the Made68 Ultra V2 as my daily driver for years to come — here’s why.</p><h2 id="it-sounds-fantastic-and-feels-remarkably-precise">It sounds fantastic and feels remarkably precise</h2><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="FLbrBrk3kWBrcsPvbxQJhY" name="20260908_142342" alt="MelGeek Made68 Ultra V2 close-up on keys" src="https://cdn.mos.cms.futurecdn.net/FLbrBrk3kWBrcsPvbxQJhY-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Made68 Ultra V2 I tested arrived with magnetic KOM Lite switches pre-installed, which lend the board a slightly lighter, more relaxed character. They land in a good middle-ground between creamy and snappy, leaning more towards a brighter sound than a deep thick one. The magnetic action feels smooth and predictable, with switches that provide a consistent, uniform press across the layout. That said, there’s no plasticky clack — just a clean, crispy sound that’s easy to settle into. </p><p>A big part of that comes down to MelGeek’s 6‑way silicone dampening and the use of a silicone gasket mount. I prefer it to the “foam everywhere” approach that some keyboards employ — the board feels cushioned without being mushy, and the silicone layers do a great job of minimising resonance. You get a firm, planted bottom‑out rather than a soft bounce, and the sound stays tight even when you’re typing furiously.</p><p>Compared to some of the creamier magnetic boards out there, the Made68 Ultra V2 is more focused on a clean, consistent feel. I recently tested <a href="https://www.tomsguide.com/computing/keyboards/i-almost-found-my-dream-keyboard-in-the-gravastar-mercury-v60-pro-if-it-werent-for-three-finicky-details">GravaStar’s Mercury V60 Pro</a>, and while I did prefer that keyboard’s deeper, chocolatey thock, the Ultra V2’s calmer, more controlled tone is admittedly easier to live with day‑to‑day — and far less distracting to those around you.</p><h2 id="exceptional-gaming-performance">Exceptional gaming performance</h2><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="wrxJ7oeVvbe6LX5AWmkVbe" name="20260908_143120" alt="MelGeek Made68 Ultra V2 with some keycaps and a switch removed" src="https://cdn.mos.cms.futurecdn.net/wrxJ7oeVvbe6LX5AWmkVbe-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As great as the Made68 Ultra V2 is for typing, it truly soars for gaming. Its magnetic switches provide adjustable actuation and rapid trigger functionality as expected, and you can really dial them into your ideal settings using MelGeek’s browser-based Hive 2.0 software. You can drop actuation right down to 0.1mm for quick reactions or push it higher if you prefer a firmer, more deliberate press. The board tracks movement with 0.01mm precision, so even tiny lifts or taps register straight away.</p><p>Rapid Trigger is just as sharp. Keys reset the moment you lift them, even slightly, thanks to an adjustable RT range that goes all the way down to 0.01mm. At those extreme low settings it can feel a bit too sensitive — you’ll occasionally fire an input just by brushing a key or shifting your hand. Thankfully, you can tailor it to your liking — in my experience, bumping actuation or RT up even a fraction gives you a more controlled feel without losing the speed that makes magnetic switches great for fast‑paced games.</p><p>Latency is properly low, with 8,000Hz polling, a 16,000Hz scan rate, and a listed 0.125ms response time. In practice, the board keeps up whether you’re flicking through menus or right in the thick of a battle, instantly responding to your inputs in a clean, predictable manner.</p><h2 id="ai-powered-lighting-and-personalisation">AI-powered lighting and personalisation</h2><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="ktw8RTc4RngUgHAdVGJqXk" name="20260908_142633" alt="MelGeek Made68 Ultra V2 rear view showing light bar and mode button" src="https://cdn.mos.cms.futurecdn.net/ktw8RTc4RngUgHAdVGJqXk-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You can take personalisation even further with the hardware itself. The Ultra V2’s light bar can be customised to match whatever theme you’re running, though its purple tint does prevent certain colours from showing as intended. MelGeek also sells 3D‑printed light guide panels, which (in theory) let you shape how the RGB spreads across the sides of the case, as well as swappable side panels which can be easily screwed on, though both products have been sold out on MelGeek’s website for as long as I’ve been testing the Ultra V2.</p><p>The board’s AI‑powered lighting layer sits over the top of the usual RGB controls, adding a bit of smarts without turning the whole thing into a light show. Instead of cycling through random effects, it reacts to what you’re doing and keeps the lighting feeling relevant rather than noisy. In practice, it tends to make small, practical adjustments as you move between tasks or games, giving the keyboard a sense of personality without demanding constant tinkering.</p><p>Hive 2.0 gives you solid control — per‑key colours, simple dynamic effects, macros, profiles and all the usual tuning options are there, even if the lighting system itself is still pretty limited compared to what the hardware could do. You can set up game‑specific profiles (and cycle through them using a physical ‘mode’ button underneath the lightbar on the right side), adjust brightness curves or just keep things simple with a single clean theme, and once you’ve saved a profile the board switches between them quickly and reliably. If you want more traditional control of the Ultra V2’s RGB, Hive 2.0 handles that too, though it’s a bit more basic than competing software, with only per‑key static lighting and no support for layered or multi‑zone effects.</p><p>Real‑Time Game Sync (VCT) is the arguably the flashiest part of the package, but it’s handled with a light touch. Instead of blasting the whole board with rainbow effects, it reacts to in‑game events, like health changes or the use of skills and abilities, making your game feel more immersive without pulling your eyes off the screen. </p><h2 id="two-small-misses">Two small misses</h2><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="6eEmfDUMqgw9n2rhaBEeuK" name="20260908_152448" alt="MelGeek Made68 Ultra V2 side view showing side glow and side panels" src="https://cdn.mos.cms.futurecdn.net/6eEmfDUMqgw9n2rhaBEeuK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>On a board that otherwise nails fundamentals, there are two design choices that stand out as avoidable compromises. First, there’s no dedicated volume knob or rocker. Once you’ve used a physical control, its absence sticks out straight away. Sure, you can bump the volume up or down by holding Fn and tapping the arrow keys, but I can’t imagine anyone on this blue planet choosing that over a simple knob — it’s one of those small conveniences that matters more than you expect, especially when you need to drop the volume in a hurry.</p><p>Second, the stock transparent keycaps are a mixed bag. They look distinctive, but they don’t diffuse RGB softly — the LEDs appear more direct and clinical than the warm glow you get with thicker, opaque PBT caps. On top of that, the transparency and dark purple text can make the keys harder to read if you do ever need to look down. And while I love how the Ultra V2 sounds, the clear caps don’t help the board reach its full potential — I haven’t had a chance to test it myself, but I bet that swapping to a denser PBT set will deepen and tighten the sound even further than it already is.</p><p>The Made68 Ultra V2 is a refined, well‑built keyboard that prioritises consistent feel, controlled acoustics and high-level gaming precision. It may not be the loudest or most characterful option, but it has consistently delivered one of the most comfortable and dependable typing experiences I’ve had recently. If you value typing comfort, stability and a mature build, it’s worth considering — just be prepared to use shortcuts for volume control or different keycaps if those two omissions matter to you.</p><div data-widget-type="productname" data-model-name="MelGeek Made68 Ultra V2"></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/computing/peripherals/mechanical-keyboards-are-dead-heres-why-you-should-only-buy-a-magnetic-keyboard-for-gaming">Here’s why you should only buy a magnetic keyboard for gaming</a></li><li><a href="https://www.tomsguide.com/computing/keyboards/i-almost-found-my-dream-keyboard-in-the-gravastar-mercury-v60-pro-if-it-werent-for-three-finicky-details">The GravaStar Mercury V60 Pro is almost perfect except for three finicky details</a></li><li><a href="https://www.tomsguide.com/computing/keyboards/corsairs-vanguard-pro-96-keyboard-has-convinced-me-that-magnetic-switches-arent-just-hype">Corsair’s Vanguard Pro 96 keyboard has convinced me that magnetic switches aren’t just hype</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/keyboards/ive-been-using-melgeeks-made68-ultra-v2-for-three-weeks-and-im-in-love-with-its-magnetic-switches-slick-styling-and-clean-sound</link>
                                                                            <description>
                            <![CDATA[ MelGeek's Made68 Ultra V2 magnetic keyboard is a dream for both gaming and typing — here are my main takeaways after three weeks of continuous use. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">jtRxw55bSN3zTkCf7uVjd3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/2QVt8nHmvqrUer5NCgsQDK-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 08 Sep 2026 06:21:54 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Keyboards]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                                                                                    <dc:creator><![CDATA[ Stephen Lambrechts ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/JN3jEQpqyyt32as8AJJqXe-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Stephen Lambrechts is the Managing Editor of Tom&#039;s Guide AU and has written professionally across the categories of tech, film, television and gaming for the last 15 years. Before Tom&#039;s Guide, he spent several years as a Senior Journalist at TechRadar, had a brief stint as Editor in Chief at Official Xbox Magazine Australia, and worked at IGN. He&#039;s also written for such mags and sites as APC, TechLife Australia, T3, FilmInk, Daily Telegraph and AskMen. Additionally, he&#039;s a Tomatometer-approved critic on Rotten Tomatoes, and has offered his tech advice on radio and television.&lt;/p&gt;&lt;p&gt;He&#039;s an expert when it comes to smartphones, TVs, gaming and streaming, having contributed many reviews in each of those categories over the years. Despite his many articles on streaming, he&#039;s a passionate collector of physical media who enjoys listening to vinyl records and acquiring obscure horror movies from the &#039;60s, &#039;70s and 80s. He can usually be seen rocking the latest retro sneaker releases, particularly Air Jordans and Reebok Pumps. Occasionally, he also indulges in other non-hipster stuff, like hiking.&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/2QVt8nHmvqrUer5NCgsQDK-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[MelGeek Made68 Ultra V2 keyboard on desk]]></media:description>                                                            <media:text><![CDATA[MelGeek Made68 Ultra V2 keyboard on desk]]></media:text>
                                <media:title type="plain"><![CDATA[MelGeek Made68 Ultra V2 keyboard on desk]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/2QVt8nHmvqrUer5NCgsQDK-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ve been through a handful of magnetic‑switch boards over the last few months, and in that time I’ve figured out what I actually want from them — precise actuation, a clean, non‑ringy acoustic, and a weighty, stable case that keeps the sound consistent. MelGeek’s Made68 Ultra V2 is the closest to that sweet spot I’ve tested so far: the magnetic action hits the right balance of smooth and snappy, the chassis keeps resonance in check, and the overall sound leans towards deep and satisfying rather than bright or clacky.</p><p>It also looks the business, with a simple yet stylish vibe that’s undeniably aimed at gamers — its translucent keycaps and personalised lighting are testaments to that — but still manages to bring a level of refinement and precision that’d let it slip onto the desk of the average ultra‑modern professional without looking too out of place.</p><p>As someone who hardly ever uses a numpad, 75% keyboards are typically my favourite layout. However, the Made68 Ultra V2’s 65% layout doesn’t feel compromised to me — it’s compact without feeling cramped, and every key is within easy reach for smooth, accurate typing. </p><p>As for gaming, the Ultra V2 delivers all the high end features you’d expect from a keyboard with Hall effect switches, along with some sweet AI-powered lighting control options that give the board a personality all of its own.</p><p>While I can think of a couple of small additions that would make it the perfect keyboard for me, I could easily see myself using the Made68 Ultra V2 as my daily driver for years to come — here’s why.</p><h2 id="it-sounds-fantastic-and-feels-remarkably-precise">It sounds fantastic and feels remarkably precise</h2><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="FLbrBrk3kWBrcsPvbxQJhY" name="20260908_142342" alt="MelGeek Made68 Ultra V2 close-up on keys" src="https://cdn.mos.cms.futurecdn.net/FLbrBrk3kWBrcsPvbxQJhY-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Made68 Ultra V2 I tested arrived with magnetic KOM Lite switches pre-installed, which lend the board a slightly lighter, more relaxed character. They land in a good middle-ground between creamy and snappy, leaning more towards a brighter sound than a deep thick one. The magnetic action feels smooth and predictable, with switches that provide a consistent, uniform press across the layout. That said, there’s no plasticky clack — just a clean, crispy sound that’s easy to settle into. </p><p>A big part of that comes down to MelGeek’s 6‑way silicone dampening and the use of a silicone gasket mount. I prefer it to the “foam everywhere” approach that some keyboards employ — the board feels cushioned without being mushy, and the silicone layers do a great job of minimising resonance. You get a firm, planted bottom‑out rather than a soft bounce, and the sound stays tight even when you’re typing furiously.</p><p>Compared to some of the creamier magnetic boards out there, the Made68 Ultra V2 is more focused on a clean, consistent feel. I recently tested <a href="https://www.tomsguide.com/computing/keyboards/i-almost-found-my-dream-keyboard-in-the-gravastar-mercury-v60-pro-if-it-werent-for-three-finicky-details">GravaStar’s Mercury V60 Pro</a>, and while I did prefer that keyboard’s deeper, chocolatey thock, the Ultra V2’s calmer, more controlled tone is admittedly easier to live with day‑to‑day — and far less distracting to those around you.</p><h2 id="exceptional-gaming-performance">Exceptional gaming performance</h2><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="wrxJ7oeVvbe6LX5AWmkVbe" name="20260908_143120" alt="MelGeek Made68 Ultra V2 with some keycaps and a switch removed" src="https://cdn.mos.cms.futurecdn.net/wrxJ7oeVvbe6LX5AWmkVbe-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As great as the Made68 Ultra V2 is for typing, it truly soars for gaming. Its magnetic switches provide adjustable actuation and rapid trigger functionality as expected, and you can really dial them into your ideal settings using MelGeek’s browser-based Hive 2.0 software. You can drop actuation right down to 0.1mm for quick reactions or push it higher if you prefer a firmer, more deliberate press. The board tracks movement with 0.01mm precision, so even tiny lifts or taps register straight away.</p><p>Rapid Trigger is just as sharp. Keys reset the moment you lift them, even slightly, thanks to an adjustable RT range that goes all the way down to 0.01mm. At those extreme low settings it can feel a bit too sensitive — you’ll occasionally fire an input just by brushing a key or shifting your hand. Thankfully, you can tailor it to your liking — in my experience, bumping actuation or RT up even a fraction gives you a more controlled feel without losing the speed that makes magnetic switches great for fast‑paced games.</p><p>Latency is properly low, with 8,000Hz polling, a 16,000Hz scan rate, and a listed 0.125ms response time. In practice, the board keeps up whether you’re flicking through menus or right in the thick of a battle, instantly responding to your inputs in a clean, predictable manner.</p><h2 id="ai-powered-lighting-and-personalisation">AI-powered lighting and personalisation</h2><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="ktw8RTc4RngUgHAdVGJqXk" name="20260908_142633" alt="MelGeek Made68 Ultra V2 rear view showing light bar and mode button" src="https://cdn.mos.cms.futurecdn.net/ktw8RTc4RngUgHAdVGJqXk-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You can take personalisation even further with the hardware itself. The Ultra V2’s light bar can be customised to match whatever theme you’re running, though its purple tint does prevent certain colours from showing as intended. MelGeek also sells 3D‑printed light guide panels, which (in theory) let you shape how the RGB spreads across the sides of the case, as well as swappable side panels which can be easily screwed on, though both products have been sold out on MelGeek’s website for as long as I’ve been testing the Ultra V2.</p><p>The board’s AI‑powered lighting layer sits over the top of the usual RGB controls, adding a bit of smarts without turning the whole thing into a light show. Instead of cycling through random effects, it reacts to what you’re doing and keeps the lighting feeling relevant rather than noisy. In practice, it tends to make small, practical adjustments as you move between tasks or games, giving the keyboard a sense of personality without demanding constant tinkering.</p><p>Hive 2.0 gives you solid control — per‑key colours, simple dynamic effects, macros, profiles and all the usual tuning options are there, even if the lighting system itself is still pretty limited compared to what the hardware could do. You can set up game‑specific profiles (and cycle through them using a physical ‘mode’ button underneath the lightbar on the right side), adjust brightness curves or just keep things simple with a single clean theme, and once you’ve saved a profile the board switches between them quickly and reliably. If you want more traditional control of the Ultra V2’s RGB, Hive 2.0 handles that too, though it’s a bit more basic than competing software, with only per‑key static lighting and no support for layered or multi‑zone effects.</p><p>Real‑Time Game Sync (VCT) is the arguably the flashiest part of the package, but it’s handled with a light touch. Instead of blasting the whole board with rainbow effects, it reacts to in‑game events, like health changes or the use of skills and abilities, making your game feel more immersive without pulling your eyes off the screen. </p><h2 id="two-small-misses">Two small misses</h2><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="6eEmfDUMqgw9n2rhaBEeuK" name="20260908_152448" alt="MelGeek Made68 Ultra V2 side view showing side glow and side panels" src="https://cdn.mos.cms.futurecdn.net/6eEmfDUMqgw9n2rhaBEeuK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>On a board that otherwise nails fundamentals, there are two design choices that stand out as avoidable compromises. First, there’s no dedicated volume knob or rocker. Once you’ve used a physical control, its absence sticks out straight away. Sure, you can bump the volume up or down by holding Fn and tapping the arrow keys, but I can’t imagine anyone on this blue planet choosing that over a simple knob — it’s one of those small conveniences that matters more than you expect, especially when you need to drop the volume in a hurry.</p><p>Second, the stock transparent keycaps are a mixed bag. They look distinctive, but they don’t diffuse RGB softly — the LEDs appear more direct and clinical than the warm glow you get with thicker, opaque PBT caps. On top of that, the transparency and dark purple text can make the keys harder to read if you do ever need to look down. And while I love how the Ultra V2 sounds, the clear caps don’t help the board reach its full potential — I haven’t had a chance to test it myself, but I bet that swapping to a denser PBT set will deepen and tighten the sound even further than it already is.</p><p>The Made68 Ultra V2 is a refined, well‑built keyboard that prioritises consistent feel, controlled acoustics and high-level gaming precision. It may not be the loudest or most characterful option, but it has consistently delivered one of the most comfortable and dependable typing experiences I’ve had recently. If you value typing comfort, stability and a mature build, it’s worth considering — just be prepared to use shortcuts for volume control or different keycaps if those two omissions matter to you.</p><div data-widget-type="productname" data-model-name="MelGeek Made68 Ultra V2"></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/computing/peripherals/mechanical-keyboards-are-dead-heres-why-you-should-only-buy-a-magnetic-keyboard-for-gaming">Here’s why you should only buy a magnetic keyboard for gaming</a></li><li><a href="https://www.tomsguide.com/computing/keyboards/i-almost-found-my-dream-keyboard-in-the-gravastar-mercury-v60-pro-if-it-werent-for-three-finicky-details">The GravaStar Mercury V60 Pro is almost perfect except for three finicky details</a></li><li><a href="https://www.tomsguide.com/computing/keyboards/corsairs-vanguard-pro-96-keyboard-has-convinced-me-that-magnetic-switches-arent-just-hype">Corsair’s Vanguard Pro 96 keyboard has convinced me that magnetic switches aren’t just hype</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested MSI’s Roamii BE Pro mesh router and it’s a fast and affordable way to upgrade to Wi-Fi 7 ]]></title>
                                                                                                <dc:content><![CDATA[ <div  class="fancy-box"><div class="fancy_box-title">MSI Roamii BE Pro: Specs</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Wi-Fi specification: </strong>BE11000 (802.11be)<br><strong>Number of antennas/removable: </strong>6/No<br><strong>Ports: </strong>One 2.5  Gbps WAN input, three 2.5  Gbps LAN, USB 3.0<br><strong>Processor speed: </strong>Quad-core 1.5GHz<br><strong>Wi-Fi chip: </strong>Qualcomm IPQ5322<br><strong>Peak 802.11be performance: </strong>1.89 Gbps (at 15 feet)<br><strong>Maximum range: </strong>110 feet<br><strong>Size: </strong>9.9 x 4.7 x 4.3 inches<br><strong>Estimated annual electricity cost: </strong>$27.60 (for router and one satellite)</p></div></div><p>MSI has updated its Roamii BE Lite mesh platform for peak performance with the Roamii BE Pro by employing the 6GHz transmission band and many of Wi-Fi 7’s best tricks to speed the flow of data. Its nanocarbon coated heat fins keep the units from overheating while the BE Pro ups the mesh hardware’s top speed and network security stance. The mesh set comes with the bonus of well-designed wall brackets for easy mounting.</p><p>Unfortunately, you can only get Romai BE Pro units, like Noah’s ark, two at a time. But, at half the price of other tri-band Wi-Fi 7 mesh gear, the Roamii BE Pro is a cheap thrill that has the power to turn a home into a Wi-Fi palace. </p><p>My MSI Roami BE Pro review will help you decide if this is the <a href="https://www.tomsguide.com/computing/routers/best-mesh-wi-fi-systems">best mesh Wi-Fi system</a> for your home along with one of the <a href="https://www.tomsguide.com/best-picks/best-Wi-fi-7-routers">best Wi-Fi 7 routers</a> for those who haven’t upgraded to the latest wireless standard yet.</p><h3 class="article-body__section" id="section-msi-roamii-be-pro-review-pricing-and-availability"><span>MSI Roamii BE Pro review: Pricing and availability</span></h3><p>Following on the heels of the inexpensive dual-band <a href="https://www.tomsguide.com/computing/routers/msi-roamii-be-lite-review">Roamii BE Lite</a>, MSI’s tri-band Roamii BE Pro stays true to its predecessor’s value-oriented roots but isn’t available on its own or in a three-pack. MSI sells $280 Roamii BE Pro two-packs versus the Roamii BE Lite’s $200. A single <a href="https://www.tomsguide.com/computing/routers/netgear-orbi-770-review">Netgear Orbi 770</a> node sells for $300. </p><p>The Roamii BE Pro pair is rated to cover 6,000 square feet, about equal with the Orbi 770 pair’s 5,500 square feet.   </p><h3 class="article-body__section" id="section-msi-roamii-be-pro-review-design"><span>MSI Roamii BE Pro review: Design</span></h3><p>In the spirit of creative destruction, MSI has rewritten its Wi-Fi rulebook with its economical Roamii BE Pro mesh kit. At half what competitors’ charge for mesh units, the Roamii BE Pro outdoes the BE Lite’s “meh” performance with higher data speeds, extra range and handy wall brackets. </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="rEtHLRBB6i35cHfXcBwmRW" name="MSI Roamii BE Pro-3" alt="The top of MSI Roamii BE Pro router" src="https://cdn.mos.cms.futurecdn.net/rEtHLRBB6i35cHfXcBwmRW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>At 9.9 x 4.7 x 4.3 inches, the white triangular Roamii BE Pro towers are slightly taller than the BE Lite units but smaller than the bulbous Orbi 770 oval devices. The big “7” inscribed on its side describes its Wi-Fi rating and MSI provides matching plastic wall brackets that make the units seem to float in space. </p><p>For most, the Roamii BE Pro will be well connected with a 2.5 Gbps input and three 2.5 Gbps downstream wired networking connections. The well-networked among us might miss an additional port, though. Still, the Roamii BE Pro’s USB Type A port can make the contents of a storage device available across a network; the Orbi 770 can’t do this. Neither the BE Pro nor Orbi 770 can provide internet backup service with a mobile phone during a broadband blackout, something several Asus routers do. </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="Hba9yfGYQVhEnazJBTrzQW" name="MSI Roamii BE Pro-2" alt="MSI Roamii BE Pro router on a windowsill" src="https://cdn.mos.cms.futurecdn.net/Hba9yfGYQVhEnazJBTrzQW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There’s a small LED that glows white up front when online, but flashes if there’s a connection problem and turns orange when offline. The LEDs underneath can show any of 10 flashy patterns but offer nothing to indicate performance. Thankfully, it can be turned off. </p><p>Based on Qualcomm’s IPQ5322 Wi-Fi 7 platform, the system’s 1.5GHz quadcore processor can connect 200 devices – overkill for the typical digital household. Its six internal antennas produce a spherical transmission pattern to connect over the 2.4, 5.0- and 6GHz bands for a theoretical throughput of 10.975 Gbps, just about matching the Orbi 770’s potential.</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="EzqNBecjMMtARS8mT9WAXW" name="MSI Roamii BE Pro-4" alt="The ports on a MSI Roamii BE Pro router" src="https://cdn.mos.cms.futurecdn.net/EzqNBecjMMtARS8mT9WAXW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The mesh devices have 320MHz data channels, 4K Quadrature Amplitude Modulation (QAM) and Multi-Link Operations (MLO) but Automated Frequency Control (AFC) for maximizing its 6GHz transmission strength. Its optimized passive cooling uses ultra-efficient black nanocarbon-coated heat sinks that pull heat away from its components. The top vent hit a peak temperature of 108 degrees Fahrenheit during testing.</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="su6FSRaHFMwB5qF9xaASVV" name="MSI Roamii BE Pro-pro-thermal-a" alt="Thermal imaging of the MSI Roamii BE Pro router" src="https://cdn.mos.cms.futurecdn.net/su6FSRaHFMwB5qF9xaASVV-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1148" 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 Roamii BE Pro can protect as a Virtual Private Network server. Plus, MSI’s FortiSecu online defenses use <a href="https://www.tomsguide.com/reviews/trend-micro"><u>Trend Micro</u></a> software, for everything from parental control software to defenses against recent exploits. Unlike competitors, there are no subscription fees for updates. </p><p>Its three-year warranty beats mesh sets at double its price and MSI promises personalized technical support for the product’s life, not just 90-days. The support site includes new firmware and MSI’s 76-page manual to help with the VPN server.</p><h3 class="article-body__section" id="section-msi-roamii-be-pro-review-performance"><span>MSI Roamii BE Pro review: Performance</span></h3><p>A big step up from the MSI Roamii BE Lite, the BE Pro pair still couldn’t fill my 3,500 square foot home with Wi-Fi. Likely a third (and obligatory fourth) unit would have helped. Based on results from Keysight’s <a href="https://www.keysight.com/us/en/products/ethernet-traffic-emulation/protocol-and-load-test-l4-7-emulation-software/ixchariot.html"><u>IxChariot</u></a> networking benchmark set to mimic 10 data-hungry users and an HP Envy X360 test machine, the Roamii BE Pro was surprisingly powerful. </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="YAVWTtfAfGpAkaDjcyA3dW" name="MSI Roamii BE Pro-6" alt="MSI Roamii BE Pro router on a side table" src="https://cdn.mos.cms.futurecdn.net/YAVWTtfAfGpAkaDjcyA3dW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>With 15 feet of Cat 7 cabling connecting the router and test system, the benchmark reading of 3.711 Gbps makes it perfect for those with multi-gig data plans. It was short of the <a href="https://www.tomsguide.com/computers/routers/tp-link-archer-ge800-review">TP-Link Archer GE800</a> at 4.449 Gbps of wired throughput, however. Its 2.299 Gbps close-up Wi-Fi test result was just as impressive and 20% ahead of the more expensive Orbi 770’s 1.920 Gbps. </p><p>At the real-world wireless distance of 15 feet, the Roamii BE Pro delivered 1.885 Gbps, nearly double the BE Lite’s 970.3 Mbps but equivalent to the <a href="https://www.tomsguide.com/computing/routers/eero-pro-7-review">eero Pro 7</a> at 1.905 Gbps. Bottom line: it should satisfy a data-hungry connected family.</p><div ><table><tbody><tr><td class="firstcol " ><p> </p></td><td  ><p><strong>MSI Roamii BE Pro</strong></p></td><td  ><p><strong>eero Pro 7</strong></p></td><td  ><p><strong>Netgear Orbi 770</strong></p></td><td  ><p><strong>TP-Link Deco BE85</strong></p></td><td  ><p><strong>MSI Roamii BE Lite</strong></p></td></tr><tr><td class="firstcol " ><p><strong>15 feet</strong></p></td><td  ><p> 1.885  Gbps</p></td><td  ><p>1.905  Gbps</p></td><td  ><p>1.721  Gbps</p></td><td  ><p>1.736  Gbps</p></td><td  ><p>970.3 Mbps</p></td></tr><tr><td class="firstcol " ><p><strong>50 feet</strong></p></td><td  ><p> 815.2 Mbps</p></td><td  ><p>994.4 Mbps</p></td><td  ><p>391.1 Mbps</p></td><td  ><p>790.4 Mbps</p></td><td  ><p>470.5 Mbps</p></td></tr><tr><td class="firstcol " ><p><strong>75 feet</strong></p></td><td  ><p> 197.9 Mbps</p></td><td  ><p>234.7 Mbps</p></td><td  ><p>199.2 Mbps</p></td><td  ><p>179.2 Mbps</p></td><td  ><p>172.8 Mbps</p></td></tr><tr><td class="firstcol " ><p><strong>90 feet</strong></p></td><td  ><p> 66.3 Mbps</p></td><td  ><p>20.8 Mbps</p></td><td  ><p>54.2 Mbps</p></td><td  ><p>42.6 Mbps</p></td><td  ><p>46.7 Mbps</p></td></tr></tbody></table></div><p>Its 815.2 Mbps of throughput at 50 feet was among the best in class and only outdone by the eero Pro 7’s 994.4 Mbps. At 75 feet, the Roamii BE Pro moved 197.9 Mbps, putting it roughly level with the Orbi 770’s 199.2 Mbps but behind the eero Pro 7’s 234.7 Mbps.</p><p>At the terminal distance of 90 feet, it registered 66.3 Mbps, leading the field, including mesh kits costing twice as much. It performed well on our wall penetration test where the signal is sent across a 25-foot room and through a wall. The Roamii BE Pro moved 1.280 Mbps, just off the Orbi 770’s 1.318 Gbps. </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="kcQMjFdKZLHjDjz5raPSjW" name="MSI Roamii BE Pro-5" alt="MSI Roamii BE Pro router on a side table" src="https://cdn.mos.cms.futurecdn.net/kcQMjFdKZLHjDjz5raPSjW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>With a range of 110 feet, it is a mesh set that should fill a modest sized home with fast data and linked well with its mesh node set up a floor above the host router. With the test system 40 feet away, the network moved 642.0 Mbps, handily beating the Orbi 770’s 404.4 Mbps. </p><p>Over two weeks of daily use, the Roamii BE Pro doled out data for 4K video, gaming, heavy downloads and everyday emails. Along the way, the router and node used 9.4 and 8.6 watts, translating into an annual electricity bill of $27.60 if they’re left on 24/7 and you pay the national average electricity of 17.5 cents per kilowatt hour. It’s spot on with the eero Pro 7’s $27.90 under the same conditions.</p><h3 class="article-body__section" id="section-msi-roamii-be-pro-review-setup"><span>MSI Roamii BE Pro review: Setup</span></h3><p>Out of the box, the Roamii BE Pro units are identical. I picked one as the host router and the other as the network’s node and set them up using MSI’s Router 2.0 app with my Samsung Galaxy S25 phone; there are versions for both iOS and Android.  Alternatively, I could have set it up using “msirouter.login” and a browser.</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="J9QpLCLmWrVRdxt3uo9sQV" name="MSI Roamii BE Pro-node" alt="MSI Roamii BE Pro router app screenshot" src="https://cdn.mos.cms.futurecdn.net/J9QpLCLmWrVRdxt3uo9sQV-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1148" 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>After snapping the QR code underneath, I added my network name, admin password and answered two challenge questions. I was in, added the node upstairs and ran a firmware update. I was done in 15 minutes.  </p><h3 class="article-body__section" id="section-roamii-be-pro-review-configuration"><span>Roamii BE Pro review: Configuration</span></h3><p>Like the installation, monitoring and configuration changes can be done through the app or the device’s browser interface. The app’s Dashboard screen shows how many Roamii devices are online, up- and download speeds and offers a WiFi Share QR code for a trusted friend or if you rent out a property.</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="TqCc4VPXiJFzbmtsHRaDPV" name="MSI Roamii BE Pro-app-dash" alt="MSI Roamii BE Pro router app screenshot" src="https://cdn.mos.cms.futurecdn.net/TqCc4VPXiJFzbmtsHRaDPV-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1148" 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>Below are tabs for Security and Parental while Advanced includes LED Management for selecting the lighting effect or turning it off. There’s no brightness control, though.</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="4BhTcfjofbrtNfn9iyqJNV" name="MSI Roamii BE Pro-app-led" alt="MSI Roamii BE Pro router app screenshot" src="https://cdn.mos.cms.futurecdn.net/4BhTcfjofbrtNfn9iyqJNV-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1148" 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 Roamii BE Pro’s similar browser-based dashboard has IP details, number of clients and processor usage gauge. Its traffic analyzer is great for viewing the data flow. </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:1605px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="dWFUzfEkxaBpV7JQE9oumV" name="MSI Roamii BE Pro-firmware" alt="Screenshot of the MSI Roamii BE Pro router settings page" src="https://cdn.mos.cms.futurecdn.net/dWFUzfEkxaBpV7JQE9oumV-1920-80.jpg" mos="" align="middle" fullscreen="" width="1605" height="903" 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><h3 class="article-body__section" id="section-msi-roamii-be-pro-review-verdict"><span>MSI Roamii BE Pro review: Verdict </span></h3><p>MSI’s Roamii BE Pro takes a big networking step forward with a sharp design aesthetic and its ability to efficiently move data around a small to midsized house. Its security is thorough and the Roamii BE Pro’s 2.5 Gbps networking connections should satisfy most digital families, although a fourth port would have been appreciated. </p><p>With performance that led the pack at times, it lacks Automated Frequency Control to push this further. The Roamii BE Pro’s stratospheric throughput is all the more amazing considering its down-to-earth price. At $280 for two Roamii BE Pro devices, it’s not a bad idea to get an extra two-pack and have nodes to fill in dead zones. Afterall, it’s cheap enough.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/routers/msi-roamii-be-pro-review</link>
                                                                            <description>
                            <![CDATA[ The MSI Roamii BE Pro is a big step up over its predecessor with tri-band connectivity and improved performance but at a reasonable, budget-friendly price. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">2E9CVAdAzmdfsnSFphaotB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/5GJPRMeN8XJK6mEHH9STeW-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 07 Sep 2026 10:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Routers]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Computing Hardware]]></category>
                                                                                                                    <dc:creator><![CDATA[ Brian Nadel ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/qLSkrTG95GayrZcQmwLa2N-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/5GJPRMeN8XJK6mEHH9STeW-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[MSI Roamii BE Pro router on a bookshelf]]></media:description>                                                            <media:text><![CDATA[MSI Roamii BE Pro router on a bookshelf]]></media:text>
                                <media:title type="plain"><![CDATA[MSI Roamii BE Pro router on a bookshelf]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/5GJPRMeN8XJK6mEHH9STeW-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">MSI Roamii BE Pro: Specs</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Wi-Fi specification: </strong>BE11000 (802.11be)<br><strong>Number of antennas/removable: </strong>6/No<br><strong>Ports: </strong>One 2.5  Gbps WAN input, three 2.5  Gbps LAN, USB 3.0<br><strong>Processor speed: </strong>Quad-core 1.5GHz<br><strong>Wi-Fi chip: </strong>Qualcomm IPQ5322<br><strong>Peak 802.11be performance: </strong>1.89 Gbps (at 15 feet)<br><strong>Maximum range: </strong>110 feet<br><strong>Size: </strong>9.9 x 4.7 x 4.3 inches<br><strong>Estimated annual electricity cost: </strong>$27.60 (for router and one satellite)</p></div></div><p>MSI has updated its Roamii BE Lite mesh platform for peak performance with the Roamii BE Pro by employing the 6GHz transmission band and many of Wi-Fi 7’s best tricks to speed the flow of data. Its nanocarbon coated heat fins keep the units from overheating while the BE Pro ups the mesh hardware’s top speed and network security stance. The mesh set comes with the bonus of well-designed wall brackets for easy mounting.</p><p>Unfortunately, you can only get Romai BE Pro units, like Noah’s ark, two at a time. But, at half the price of other tri-band Wi-Fi 7 mesh gear, the Roamii BE Pro is a cheap thrill that has the power to turn a home into a Wi-Fi palace. </p><p>My MSI Roami BE Pro review will help you decide if this is the <a href="https://www.tomsguide.com/computing/routers/best-mesh-wi-fi-systems">best mesh Wi-Fi system</a> for your home along with one of the <a href="https://www.tomsguide.com/best-picks/best-Wi-fi-7-routers">best Wi-Fi 7 routers</a> for those who haven’t upgraded to the latest wireless standard yet.</p><h3 class="article-body__section" id="section-msi-roamii-be-pro-review-pricing-and-availability"><span>MSI Roamii BE Pro review: Pricing and availability</span></h3><p>Following on the heels of the inexpensive dual-band <a href="https://www.tomsguide.com/computing/routers/msi-roamii-be-lite-review">Roamii BE Lite</a>, MSI’s tri-band Roamii BE Pro stays true to its predecessor’s value-oriented roots but isn’t available on its own or in a three-pack. MSI sells $280 Roamii BE Pro two-packs versus the Roamii BE Lite’s $200. A single <a href="https://www.tomsguide.com/computing/routers/netgear-orbi-770-review">Netgear Orbi 770</a> node sells for $300. </p><p>The Roamii BE Pro pair is rated to cover 6,000 square feet, about equal with the Orbi 770 pair’s 5,500 square feet.   </p><h3 class="article-body__section" id="section-msi-roamii-be-pro-review-design"><span>MSI Roamii BE Pro review: Design</span></h3><p>In the spirit of creative destruction, MSI has rewritten its Wi-Fi rulebook with its economical Roamii BE Pro mesh kit. At half what competitors’ charge for mesh units, the Roamii BE Pro outdoes the BE Lite’s “meh” performance with higher data speeds, extra range and handy wall brackets. </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="rEtHLRBB6i35cHfXcBwmRW" name="MSI Roamii BE Pro-3" alt="The top of MSI Roamii BE Pro router" src="https://cdn.mos.cms.futurecdn.net/rEtHLRBB6i35cHfXcBwmRW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>At 9.9 x 4.7 x 4.3 inches, the white triangular Roamii BE Pro towers are slightly taller than the BE Lite units but smaller than the bulbous Orbi 770 oval devices. The big “7” inscribed on its side describes its Wi-Fi rating and MSI provides matching plastic wall brackets that make the units seem to float in space. </p><p>For most, the Roamii BE Pro will be well connected with a 2.5 Gbps input and three 2.5 Gbps downstream wired networking connections. The well-networked among us might miss an additional port, though. Still, the Roamii BE Pro’s USB Type A port can make the contents of a storage device available across a network; the Orbi 770 can’t do this. Neither the BE Pro nor Orbi 770 can provide internet backup service with a mobile phone during a broadband blackout, something several Asus routers do. </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="Hba9yfGYQVhEnazJBTrzQW" name="MSI Roamii BE Pro-2" alt="MSI Roamii BE Pro router on a windowsill" src="https://cdn.mos.cms.futurecdn.net/Hba9yfGYQVhEnazJBTrzQW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There’s a small LED that glows white up front when online, but flashes if there’s a connection problem and turns orange when offline. The LEDs underneath can show any of 10 flashy patterns but offer nothing to indicate performance. Thankfully, it can be turned off. </p><p>Based on Qualcomm’s IPQ5322 Wi-Fi 7 platform, the system’s 1.5GHz quadcore processor can connect 200 devices – overkill for the typical digital household. Its six internal antennas produce a spherical transmission pattern to connect over the 2.4, 5.0- and 6GHz bands for a theoretical throughput of 10.975 Gbps, just about matching the Orbi 770’s potential.</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="EzqNBecjMMtARS8mT9WAXW" name="MSI Roamii BE Pro-4" alt="The ports on a MSI Roamii BE Pro router" src="https://cdn.mos.cms.futurecdn.net/EzqNBecjMMtARS8mT9WAXW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The mesh devices have 320MHz data channels, 4K Quadrature Amplitude Modulation (QAM) and Multi-Link Operations (MLO) but Automated Frequency Control (AFC) for maximizing its 6GHz transmission strength. Its optimized passive cooling uses ultra-efficient black nanocarbon-coated heat sinks that pull heat away from its components. The top vent hit a peak temperature of 108 degrees Fahrenheit during testing.</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="su6FSRaHFMwB5qF9xaASVV" name="MSI Roamii BE Pro-pro-thermal-a" alt="Thermal imaging of the MSI Roamii BE Pro router" src="https://cdn.mos.cms.futurecdn.net/su6FSRaHFMwB5qF9xaASVV-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1148" 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 Roamii BE Pro can protect as a Virtual Private Network server. Plus, MSI’s FortiSecu online defenses use <a href="https://www.tomsguide.com/reviews/trend-micro"><u>Trend Micro</u></a> software, for everything from parental control software to defenses against recent exploits. Unlike competitors, there are no subscription fees for updates. </p><p>Its three-year warranty beats mesh sets at double its price and MSI promises personalized technical support for the product’s life, not just 90-days. The support site includes new firmware and MSI’s 76-page manual to help with the VPN server.</p><h3 class="article-body__section" id="section-msi-roamii-be-pro-review-performance"><span>MSI Roamii BE Pro review: Performance</span></h3><p>A big step up from the MSI Roamii BE Lite, the BE Pro pair still couldn’t fill my 3,500 square foot home with Wi-Fi. Likely a third (and obligatory fourth) unit would have helped. Based on results from Keysight’s <a href="https://www.keysight.com/us/en/products/ethernet-traffic-emulation/protocol-and-load-test-l4-7-emulation-software/ixchariot.html"><u>IxChariot</u></a> networking benchmark set to mimic 10 data-hungry users and an HP Envy X360 test machine, the Roamii BE Pro was surprisingly powerful. </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="YAVWTtfAfGpAkaDjcyA3dW" name="MSI Roamii BE Pro-6" alt="MSI Roamii BE Pro router on a side table" src="https://cdn.mos.cms.futurecdn.net/YAVWTtfAfGpAkaDjcyA3dW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>With 15 feet of Cat 7 cabling connecting the router and test system, the benchmark reading of 3.711 Gbps makes it perfect for those with multi-gig data plans. It was short of the <a href="https://www.tomsguide.com/computers/routers/tp-link-archer-ge800-review">TP-Link Archer GE800</a> at 4.449 Gbps of wired throughput, however. Its 2.299 Gbps close-up Wi-Fi test result was just as impressive and 20% ahead of the more expensive Orbi 770’s 1.920 Gbps. </p><p>At the real-world wireless distance of 15 feet, the Roamii BE Pro delivered 1.885 Gbps, nearly double the BE Lite’s 970.3 Mbps but equivalent to the <a href="https://www.tomsguide.com/computing/routers/eero-pro-7-review">eero Pro 7</a> at 1.905 Gbps. Bottom line: it should satisfy a data-hungry connected family.</p><div ><table><tbody><tr><td class="firstcol " ><p> </p></td><td  ><p><strong>MSI Roamii BE Pro</strong></p></td><td  ><p><strong>eero Pro 7</strong></p></td><td  ><p><strong>Netgear Orbi 770</strong></p></td><td  ><p><strong>TP-Link Deco BE85</strong></p></td><td  ><p><strong>MSI Roamii BE Lite</strong></p></td></tr><tr><td class="firstcol " ><p><strong>15 feet</strong></p></td><td  ><p> 1.885  Gbps</p></td><td  ><p>1.905  Gbps</p></td><td  ><p>1.721  Gbps</p></td><td  ><p>1.736  Gbps</p></td><td  ><p>970.3 Mbps</p></td></tr><tr><td class="firstcol " ><p><strong>50 feet</strong></p></td><td  ><p> 815.2 Mbps</p></td><td  ><p>994.4 Mbps</p></td><td  ><p>391.1 Mbps</p></td><td  ><p>790.4 Mbps</p></td><td  ><p>470.5 Mbps</p></td></tr><tr><td class="firstcol " ><p><strong>75 feet</strong></p></td><td  ><p> 197.9 Mbps</p></td><td  ><p>234.7 Mbps</p></td><td  ><p>199.2 Mbps</p></td><td  ><p>179.2 Mbps</p></td><td  ><p>172.8 Mbps</p></td></tr><tr><td class="firstcol " ><p><strong>90 feet</strong></p></td><td  ><p> 66.3 Mbps</p></td><td  ><p>20.8 Mbps</p></td><td  ><p>54.2 Mbps</p></td><td  ><p>42.6 Mbps</p></td><td  ><p>46.7 Mbps</p></td></tr></tbody></table></div><p>Its 815.2 Mbps of throughput at 50 feet was among the best in class and only outdone by the eero Pro 7’s 994.4 Mbps. At 75 feet, the Roamii BE Pro moved 197.9 Mbps, putting it roughly level with the Orbi 770’s 199.2 Mbps but behind the eero Pro 7’s 234.7 Mbps.</p><p>At the terminal distance of 90 feet, it registered 66.3 Mbps, leading the field, including mesh kits costing twice as much. It performed well on our wall penetration test where the signal is sent across a 25-foot room and through a wall. The Roamii BE Pro moved 1.280 Mbps, just off the Orbi 770’s 1.318 Gbps. </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="kcQMjFdKZLHjDjz5raPSjW" name="MSI Roamii BE Pro-5" alt="MSI Roamii BE Pro router on a side table" src="https://cdn.mos.cms.futurecdn.net/kcQMjFdKZLHjDjz5raPSjW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>With a range of 110 feet, it is a mesh set that should fill a modest sized home with fast data and linked well with its mesh node set up a floor above the host router. With the test system 40 feet away, the network moved 642.0 Mbps, handily beating the Orbi 770’s 404.4 Mbps. </p><p>Over two weeks of daily use, the Roamii BE Pro doled out data for 4K video, gaming, heavy downloads and everyday emails. Along the way, the router and node used 9.4 and 8.6 watts, translating into an annual electricity bill of $27.60 if they’re left on 24/7 and you pay the national average electricity of 17.5 cents per kilowatt hour. It’s spot on with the eero Pro 7’s $27.90 under the same conditions.</p><h3 class="article-body__section" id="section-msi-roamii-be-pro-review-setup"><span>MSI Roamii BE Pro review: Setup</span></h3><p>Out of the box, the Roamii BE Pro units are identical. I picked one as the host router and the other as the network’s node and set them up using MSI’s Router 2.0 app with my Samsung Galaxy S25 phone; there are versions for both iOS and Android.  Alternatively, I could have set it up using “msirouter.login” and a browser.</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="J9QpLCLmWrVRdxt3uo9sQV" name="MSI Roamii BE Pro-node" alt="MSI Roamii BE Pro router app screenshot" src="https://cdn.mos.cms.futurecdn.net/J9QpLCLmWrVRdxt3uo9sQV-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1148" 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>After snapping the QR code underneath, I added my network name, admin password and answered two challenge questions. I was in, added the node upstairs and ran a firmware update. I was done in 15 minutes.  </p><h3 class="article-body__section" id="section-roamii-be-pro-review-configuration"><span>Roamii BE Pro review: Configuration</span></h3><p>Like the installation, monitoring and configuration changes can be done through the app or the device’s browser interface. The app’s Dashboard screen shows how many Roamii devices are online, up- and download speeds and offers a WiFi Share QR code for a trusted friend or if you rent out a property.</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="TqCc4VPXiJFzbmtsHRaDPV" name="MSI Roamii BE Pro-app-dash" alt="MSI Roamii BE Pro router app screenshot" src="https://cdn.mos.cms.futurecdn.net/TqCc4VPXiJFzbmtsHRaDPV-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1148" 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>Below are tabs for Security and Parental while Advanced includes LED Management for selecting the lighting effect or turning it off. There’s no brightness control, though.</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="4BhTcfjofbrtNfn9iyqJNV" name="MSI Roamii BE Pro-app-led" alt="MSI Roamii BE Pro router app screenshot" src="https://cdn.mos.cms.futurecdn.net/4BhTcfjofbrtNfn9iyqJNV-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1148" 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 Roamii BE Pro’s similar browser-based dashboard has IP details, number of clients and processor usage gauge. Its traffic analyzer is great for viewing the data flow. </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:1605px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="dWFUzfEkxaBpV7JQE9oumV" name="MSI Roamii BE Pro-firmware" alt="Screenshot of the MSI Roamii BE Pro router settings page" src="https://cdn.mos.cms.futurecdn.net/dWFUzfEkxaBpV7JQE9oumV-1920-80.jpg" mos="" align="middle" fullscreen="" width="1605" height="903" 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><h3 class="article-body__section" id="section-msi-roamii-be-pro-review-verdict"><span>MSI Roamii BE Pro review: Verdict </span></h3><p>MSI’s Roamii BE Pro takes a big networking step forward with a sharp design aesthetic and its ability to efficiently move data around a small to midsized house. Its security is thorough and the Roamii BE Pro’s 2.5 Gbps networking connections should satisfy most digital families, although a fourth port would have been appreciated. </p><p>With performance that led the pack at times, it lacks Automated Frequency Control to push this further. The Roamii BE Pro’s stratospheric throughput is all the more amazing considering its down-to-earth price. At $280 for two Roamii BE Pro devices, it’s not a bad idea to get an extra two-pack and have nodes to fill in dead zones. Afterall, it’s cheap enough.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I spoke to the Microsoft PM rebuilding Windows 11 for Nvidia RTX Spark: The radical reinvention building the first true MacBook Pro threat ]]></title>
                                                                                                <dc:content><![CDATA[ <p>For eight grueling months leading up to the end of last year, engineers from Microsoft and Nvidia worked side by side from the silicon bootstrap level upward. And the goal? Making Windows 11 play nice with an unprecedented architectural shift: an Arm-based CPU sharing massive unified memory with a desktop-class Nvidia RTX GPU.</p><p>And then, the first <a href="https://www.tomsguide.com/computing/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions">RTX Spark</a> machine finally booted. The red LED lit up, and as Microsoft's Principal Product Manager, Peter Dawoud, recalls it: “half of Santa Clara was jumping.” This was a huge undertaking, but now the real work begins: fine-tuning everything.</p><p>RTX Spark isn’t just another laptop sticker; it pushed Microsoft to fundamentally overhaul five foundational subsystems inside Windows 11 to bridge the gap between low-power Arm efficiency, top-tier AAA gaming, and local agentic AI.</p><p>I spoke to Dawoud about the software underpinning Team Green’s hardware because, as he said, “Windows kind of had to get all these subsystems right all at the same time, so that you can enjoy an RTX Spark device and take the most advantage out of it.”</p><h2 id="a-prism-emulator-overhaul">A Prism Emulator overhaul</h2><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="oWfTLRd5NPjKy6jDQeEsq4" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/oWfTLRd5NPjKy6jDQeEsq4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Take it from someone who has watched the many attempts to run Windows on ARM chips (and covered the Snapdragon X Elite launch): emulation has always had an Achilles’ heel when it comes to gaming: micro-stuttering and frame pacing.</p><p>“When you're playing video games, it's not just about your average FPS. 1% lows, stuttering is really critical, and your CPU actually plays a very big role in stuttering control,” Dawoud explained.</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="VPJcvprGffc9FfD2cHiytJ" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/VPJcvprGffc9FfD2cHiytJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While average frame rates look acceptable, CPU timing can get erratic when you try to emulate a game and play it at the same time, which can make fast-paced gaming feel jerky. When somebody buys an Nvidia laptop in October, the chances are likely that they will want to play games on it — it’s an RTX GPU after all.</p><p>So work needed to be done, and Microsoft has overhauled the Prism emulation layer for RTX Spark’s pipelines. By shoring up how tasks are assigned to each of the CPU’s threads, frame rates are much more stable in my testing, and the improvement over past versions is night and day.</p><h2 id="ui-polish-amp-the-agentic-future">UI polish & the agentic future</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2570px;"><p class="vanilla-image-block" style="padding-top:66.65%;"><img id="4fF35LQYkV4jpZNrPUKxZg" name="win11improvedsearchg" alt="Windows 11 Improved Search in action" src="https://cdn.mos.cms.futurecdn.net/4fF35LQYkV4jpZNrPUKxZg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2570" height="1713" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>If you’re going to make what I believe could be a MacBook Pro killer, you need to make sure the UI is ready for power users as well as casual users. And the mission in Dawoud’s mind to do this is clear: “make the OS kind of get out of the way, for you to do the work that you want to do.”</p><p>Microsoft is cleaning up Windows 11 for this kind of user: native taskbar customization, customizable notifications, killing unwanted widgets, and remembering displays you connect to—to preserve specific screen layout settings.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kANGCbHE3KTdGdR5xZVvD4" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/kANGCbHE3KTdGdR5xZVvD4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Then we turn our attention to the “reinvent the PC” part of the RTX Spark, which comes down to local agentic AI. I saw a demo of Hermes Agent connected to a user’s Google account that acted like his personal chief of staff: setting an agenda for the day, drafting email responses in Gmail, and updating a project tracker in Google Docs. And it all happened on-device without a single bit of cloud AI.</p><p>But without guardrails, this could get scary. “Having an agent that you can't control is probably the thing you don't want,” he stated. So the answer is Microsoft Extension Containers (MXC) — isolated sandboxes for your local models to act across your desktop securely without sensitive system control leaking.</p><h2 id="killing-oem-bloatware">Killing OEM bloatware</h2><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="mcY3VEDiPviihsNtyMMVY4" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/mcY3VEDiPviihsNtyMMVY4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It’s always been a dream of mine to have a laptop that doesn’t come packed with OEM-specific power management software or an antivirus scanner. While this may not fix the latter, it goes a long way toward killing the need for the former.</p><p>Dawoud emphasized the need to eliminate the clunky tug-of-war between Windows and external software. Currently, there are several ways to tweak power management across different apps, but RTX Spark uses the open-source Modern Power and Thermal Framework—letting Windows natively control all thermal and power tuning.</p><p>“Users, when they want to set the best performance, they can do it in Windows, and they'll know that the OEM's tuning for best performance has now been set,” he said. “They don't need to go to another app and be like, 'Okay, is that app saying good performance and Windows is saying good performance at the same time?'”</p><p>This also helps these laptops maintain the same performance on and off the charger.</p><h2 id="the-uma-secret">The UMA secret</h2><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="WudXrWFBDRvTr4BfJPKW3T" name="RTX Spark" alt="RTX Spark" src="https://cdn.mos.cms.futurecdn.net/WudXrWFBDRvTr4BfJPKW3T-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>On paper, a Unified Memory Architecture (UMA) sounds great — a big pool for both the CPU and monstrous GPU to dip into at leisure, and take however much (or little) they need. But in reality, CPUs and GPUs digest memory completely differently.</p><p>CPUs crave small memory chunks (4-kilobyte pages) to distribute tasks across their many cores. They take a pizza, pull all the ingredients off of it, and share them around. GPUs, however, take that entire pizza, fold it in half, and eat it taco-style. They need massive blocks (up to 2-megabyte pages) to plow through parallel 3D rendering or AI tasks.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rVysSsvNTgqPQr98uY9uY4" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/rVysSsvNTgqPQr98uY9uY4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>“RTX Spark has a very powerful GPU, so making sure that we give it as much memory as possible when it needs it, but also give it the right page sizes, is really critical,” Dawoud commented.</p><p>So Microsoft's fix is to add variable page sizing directly to the memory manager. This is a bit complex, but it means Windows can dynamically read the pages of data flowing through and send them to the right places—the 2MB to the GPU and 4KB to the CPU simultaneously.</p><p>“Optimizing that is the way you can weaponize the entire stack to get the most performance out of it,” He emphasized.</p><h2 id="taming-nvidia-s-custom-cpu-cores">Taming Nvidia’s custom CPU cores</h2><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="NC4Vevw7coKXAFTkqRDdYP" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/NC4Vevw7coKXAFTkqRDdYP-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Unlike Qualcomm’s standardized Snapdragon X chips, Nvidia’s 18- and 20-core Grace CPUs use a proprietary cluster arrangement of performance and efficiency cores to maximize speed while delivering all-day battery life.</p><p>Dawoud explained that Nvidia's core configuration is entirely unique, and “previous Arm cores that have run on Windows are not like that.”</p><p>Now, historically, supporting an exotic CPU layout required rewriting the entire kernel underpinning Windows — a risky move for sure. But Windows 11 has a new profiling stack that can tune itself dynamically on the fly, meaning the scheduler that throws tasks everywhere can adapt to Nvidia’s unique chip here without breaking legacy compatibility.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-e4EgZW"></div>                            </div>                            <script src="https://kwizly.com/embed/e4EgZW.js" async></script><h2 id="the-pc-has-finally-grown-up">The PC has finally grown up</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GVxdiZGjWNreCjxARYdq74" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/GVxdiZGjWNreCjxARYdq74-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The 14-year partnership between Microsoft and Nvidia finally feels like it is paying off. Dawoud pointed out that this wasn't a sudden alliance — the journey started over a decade ago with the Tegra-powered Surface RT.</p><p>But this specific launch represents a fundamental shift in how the two giants collaborate. By letting Microsoft engineers rebuild the OS from the silicon bootstrap level upward, RTX Spark gave Windows the foundation it needed to finally make Arm-based PC gaming a reality.</p><p>Microsoft and Nvidia haven’t just bolted a GPU onto an Arm processor; they’ve rewritten the rulebook beneath the surface. This is a huge moment for both companies, and if Windows on Arm succeeds where previous attempts faltered, it will all be traced back to that one moment Microsoft spent eight agonizing months building the foundation to make it feel effortless.</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/laptops/macbook-pro-14-inch-vs-asus-proart-p14-nvidia-rtx-spark">I held the Asus ProArt P14 next to my MacBook Pro 14 — and Apple should be genuinely terrified of Nvidia’s RTX Spark</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter">I tested Acer's wild Project DualPlay Mini — and it's a gaming handheld and laptop in one gadget</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-tested-the-real-dlss-5-forget-the-leaked-mods-its-not-an-ai-filter-this-is-nvidias-photorealistic-game-changer">I wanted to hate Nvidia’s DLSS 5 ‘AI filter’ — but the real DLSS 5 is photorealistic black magic</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=laptops&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/windows-operating-systems/i-spoke-to-the-microsoft-pm-rebuilding-windows-11-for-nvidia-rtx-spark-the-radical-reinvention-building-the-first-true-macbook-pro-threat</link>
                                                                            <description>
                            <![CDATA[ “Half of Santa Clara was jumping.” An exclusive interview with Microsoft on rebuilding Windows 11 from the ground up for Nvidia’s RTX Spark silicon. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">hT9VZpkvYjuDisFYQM8J85</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Zfe8UdFvFggCuPBwkQ8ZZ4-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 07 Sep 2026 08:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Windows Operating Systems]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Zfe8UdFvFggCuPBwkQ8ZZ4-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Nvidia RTX Spark]]></media:description>                                                            <media:text><![CDATA[Nvidia RTX Spark]]></media:text>
                                <media:title type="plain"><![CDATA[Nvidia RTX Spark]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Zfe8UdFvFggCuPBwkQ8ZZ4-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>For eight grueling months leading up to the end of last year, engineers from Microsoft and Nvidia worked side by side from the silicon bootstrap level upward. And the goal? Making Windows 11 play nice with an unprecedented architectural shift: an Arm-based CPU sharing massive unified memory with a desktop-class Nvidia RTX GPU.</p><p>And then, the first <a href="https://www.tomsguide.com/computing/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions">RTX Spark</a> machine finally booted. The red LED lit up, and as Microsoft's Principal Product Manager, Peter Dawoud, recalls it: “half of Santa Clara was jumping.” This was a huge undertaking, but now the real work begins: fine-tuning everything.</p><p>RTX Spark isn’t just another laptop sticker; it pushed Microsoft to fundamentally overhaul five foundational subsystems inside Windows 11 to bridge the gap between low-power Arm efficiency, top-tier AAA gaming, and local agentic AI.</p><p>I spoke to Dawoud about the software underpinning Team Green’s hardware because, as he said, “Windows kind of had to get all these subsystems right all at the same time, so that you can enjoy an RTX Spark device and take the most advantage out of it.”</p><h2 id="a-prism-emulator-overhaul">A Prism Emulator overhaul</h2><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="oWfTLRd5NPjKy6jDQeEsq4" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/oWfTLRd5NPjKy6jDQeEsq4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Take it from someone who has watched the many attempts to run Windows on ARM chips (and covered the Snapdragon X Elite launch): emulation has always had an Achilles’ heel when it comes to gaming: micro-stuttering and frame pacing.</p><p>“When you're playing video games, it's not just about your average FPS. 1% lows, stuttering is really critical, and your CPU actually plays a very big role in stuttering control,” Dawoud explained.</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="VPJcvprGffc9FfD2cHiytJ" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/VPJcvprGffc9FfD2cHiytJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While average frame rates look acceptable, CPU timing can get erratic when you try to emulate a game and play it at the same time, which can make fast-paced gaming feel jerky. When somebody buys an Nvidia laptop in October, the chances are likely that they will want to play games on it — it’s an RTX GPU after all.</p><p>So work needed to be done, and Microsoft has overhauled the Prism emulation layer for RTX Spark’s pipelines. By shoring up how tasks are assigned to each of the CPU’s threads, frame rates are much more stable in my testing, and the improvement over past versions is night and day.</p><h2 id="ui-polish-amp-the-agentic-future">UI polish & the agentic future</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2570px;"><p class="vanilla-image-block" style="padding-top:66.65%;"><img id="4fF35LQYkV4jpZNrPUKxZg" name="win11improvedsearchg" alt="Windows 11 Improved Search in action" src="https://cdn.mos.cms.futurecdn.net/4fF35LQYkV4jpZNrPUKxZg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2570" height="1713" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Microsoft)</span></figcaption></figure><p>If you’re going to make what I believe could be a MacBook Pro killer, you need to make sure the UI is ready for power users as well as casual users. And the mission in Dawoud’s mind to do this is clear: “make the OS kind of get out of the way, for you to do the work that you want to do.”</p><p>Microsoft is cleaning up Windows 11 for this kind of user: native taskbar customization, customizable notifications, killing unwanted widgets, and remembering displays you connect to—to preserve specific screen layout settings.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kANGCbHE3KTdGdR5xZVvD4" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/kANGCbHE3KTdGdR5xZVvD4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Then we turn our attention to the “reinvent the PC” part of the RTX Spark, which comes down to local agentic AI. I saw a demo of Hermes Agent connected to a user’s Google account that acted like his personal chief of staff: setting an agenda for the day, drafting email responses in Gmail, and updating a project tracker in Google Docs. And it all happened on-device without a single bit of cloud AI.</p><p>But without guardrails, this could get scary. “Having an agent that you can't control is probably the thing you don't want,” he stated. So the answer is Microsoft Extension Containers (MXC) — isolated sandboxes for your local models to act across your desktop securely without sensitive system control leaking.</p><h2 id="killing-oem-bloatware">Killing OEM bloatware</h2><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="mcY3VEDiPviihsNtyMMVY4" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/mcY3VEDiPviihsNtyMMVY4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It’s always been a dream of mine to have a laptop that doesn’t come packed with OEM-specific power management software or an antivirus scanner. While this may not fix the latter, it goes a long way toward killing the need for the former.</p><p>Dawoud emphasized the need to eliminate the clunky tug-of-war between Windows and external software. Currently, there are several ways to tweak power management across different apps, but RTX Spark uses the open-source Modern Power and Thermal Framework—letting Windows natively control all thermal and power tuning.</p><p>“Users, when they want to set the best performance, they can do it in Windows, and they'll know that the OEM's tuning for best performance has now been set,” he said. “They don't need to go to another app and be like, 'Okay, is that app saying good performance and Windows is saying good performance at the same time?'”</p><p>This also helps these laptops maintain the same performance on and off the charger.</p><h2 id="the-uma-secret">The UMA secret</h2><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="WudXrWFBDRvTr4BfJPKW3T" name="RTX Spark" alt="RTX Spark" src="https://cdn.mos.cms.futurecdn.net/WudXrWFBDRvTr4BfJPKW3T-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>On paper, a Unified Memory Architecture (UMA) sounds great — a big pool for both the CPU and monstrous GPU to dip into at leisure, and take however much (or little) they need. But in reality, CPUs and GPUs digest memory completely differently.</p><p>CPUs crave small memory chunks (4-kilobyte pages) to distribute tasks across their many cores. They take a pizza, pull all the ingredients off of it, and share them around. GPUs, however, take that entire pizza, fold it in half, and eat it taco-style. They need massive blocks (up to 2-megabyte pages) to plow through parallel 3D rendering or AI tasks.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rVysSsvNTgqPQr98uY9uY4" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/rVysSsvNTgqPQr98uY9uY4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>“RTX Spark has a very powerful GPU, so making sure that we give it as much memory as possible when it needs it, but also give it the right page sizes, is really critical,” Dawoud commented.</p><p>So Microsoft's fix is to add variable page sizing directly to the memory manager. This is a bit complex, but it means Windows can dynamically read the pages of data flowing through and send them to the right places—the 2MB to the GPU and 4KB to the CPU simultaneously.</p><p>“Optimizing that is the way you can weaponize the entire stack to get the most performance out of it,” He emphasized.</p><h2 id="taming-nvidia-s-custom-cpu-cores">Taming Nvidia’s custom CPU cores</h2><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="NC4Vevw7coKXAFTkqRDdYP" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/NC4Vevw7coKXAFTkqRDdYP-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Unlike Qualcomm’s standardized Snapdragon X chips, Nvidia’s 18- and 20-core Grace CPUs use a proprietary cluster arrangement of performance and efficiency cores to maximize speed while delivering all-day battery life.</p><p>Dawoud explained that Nvidia's core configuration is entirely unique, and “previous Arm cores that have run on Windows are not like that.”</p><p>Now, historically, supporting an exotic CPU layout required rewriting the entire kernel underpinning Windows — a risky move for sure. But Windows 11 has a new profiling stack that can tune itself dynamically on the fly, meaning the scheduler that throws tasks everywhere can adapt to Nvidia’s unique chip here without breaking legacy compatibility.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-e4EgZW"></div>                            </div>                            <script src="https://kwizly.com/embed/e4EgZW.js" async></script><h2 id="the-pc-has-finally-grown-up">The PC has finally grown up</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GVxdiZGjWNreCjxARYdq74" name="Nvidia RTX Spark" alt="Nvidia RTX Spark" src="https://cdn.mos.cms.futurecdn.net/GVxdiZGjWNreCjxARYdq74-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The 14-year partnership between Microsoft and Nvidia finally feels like it is paying off. Dawoud pointed out that this wasn't a sudden alliance — the journey started over a decade ago with the Tegra-powered Surface RT.</p><p>But this specific launch represents a fundamental shift in how the two giants collaborate. By letting Microsoft engineers rebuild the OS from the silicon bootstrap level upward, RTX Spark gave Windows the foundation it needed to finally make Arm-based PC gaming a reality.</p><p>Microsoft and Nvidia haven’t just bolted a GPU onto an Arm processor; they’ve rewritten the rulebook beneath the surface. This is a huge moment for both companies, and if Windows on Arm succeeds where previous attempts faltered, it will all be traced back to that one moment Microsoft spent eight agonizing months building the foundation to make it feel effortless.</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/laptops/macbook-pro-14-inch-vs-asus-proart-p14-nvidia-rtx-spark">I held the Asus ProArt P14 next to my MacBook Pro 14 — and Apple should be genuinely terrified of Nvidia’s RTX Spark</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter">I tested Acer's wild Project DualPlay Mini — and it's a gaming handheld and laptop in one gadget</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-tested-the-real-dlss-5-forget-the-leaked-mods-its-not-an-ai-filter-this-is-nvidias-photorealistic-game-changer">I wanted to hate Nvidia’s DLSS 5 ‘AI filter’ — but the real DLSS 5 is photorealistic black magic</a></li></ul><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=laptops&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vc2hvcC1hc3NldHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Nob3AtYXNzZXRzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9zaG9wLWFzc2V0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested DLSS 5 in NBA 2K27 on a mid-range gaming laptop — it's the future of photorealistic graphics, but there's a catch ]]></title>
                                                                                                <dc:content><![CDATA[ <p>So while NBA 2K27 is officially the first game to launch with <a href="https://www.tomsguide.com/gaming/pc-gaming/i-tested-the-real-dlss-5-forget-the-leaked-mods-its-not-an-ai-filter-this-is-nvidias-photorealistic-game-changer">Nvidia’s newly launched DLSS 5</a>, you’ve probably already seen it pop up in hundreds of more games than that. And I’ll say it again just like I said it before — in photorealistic games, it’s fantastic. But If you venture out of that into anything more stylized, it’s going to look weird.</p><p>That’s why it makes the world of sense in 2K27, but during my hands-on testing with my <a href="https://www.tomsguide.com/computing/gaming-laptops/i-review-gaming-laptops-for-a-living-and-this-is-my-favorite-of-2025">Asus ROG Zephyrus G14</a> (armed with an RTX 5070 Ti), I noticed something bizarre. The moment I entered a menu or triggered a replay, it suddenly felt like it was trudging through molasses.</p><p>I dug into the raw telemetry data to figure out what was going on, and what I found completely changed my understanding of Nvidia’s “3D-guided neural rendering.” That intensive new graphics pipeline of DLSS 5 may indeed be a graphical revolution — but on my humble laptop (and lower end desktops), I get the sense Frame Generation is a requirement to make it playable.</p><h2 id="the-laptop-i-m-playing-on">The laptop I’m playing on</h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Intel Core Ultra 9 386H</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>RTX 5070 Ti (115 watts)</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>32GB LPDDR5X</p></td></tr><tr><td class="firstcol " ><p><strong>SSD</strong></p></td><td  ><p>1TB PCIe Gen 4</p></td></tr></tbody></table></div><p>I’m seeing a lot of people test it on massive desktop rigs. I’ll of course get round to doing this when I’m not on my honeymoon (my wife will kill me if I started benchmarking DLSS 5 in Cancun), but first I wanted to show you some numbers on something that isn’t really being covered here — my Asus ROG Zephyrus G14 gaming laptop.</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="2akjJwtoAsyJWCruapJF9E" name="Asus ROG Zephyrus G14 (2026)" alt="Asus ROG Zephyrus G14 (2026)" src="https://cdn.mos.cms.futurecdn.net/2akjJwtoAsyJWCruapJF9E-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Nvidia’s been talking about how the model running this mode of neural rendering has been made super efficient over the past few months. In fact, when it first debuted, it ran on a separate RTX 5090 desktop GPU; whereas now, it’s able to run on a single card with the game.</p><p>So let’s give it a go in a notebook with a lower power level running through those graphics.</p><h2 id="by-the-numbers">By the numbers</h2><p>To figure out why the game was suddenly stuttering, I ran the telemetry on three different game states with DLSS 5 turned on and off. And as you can see, while the gameplay numbers are very close matching, elsewhere, the difference is pretty significant.</p><div ><table><tbody><tr><td class="firstcol " ><p><strong>Scenario</strong></p></td><td  ><p><strong>Setting</strong></p></td><td  ><p><strong>Avg FPS</strong></p></td><td  ><p><strong>1% Low FPS</strong></p></td><td  ><p><strong>PC Latency (ms)</strong></p></td><td  ><p><strong>GPU Util (%)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Menu screen</strong></p></td><td  ><p>DLSS 5 Off</p></td><td  ><p>109.8</p></td><td  ><p>85.3</p></td><td  ><p>35.8</p></td><td  ><p>91.5</p></td></tr><tr><td class="firstcol empty" ></td><td  ><p>DLSS 5 On</p></td><td  ><p>30.4</p></td><td  ><p>27.9</p></td><td  ><p>102.1</p></td><td  ><p>96.9</p></td></tr><tr><td class="firstcol " ><p><strong>Gameplay</strong></p></td><td  ><p>DLSS 5 Off</p></td><td  ><p>115.8</p></td><td  ><p>19.8</p></td><td  ><p>79.8</p></td><td  ><p>41</p></td></tr><tr><td class="firstcol empty" ></td><td  ><p>DLSS 5 On</p></td><td  ><p>115.2</p></td><td  ><p>19.8</p></td><td  ><p>111.2</p></td><td  ><p>86</p></td></tr><tr><td class="firstcol " ><p><strong>Replay</strong></p></td><td  ><p>DLSS 5 Off</p></td><td  ><p>92.6</p></td><td  ><p>57</p></td><td  ><p>56.6</p></td><td  ><p>92.9</p></td></tr><tr><td class="firstcol empty" ></td><td  ><p>DLSS 5 On</p></td><td  ><p>26.9</p></td><td  ><p>16.2</p></td><td  ><p>128.8</p></td><td  ><p>97.7</p></td></tr></tbody></table></div><p>In fact, this kind of lines up with <a href="https://www.pcgamer.com/hardware/graphics-cards/dlss-5-comes-with-a-massive-50-60-percent-performance-hit-so-i-hope-you-like-lower-frame-rates-with-your-dose-of-ai-image-enhancement/" target="_blank">PC Gamer’s report</a> of a 50-60% drop in performance. So what’s going on here? Let’s talk about it.</p><h2 id="the-heavy-cost-of-the-transformer">The heavy cost of the transformer</h2><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="n9SYNVP4yTgoCse4GzHQaL" name="DLSS 5" alt="DLSS 5" src="https://cdn.mos.cms.futurecdn.net/n9SYNVP4yTgoCse4GzHQaL-1920-80.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: Nvidia)</span></figcaption></figure><p>So why does turning <em>off </em>the new tech triple frame rate in menus and replays? Because DLSS 5 is not just an upscale filter. It is a highly complex transformer model that interacts with the on-screen geometry and injects neural rendering.</p><p>Speaking to Nvidia, it’s clear that this AI pipeline is a heavy one, and the answer to why you don’t see that same impact in gameplay is a simple one: <strong>Frame Generation</strong>.</p><p>During live gameplay, I engaged the 6x Frame Generation multiplier to take that slower neurally rendered base and fill the gaps. However, developers typically disable frame gen during static menus, UI-heavy pause screens or camera-cut replays.</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="sGWd4w3FSK3c3NZvRKTvTQ" name="DLSS 5" alt="DLSS 5" src="https://cdn.mos.cms.futurecdn.net/sGWd4w3FSK3c3NZvRKTvTQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nvidia)</span></figcaption></figure><p>You can see how much this first iteration of DLSS 5 is sweating the system by looking at a couple of factors in the gameplay. Yes, the framerate is barely touched, but the 1% Lows takes a dip and the latency is upped quite drastically, as well as the GPU utilization spiking.</p><p>In a controller-centric game like NBA 2K27, that’s not necessarily a noticeable hit, but I can imagine that when this in its current form is moved to games that require faster inputs with a keyboard and mouse, it could become more apparent.</p><p>Take away the prop of frame generation in menus, and you see the DLSS 5 penalty more realistically on an RTX 5070 Ti laptop GPU.</p><h2 id="but-it-looks-incredible">But it looks incredible</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/dgiemBJh8Ntef9MvZNJ43R-1920-80.png" alt="NBA 2K27" /><figcaption><small role="credit">2K Games</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/2vmZFSEToxZQnXLg9PiZAR-1920-80.png" alt="NBA 2K27" /><figcaption><small role="credit">2K Games</small></figcaption></figure></figure><p>Like I said in my first impressions, when faced with photorealistic graphics, DLSS 5 is undeniably impressive. There is one very specific takeaway when I looked at these “before and after” pairs of screen captures: the core game look is preserved impressively.</p><p>DLSS 5 does a flawless job of preserving the game’s visual integrity. The shots of Jalen Brunson and Victor Wembanyama show off the micro-details on the skin and the way the sweat catches the harsh stadium lighting. The upscaler isn’t adding any aggressive smoothing or plastic-looking artifacts — it’s remarkably lifelike.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/zt3qUDcUT3hUT3uCggfbCR-1920-80.png" alt="NBA 2K27" /><figcaption><small role="credit">2K Games</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/75Z5j9Mo3Xtosb8oN2e9CR-1920-80.png" alt="NBA 2K27" /><figcaption><small role="credit">2K Games</small></figcaption></figure></figure><p>Then there’s the fabric and material textures. Brunson’s Knicks jersey and the fabric of the couch in the cutscene get an upgrade to show off the stitching more with high-resolution clarity, and without any noticeable AI-induced blurring.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/jDbGWSTjdSLRHjA7eAq48R-1920-80.png" alt="NBA 2K27" /><figcaption><small role="credit">2K Games</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/q4xFZMUkJMWp6Z9tBJ3rvP-1920-80.png" alt="NBA 2K27" /><figcaption><small role="credit">2K Games</small></figcaption></figure></figure><p>The lighting reacts to on-screen characters more realistically, there isn’t any noticeable AI “fizzing” or ghosting around finer textures like hair — something upscalers have had problems with in the past. </p><h2 id="is-this-a-frame-generated-future">Is this a frame-generated future?</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/YWWyKjCTaivXpgCJPxyaBR-1920-80.png" alt="NBA 2K27" /><figcaption><small role="credit">2K Games</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/aZfs5KRJDBPYAFnnv8zE9R-1920-80.png" alt="NBA 2K27" /><figcaption><small role="credit">2K Games</small></figcaption></figure></figure><p>DLSS 5 integration proved to me that the uncanny valley is dead, but it also proves that native frame rates are on their way out with it.</p><p>Nvidia themselves keep saying that Moore’s law is dead, and getting crafty with AI is what will bridge that generational gap. That threshold has been crossed — photorealism is getting too heavy for high-end silicon to render natively. </p><p>And DLSS 5 proves that future of photorealism isn’t just about rendering better pixels; it’s about accepting that a good chunk of the frames you see on your screen aren’t <em>technically </em>going to be “real” at all. </p><p>We’ve been coming to this moment in the PC gaming space for a while now, and it’s also happening on consoles too. </p><p>And personally, I have no problem with it if it looks this good — provided it’s used the right way (such as in photorealistic games).</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/tech-events/best-of-ifa-2026-we-found-the-26-top-new-gadgets"><strong>Best of IFA 2026: We found the 26 top new gadgets</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/laptops/macbook-pro-14-inch-vs-asus-proart-p14-nvidia-rtx-spark"><strong>I held the Asus ProArt P14 next to my MacBook Pro 14 — and Apple should be genuinely terrified of Nvidia’s RTX Spark</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter"><strong>I tested Acer's wild Project DualPlay Mini — and it's a gaming handheld and laptop in one gadget</strong></a><strong></strong></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/pc-gaming/i-benchmarked-the-real-dlss-5-in-nba-2k27-and-the-future-of-photorealistic-graphics-has-one-big-catch</link>
                                                                            <description>
                            <![CDATA[ I benchmarked Nvidia’s DLSS 5 in NBA 2K27 on an RTX 5070 Ti laptop. Here is why the neural rendering model requires frame generation to stay playable. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">28R4VdDndCAzgMBfVtV3TM</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/j8Wmy2eeJWccYHQige6uD5-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 06 Sep 2026 07:00:00 +0000</pubDate>                                                                                                                                <updated>Sun, 06 Sep 2026 12:21:56 +0000</updated>
                                                                                                                                            <category><![CDATA[PC Gaming]]></category>
                                                    <category><![CDATA[Gaming Laptops]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/j8Wmy2eeJWccYHQige6uD5-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DLSS 5]]></media:description>                                                            <media:text><![CDATA[DLSS 5]]></media:text>
                                <media:title type="plain"><![CDATA[DLSS 5]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/j8Wmy2eeJWccYHQige6uD5-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>So while NBA 2K27 is officially the first game to launch with <a href="https://www.tomsguide.com/gaming/pc-gaming/i-tested-the-real-dlss-5-forget-the-leaked-mods-its-not-an-ai-filter-this-is-nvidias-photorealistic-game-changer">Nvidia’s newly launched DLSS 5</a>, you’ve probably already seen it pop up in hundreds of more games than that. And I’ll say it again just like I said it before — in photorealistic games, it’s fantastic. But If you venture out of that into anything more stylized, it’s going to look weird.</p><p>That’s why it makes the world of sense in 2K27, but during my hands-on testing with my <a href="https://www.tomsguide.com/computing/gaming-laptops/i-review-gaming-laptops-for-a-living-and-this-is-my-favorite-of-2025">Asus ROG Zephyrus G14</a> (armed with an RTX 5070 Ti), I noticed something bizarre. The moment I entered a menu or triggered a replay, it suddenly felt like it was trudging through molasses.</p><p>I dug into the raw telemetry data to figure out what was going on, and what I found completely changed my understanding of Nvidia’s “3D-guided neural rendering.” That intensive new graphics pipeline of DLSS 5 may indeed be a graphical revolution — but on my humble laptop (and lower end desktops), I get the sense Frame Generation is a requirement to make it playable.</p><h2 id="the-laptop-i-m-playing-on">The laptop I’m playing on</h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Intel Core Ultra 9 386H</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>RTX 5070 Ti (115 watts)</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>32GB LPDDR5X</p></td></tr><tr><td class="firstcol " ><p><strong>SSD</strong></p></td><td  ><p>1TB PCIe Gen 4</p></td></tr></tbody></table></div><p>I’m seeing a lot of people test it on massive desktop rigs. I’ll of course get round to doing this when I’m not on my honeymoon (my wife will kill me if I started benchmarking DLSS 5 in Cancun), but first I wanted to show you some numbers on something that isn’t really being covered here — my Asus ROG Zephyrus G14 gaming laptop.</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="2akjJwtoAsyJWCruapJF9E" name="Asus ROG Zephyrus G14 (2026)" alt="Asus ROG Zephyrus G14 (2026)" src="https://cdn.mos.cms.futurecdn.net/2akjJwtoAsyJWCruapJF9E-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Nvidia’s been talking about how the model running this mode of neural rendering has been made super efficient over the past few months. In fact, when it first debuted, it ran on a separate RTX 5090 desktop GPU; whereas now, it’s able to run on a single card with the game.</p><p>So let’s give it a go in a notebook with a lower power level running through those graphics.</p><h2 id="by-the-numbers">By the numbers</h2><p>To figure out why the game was suddenly stuttering, I ran the telemetry on three different game states with DLSS 5 turned on and off. And as you can see, while the gameplay numbers are very close matching, elsewhere, the difference is pretty significant.</p><div ><table><tbody><tr><td class="firstcol " ><p><strong>Scenario</strong></p></td><td  ><p><strong>Setting</strong></p></td><td  ><p><strong>Avg FPS</strong></p></td><td  ><p><strong>1% Low FPS</strong></p></td><td  ><p><strong>PC Latency (ms)</strong></p></td><td  ><p><strong>GPU Util (%)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Menu screen</strong></p></td><td  ><p>DLSS 5 Off</p></td><td  ><p>109.8</p></td><td  ><p>85.3</p></td><td  ><p>35.8</p></td><td  ><p>91.5</p></td></tr><tr><td class="firstcol empty" ></td><td  ><p>DLSS 5 On</p></td><td  ><p>30.4</p></td><td  ><p>27.9</p></td><td  ><p>102.1</p></td><td  ><p>96.9</p></td></tr><tr><td class="firstcol " ><p><strong>Gameplay</strong></p></td><td  ><p>DLSS 5 Off</p></td><td  ><p>115.8</p></td><td  ><p>19.8</p></td><td  ><p>79.8</p></td><td  ><p>41</p></td></tr><tr><td class="firstcol empty" ></td><td  ><p>DLSS 5 On</p></td><td  ><p>115.2</p></td><td  ><p>19.8</p></td><td  ><p>111.2</p></td><td  ><p>86</p></td></tr><tr><td class="firstcol " ><p><strong>Replay</strong></p></td><td  ><p>DLSS 5 Off</p></td><td  ><p>92.6</p></td><td  ><p>57</p></td><td  ><p>56.6</p></td><td  ><p>92.9</p></td></tr><tr><td class="firstcol empty" ></td><td  ><p>DLSS 5 On</p></td><td  ><p>26.9</p></td><td  ><p>16.2</p></td><td  ><p>128.8</p></td><td  ><p>97.7</p></td></tr></tbody></table></div><p>In fact, this kind of lines up with <a href="https://www.pcgamer.com/hardware/graphics-cards/dlss-5-comes-with-a-massive-50-60-percent-performance-hit-so-i-hope-you-like-lower-frame-rates-with-your-dose-of-ai-image-enhancement/" target="_blank">PC Gamer’s report</a> of a 50-60% drop in performance. So what’s going on here? Let’s talk about it.</p><h2 id="the-heavy-cost-of-the-transformer">The heavy cost of the transformer</h2><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="n9SYNVP4yTgoCse4GzHQaL" name="DLSS 5" alt="DLSS 5" src="https://cdn.mos.cms.futurecdn.net/n9SYNVP4yTgoCse4GzHQaL-1920-80.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: Nvidia)</span></figcaption></figure><p>So why does turning <em>off </em>the new tech triple frame rate in menus and replays? Because DLSS 5 is not just an upscale filter. It is a highly complex transformer model that interacts with the on-screen geometry and injects neural rendering.</p><p>Speaking to Nvidia, it’s clear that this AI pipeline is a heavy one, and the answer to why you don’t see that same impact in gameplay is a simple one: <strong>Frame Generation</strong>.</p><p>During live gameplay, I engaged the 6x Frame Generation multiplier to take that slower neurally rendered base and fill the gaps. However, developers typically disable frame gen during static menus, UI-heavy pause screens or camera-cut replays.</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="sGWd4w3FSK3c3NZvRKTvTQ" name="DLSS 5" alt="DLSS 5" src="https://cdn.mos.cms.futurecdn.net/sGWd4w3FSK3c3NZvRKTvTQ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nvidia)</span></figcaption></figure><p>You can see how much this first iteration of DLSS 5 is sweating the system by looking at a couple of factors in the gameplay. Yes, the framerate is barely touched, but the 1% Lows takes a dip and the latency is upped quite drastically, as well as the GPU utilization spiking.</p><p>In a controller-centric game like NBA 2K27, that’s not necessarily a noticeable hit, but I can imagine that when this in its current form is moved to games that require faster inputs with a keyboard and mouse, it could become more apparent.</p><p>Take away the prop of frame generation in menus, and you see the DLSS 5 penalty more realistically on an RTX 5070 Ti laptop GPU.</p><h2 id="but-it-looks-incredible">But it looks incredible</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/dgiemBJh8Ntef9MvZNJ43R-1920-80.png" alt="NBA 2K27" /><figcaption><small role="credit">2K Games</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/2vmZFSEToxZQnXLg9PiZAR-1920-80.png" alt="NBA 2K27" /><figcaption><small role="credit">2K Games</small></figcaption></figure></figure><p>Like I said in my first impressions, when faced with photorealistic graphics, DLSS 5 is undeniably impressive. There is one very specific takeaway when I looked at these “before and after” pairs of screen captures: the core game look is preserved impressively.</p><p>DLSS 5 does a flawless job of preserving the game’s visual integrity. The shots of Jalen Brunson and Victor Wembanyama show off the micro-details on the skin and the way the sweat catches the harsh stadium lighting. The upscaler isn’t adding any aggressive smoothing or plastic-looking artifacts — it’s remarkably lifelike.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/zt3qUDcUT3hUT3uCggfbCR-1920-80.png" alt="NBA 2K27" /><figcaption><small role="credit">2K Games</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/75Z5j9Mo3Xtosb8oN2e9CR-1920-80.png" alt="NBA 2K27" /><figcaption><small role="credit">2K Games</small></figcaption></figure></figure><p>Then there’s the fabric and material textures. Brunson’s Knicks jersey and the fabric of the couch in the cutscene get an upgrade to show off the stitching more with high-resolution clarity, and without any noticeable AI-induced blurring.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/jDbGWSTjdSLRHjA7eAq48R-1920-80.png" alt="NBA 2K27" /><figcaption><small role="credit">2K Games</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/q4xFZMUkJMWp6Z9tBJ3rvP-1920-80.png" alt="NBA 2K27" /><figcaption><small role="credit">2K Games</small></figcaption></figure></figure><p>The lighting reacts to on-screen characters more realistically, there isn’t any noticeable AI “fizzing” or ghosting around finer textures like hair — something upscalers have had problems with in the past. </p><h2 id="is-this-a-frame-generated-future">Is this a frame-generated future?</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/YWWyKjCTaivXpgCJPxyaBR-1920-80.png" alt="NBA 2K27" /><figcaption><small role="credit">2K Games</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/aZfs5KRJDBPYAFnnv8zE9R-1920-80.png" alt="NBA 2K27" /><figcaption><small role="credit">2K Games</small></figcaption></figure></figure><p>DLSS 5 integration proved to me that the uncanny valley is dead, but it also proves that native frame rates are on their way out with it.</p><p>Nvidia themselves keep saying that Moore’s law is dead, and getting crafty with AI is what will bridge that generational gap. That threshold has been crossed — photorealism is getting too heavy for high-end silicon to render natively. </p><p>And DLSS 5 proves that future of photorealism isn’t just about rendering better pixels; it’s about accepting that a good chunk of the frames you see on your screen aren’t <em>technically </em>going to be “real” at all. </p><p>We’ve been coming to this moment in the PC gaming space for a while now, and it’s also happening on consoles too. </p><p>And personally, I have no problem with it if it looks this good — provided it’s used the right way (such as in photorealistic games).</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/tech-events/best-of-ifa-2026-we-found-the-26-top-new-gadgets"><strong>Best of IFA 2026: We found the 26 top new gadgets</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/computing/laptops/macbook-pro-14-inch-vs-asus-proart-p14-nvidia-rtx-spark"><strong>I held the Asus ProArt P14 next to my MacBook Pro 14 — and Apple should be genuinely terrified of Nvidia’s RTX Spark</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter"><strong>I tested Acer's wild Project DualPlay Mini — and it's a gaming handheld and laptop in one gadget</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tried Lenovo’s Project Swan and its expanding screen might finally kill the portable monitor ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Despite how hard I try, I always end up bringing too many gadgets when I travel. With a transforming device like Lenovo’s new Project Swan, though, those days may be done for good.</p><p>Alongside one of the best laptops, I often <a href="https://www.tomsguide.com/computing/monitors/this-dual-screen-portable-monitor-changed-how-i-use-my-laptop-and-now-i-cant-imagine-traveling-without-it">pack a portable monitor</a> for those times when I need extra screen real estate. This setup has served me well in the past, but between chargers, power banks, and cables, my tech bag gets unwieldy fast. In fact, on my last trip to Taiwan for Computex, my carry-on ended up weighing more than my checked bag.</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/i5nUdOgQnmg" allowfullscreen></iframe></div></div><p>At <a href="https://www.tomsguide.com/tag/ifa-2026">IFA 2026,</a> Lenovo unveiled two new concept laptops. While <a href="https://www.tomsguide.com/computing/laptops/i-held-lenovos-project-aeroblade-laptop-and-its-giving-me-serious-yet-more-powerful-macbook-air-vibes" target="_blank">Project AeroBlade</a> was remarkably thin and light, Project Swan transforms from a compact 14-inch laptop into a 17-inch workstation with the push of a button. We saw a similar horizontal expansion mechanic with the company’s <a href="https://www.tomsguide.com/computing/gaming-laptops/i-just-tested-lenovos-legion-pro-rollable-concept-and-now-my-gaming-laptop-feels-boring">Legion Pro Rollable</a> concept back at CES, but that machine was built strictly for gaming.</p><p>Now, Lenovo is taking that same core idea — using a streamlined motor array — and tailoring it to a business laptop. Here is everything you need to know about Project Swan, and why it could mark the end of portable monitors (if you’re willing to pay up, of course). </p><h2 id="wider-but-not-unwieldy">Wider but not unwieldy</h2><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="ZTKpPBQzg89M9Kuk4xghCJ" name="Lenovo Project Swan" alt="The rear lid of the Lenovo Project Swan concept laptop at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/ZTKpPBQzg89M9Kuk4xghCJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>With its screen retracted, Project Swan looks like a standard, highly portable 14-inch notebook weighing about 3.5 pounds. While that’s slightly on the heavy side for a 14-inch laptop, keep in mind that this is a concept — and having it in your bag means leaving a secondary display at home.</p><p>The idea is to give mobile power users a workspace that expands only when required. You can comfortably use the 14-inch screen on a cramped airplane tray table, then expand the display once you get to your hotel desk or a coffee shop.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="krHLUpKPJuptvfncvj9koP" name="Lenovo Project Swan-2" alt="The side ports of Lenovo's Project Swan concept laptop at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/krHLUpKPJuptvfncvj9koP-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While full internal specs haven't been released yet, the physical layout includes two side-mounted USB-C ports and a headphone jack. A rear USB-C port handles charging, flanked by a tiny LED status indicator. Despite housing a rolling screen assembly, the chassis stays surprisingly trim at 17.9mm (0.7 inches).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YmxeBb4doRifk6CFqRLKrU" name="Lenovo Project Swan-3" alt="The keyboard and trackpad of the Lenovo Project Swan concept laptop at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/YmxeBb4doRifk6CFqRLKrU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As with the AeroBlade concept, you get Lenovo’s signature keyboard with generous key travel, paired with a spacious trackpad. Toggling between retracted and expanded modes is effortless: just tap the Insert key, and the laptop’s motors handle the rest.</p><p>Fully extended, the display rolls out into a wider 16:9 layout. That extra horizontal space is built for running two full apps side-by-side. As someone who writes with dual windows open, even on a <a href="https://www.tomsguide.com/computing/macbooks/macbook-pro-16-inch-m5-pro-review">16-inch MacBook Pro,</a> that added horizontal space would make an immediate difference.</p><h2 id="the-second-screen-39-s-swan-song">The second screen's swan song?</h2><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.29%;"><img id="XQhavHz8SCn6oTDkeQwpJZ" name="Lenovo Project Swan-LIST2" alt="The Lenovo Project Swan concept laptop with its screen retracted at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/XQhavHz8SCn6oTDkeQwpJZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1441" 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 still catch myself wishing Project Swan rolled out even further. As someone who uses an <a href="https://www.tomsguide.com/computing/monitors/i-ditched-my-dual-monitor-setup-for-this-single-ultrawide-monitor-and-ill-never-go-back">ultrawide monitor at home</a>, stretching out to a full 21:9 aspect ratio to fit two uncompressed, full-sized browser windows side-by-side would be the dream.</p><p>Even as a 16:9 expansion, having a single laptop that stretches on demand feels like the ideal solution for business travelers who hate setting up an external monitor. I’ve tried solving this issue with <a href="https://www.tomsguide.com/computing/i-paired-a-pocketable-mini-pc-with-a-pair-of-ar-glasses-and-even-i-was-surprised-when-it-became-my-go-to-travel-setup">display glasses connected to a mini PC</a>, but even a pair of the <a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">best smart glasses</a> can lead to eye fatigue over a long workday.</p><p>Although Project Swan is technically a concept right now, I wouldn't be surprised to see a retail version hit the market relatively soon. Unlike companies that showcase flashy concepts never meant for production, Lenovo actually ships them. Case in point: their vertical rollable concept at CES eventually made its way to store shelves as the <a href="https://www.tomsguide.com/computing/laptops/i-just-tried-lenovos-first-rollable-thinkpad-and-its-wonderfully-weird">ThinkBook Plus Gen 6 Rollable</a>.</p><p>If Project Swan makes the jump to a retail product, it will undoubtedly carry a steep price tag. But for business travelers who want maximum screen real estate without pulling extra gear out of their bag at airport security, it might be worth every penny.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/tech-events/best-of-ifa-2026-we-found-the-26-top-new-gadgets"><strong>Best of IFA 2026: We found the 26 top new gadgets</strong></a></li><li><a href="https://www.tomsguide.com/computing/laptops/violoop-hands-on-ifa-2026"><strong>This tiny AI box could save me from upgrading my perfectly good laptop</strong></a></li><li><a href="https://www.tomsguide.com/computing/laptops/best-laptops-of-ifa-2026-wild-colors-ultrathin-designs-and-rollable-displays"><strong>Best laptops of IFA 2026: Wild colors, ultrathin designs and rollable displays</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/i-tried-lenovos-project-swan-and-its-expanding-screen-might-finally-kill-the-portable-monitor</link>
                                                                            <description>
                            <![CDATA[ Lenovo’s latest concept laptop expands into a full 16:9 display for maximum productivity when you need it and ultimate portability when you don’t. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CxPAaSpSB8Yco2Hat26ppc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/emJV2dq6hm3WAbnh5mnZB9-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 05 Sep 2026 16:37:39 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></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-320-70.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;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;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/emJV2dq6hm3WAbnh5mnZB9-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Lenovo&#039;s Project Swan concept laptop fully extended at IFA 2026]]></media:description>                                                            <media:text><![CDATA[Lenovo&#039;s Project Swan concept laptop fully extended at IFA 2026]]></media:text>
                                <media:title type="plain"><![CDATA[Lenovo&#039;s Project Swan concept laptop fully extended at IFA 2026]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/emJV2dq6hm3WAbnh5mnZB9-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Despite how hard I try, I always end up bringing too many gadgets when I travel. With a transforming device like Lenovo’s new Project Swan, though, those days may be done for good.</p><p>Alongside one of the best laptops, I often <a href="https://www.tomsguide.com/computing/monitors/this-dual-screen-portable-monitor-changed-how-i-use-my-laptop-and-now-i-cant-imagine-traveling-without-it">pack a portable monitor</a> for those times when I need extra screen real estate. This setup has served me well in the past, but between chargers, power banks, and cables, my tech bag gets unwieldy fast. In fact, on my last trip to Taiwan for Computex, my carry-on ended up weighing more than my checked bag.</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/i5nUdOgQnmg" allowfullscreen></iframe></div></div><p>At <a href="https://www.tomsguide.com/tag/ifa-2026">IFA 2026,</a> Lenovo unveiled two new concept laptops. While <a href="https://www.tomsguide.com/computing/laptops/i-held-lenovos-project-aeroblade-laptop-and-its-giving-me-serious-yet-more-powerful-macbook-air-vibes" target="_blank">Project AeroBlade</a> was remarkably thin and light, Project Swan transforms from a compact 14-inch laptop into a 17-inch workstation with the push of a button. We saw a similar horizontal expansion mechanic with the company’s <a href="https://www.tomsguide.com/computing/gaming-laptops/i-just-tested-lenovos-legion-pro-rollable-concept-and-now-my-gaming-laptop-feels-boring">Legion Pro Rollable</a> concept back at CES, but that machine was built strictly for gaming.</p><p>Now, Lenovo is taking that same core idea — using a streamlined motor array — and tailoring it to a business laptop. Here is everything you need to know about Project Swan, and why it could mark the end of portable monitors (if you’re willing to pay up, of course). </p><h2 id="wider-but-not-unwieldy">Wider but not unwieldy</h2><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="ZTKpPBQzg89M9Kuk4xghCJ" name="Lenovo Project Swan" alt="The rear lid of the Lenovo Project Swan concept laptop at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/ZTKpPBQzg89M9Kuk4xghCJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>With its screen retracted, Project Swan looks like a standard, highly portable 14-inch notebook weighing about 3.5 pounds. While that’s slightly on the heavy side for a 14-inch laptop, keep in mind that this is a concept — and having it in your bag means leaving a secondary display at home.</p><p>The idea is to give mobile power users a workspace that expands only when required. You can comfortably use the 14-inch screen on a cramped airplane tray table, then expand the display once you get to your hotel desk or a coffee shop.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="krHLUpKPJuptvfncvj9koP" name="Lenovo Project Swan-2" alt="The side ports of Lenovo's Project Swan concept laptop at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/krHLUpKPJuptvfncvj9koP-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While full internal specs haven't been released yet, the physical layout includes two side-mounted USB-C ports and a headphone jack. A rear USB-C port handles charging, flanked by a tiny LED status indicator. Despite housing a rolling screen assembly, the chassis stays surprisingly trim at 17.9mm (0.7 inches).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YmxeBb4doRifk6CFqRLKrU" name="Lenovo Project Swan-3" alt="The keyboard and trackpad of the Lenovo Project Swan concept laptop at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/YmxeBb4doRifk6CFqRLKrU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As with the AeroBlade concept, you get Lenovo’s signature keyboard with generous key travel, paired with a spacious trackpad. Toggling between retracted and expanded modes is effortless: just tap the Insert key, and the laptop’s motors handle the rest.</p><p>Fully extended, the display rolls out into a wider 16:9 layout. That extra horizontal space is built for running two full apps side-by-side. As someone who writes with dual windows open, even on a <a href="https://www.tomsguide.com/computing/macbooks/macbook-pro-16-inch-m5-pro-review">16-inch MacBook Pro,</a> that added horizontal space would make an immediate difference.</p><h2 id="the-second-screen-39-s-swan-song">The second screen's swan song?</h2><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.29%;"><img id="XQhavHz8SCn6oTDkeQwpJZ" name="Lenovo Project Swan-LIST2" alt="The Lenovo Project Swan concept laptop with its screen retracted at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/XQhavHz8SCn6oTDkeQwpJZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1441" 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 still catch myself wishing Project Swan rolled out even further. As someone who uses an <a href="https://www.tomsguide.com/computing/monitors/i-ditched-my-dual-monitor-setup-for-this-single-ultrawide-monitor-and-ill-never-go-back">ultrawide monitor at home</a>, stretching out to a full 21:9 aspect ratio to fit two uncompressed, full-sized browser windows side-by-side would be the dream.</p><p>Even as a 16:9 expansion, having a single laptop that stretches on demand feels like the ideal solution for business travelers who hate setting up an external monitor. I’ve tried solving this issue with <a href="https://www.tomsguide.com/computing/i-paired-a-pocketable-mini-pc-with-a-pair-of-ar-glasses-and-even-i-was-surprised-when-it-became-my-go-to-travel-setup">display glasses connected to a mini PC</a>, but even a pair of the <a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">best smart glasses</a> can lead to eye fatigue over a long workday.</p><p>Although Project Swan is technically a concept right now, I wouldn't be surprised to see a retail version hit the market relatively soon. Unlike companies that showcase flashy concepts never meant for production, Lenovo actually ships them. Case in point: their vertical rollable concept at CES eventually made its way to store shelves as the <a href="https://www.tomsguide.com/computing/laptops/i-just-tried-lenovos-first-rollable-thinkpad-and-its-wonderfully-weird">ThinkBook Plus Gen 6 Rollable</a>.</p><p>If Project Swan makes the jump to a retail product, it will undoubtedly carry a steep price tag. But for business travelers who want maximum screen real estate without pulling extra gear out of their bag at airport security, it might be worth every penny.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/tech-events/best-of-ifa-2026-we-found-the-26-top-new-gadgets"><strong>Best of IFA 2026: We found the 26 top new gadgets</strong></a></li><li><a href="https://www.tomsguide.com/computing/laptops/violoop-hands-on-ifa-2026"><strong>This tiny AI box could save me from upgrading my perfectly good laptop</strong></a></li><li><a href="https://www.tomsguide.com/computing/laptops/best-laptops-of-ifa-2026-wild-colors-ultrathin-designs-and-rollable-displays"><strong>Best laptops of IFA 2026: Wild colors, ultrathin designs and rollable displays</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ This tiny AI box could save me from upgrading my perfectly good laptop ]]></title>
                                                                                                <dc:content><![CDATA[ <p>There's been a sudden surge of AI agents that can help you perform tasks on your PC, even while you're away. You've probably heard about tools like <a href="https://www.tomsguide.com/ai/openclaw-is-the-viral-ai-assistant-that-lives-on-your-device-what-you-need-to-know">OpenClaw</a>, which can run autonomously on your behalf. But one of the problems with running these kinds of agents locally is that they often require plenty of hardware resources to function properly.</p><p>I'm not someone who changes laptops every year. I still use a <a href="https://www.tomsguide.com/computing/macbooks/the-macbook-air-m3-is-my-daily-driver-and-it-just-crashed-to-usd799-for-prime-day">MacBook Air M3</a> from 2023, and I'll probably continue using it until it gives up on me, which hopefully won't be for another five to seven years. But that also means my laptop isn't necessarily built for running powerful local AI agents, and upgrading my entire computer just for that doesn't make much sense.</p><p>Well, for people like me, Violoop might have an interesting solution. The company has just showcased its new hardware AI agent at <a href="https://www.tomsguide.com/tag/ifa-2026">IFA 2026</a>, and unlike software agents that run directly on your laptop, use its resources, and potentially drain more battery, Violoop is a separate device that connects to your computer and handles much of the AI processing itself.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yVJ3VTKvbAdvhcrzgS6TVi" name="violoop-hands-on-1" alt="Hands-on with the Violoop AI box at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/yVJ3VTKvbAdvhcrzgS6TVi-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Similar to software-based agents, Violoop is screen-aware. It can understand what's happening on your display and help perform tasks based on that context. For example, if someone asks you to send them an address, Violoop can pull up the relevant information and fill it in for you. If you're looking at a long PDF that you don't have time to read, you can ask it to summarize the document instead.</p><p>The idea is that the device gradually understands you better the more you use it. Violoop builds what the company calls a continuous memory graph, which learns about your workflows, preferences, and patterns over time so the agent has more context when you're asking it to do something.</p><p>Of course, having an AI constantly looking at what's on your screen and building a memory around what you do immediately raises some privacy questions. Violoop says it has taken a local-first approach here. Screen data is processed directly on the device and, according to the company, is never transmitted to the cloud.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XGFFhczbzUjbCwk4qmUnZi" name="violoop-hands-on-3" alt="Hands-on with the Violoop AI box at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/XGFFhczbzUjbCwk4qmUnZi-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Inside, there's an 8-billion-parameter local AI model with 26 TOPS of on-device AI performance handling these tasks. When Violoop does need to use the cloud, the company says it sends "only the information necessary" to complete the task, while your screen itself is never streamed.</p><p>There's also a dedicated STM32H563 security processor for handling approvals around sensitive tasks. The company says you'll be able to connect your preferred AI services, including ChatGPT, Claude, Gemini, and others.</p><p>The hardware itself is also pretty interesting. There's a small display on the front showing things like the time and what the AI agent is currently doing. The whole thing almost looks like a tiny old-school computer monitor sitting next to your laptop, which I actually quite like.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fHuRpEZMWPS6N2kTr2R6ai" name="violoop-hands-on-4" alt="Hands-on with the Violoop AI box at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/fHuRpEZMWPS6N2kTr2R6ai-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>One thing worth noting is that Violoop isn't powered directly through your laptop's USB-C port. It requires its own external power source. Around the back, you'll find three connections: USB-C, HDMI, and a dedicated power input.</p><p>There's also a physical button on top that acts as a hardware-level approval key. When the agent wants to perform a sensitive action or something that involves multiple steps, you can physically press the button to approve it rather than letting the AI simply go ahead on its own.</p><p>Perhaps the most interesting part for me is that Violoop isn't tied to one operating system. The company says it works with both Windows and macOS, and setup is supposed to be largely plug-and-play. At least, that's what Violoop tells me.</p><p>Violoop is launching on <a href="http://kickstarter.com/projects/bvio/violoop-plug-in-ai-for-your-computer">Kickstarter</a> on September 15, 2026, with an introductory price of $399. The company expects to begin shipping in mid-October, after which the device is expected to be more widely available for $799.</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/laptops/best-laptops-of-ifa-2026-wild-colors-ultrathin-designs-and-rollable-displays">Best laptops of IFA 2026: Wild colors, ultrathin designs and rollable displays</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/acer-predator-atlas-7-hands-on-ifa-2026">I tried Acer's new 7-inch gaming handheld at IFA 2026 — this might be the sweet spot</a></li><li><a href="https://www.tomsguide.com/computing/laptops/dell-14s-hands-on-ifa-2026">I used Dell's latest MacBook Neo rival — and I'm not complaining about having another one</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/violoop-hands-on-ifa-2026</link>
                                                                            <description>
                            <![CDATA[ Violoop is a standalone hardware AI agent that connects to your laptop and handles AI processing without using your computer's own resources. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">6QgKVL2ajjhomyufGQV57g</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/B6hUjNrNcpYQiezaSjWsUi-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 05 Sep 2026 14:18:20 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                                    <dc:creator><![CDATA[ Sanuj Bhatia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/8p5BvMVA7cnu5AWkxnTjRC-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/B6hUjNrNcpYQiezaSjWsUi-1920-80.jpg">
                                                            <media:credit><![CDATA[Sanuj Bhatia / Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Hands-on with the Violoop AI box at IFA 2026]]></media:description>                                                            <media:text><![CDATA[Hands-on with the Violoop AI box at IFA 2026]]></media:text>
                                <media:title type="plain"><![CDATA[Hands-on with the Violoop AI box at IFA 2026]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/B6hUjNrNcpYQiezaSjWsUi-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There's been a sudden surge of AI agents that can help you perform tasks on your PC, even while you're away. You've probably heard about tools like <a href="https://www.tomsguide.com/ai/openclaw-is-the-viral-ai-assistant-that-lives-on-your-device-what-you-need-to-know">OpenClaw</a>, which can run autonomously on your behalf. But one of the problems with running these kinds of agents locally is that they often require plenty of hardware resources to function properly.</p><p>I'm not someone who changes laptops every year. I still use a <a href="https://www.tomsguide.com/computing/macbooks/the-macbook-air-m3-is-my-daily-driver-and-it-just-crashed-to-usd799-for-prime-day">MacBook Air M3</a> from 2023, and I'll probably continue using it until it gives up on me, which hopefully won't be for another five to seven years. But that also means my laptop isn't necessarily built for running powerful local AI agents, and upgrading my entire computer just for that doesn't make much sense.</p><p>Well, for people like me, Violoop might have an interesting solution. The company has just showcased its new hardware AI agent at <a href="https://www.tomsguide.com/tag/ifa-2026">IFA 2026</a>, and unlike software agents that run directly on your laptop, use its resources, and potentially drain more battery, Violoop is a separate device that connects to your computer and handles much of the AI processing itself.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yVJ3VTKvbAdvhcrzgS6TVi" name="violoop-hands-on-1" alt="Hands-on with the Violoop AI box at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/yVJ3VTKvbAdvhcrzgS6TVi-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Similar to software-based agents, Violoop is screen-aware. It can understand what's happening on your display and help perform tasks based on that context. For example, if someone asks you to send them an address, Violoop can pull up the relevant information and fill it in for you. If you're looking at a long PDF that you don't have time to read, you can ask it to summarize the document instead.</p><p>The idea is that the device gradually understands you better the more you use it. Violoop builds what the company calls a continuous memory graph, which learns about your workflows, preferences, and patterns over time so the agent has more context when you're asking it to do something.</p><p>Of course, having an AI constantly looking at what's on your screen and building a memory around what you do immediately raises some privacy questions. Violoop says it has taken a local-first approach here. Screen data is processed directly on the device and, according to the company, is never transmitted to the cloud.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XGFFhczbzUjbCwk4qmUnZi" name="violoop-hands-on-3" alt="Hands-on with the Violoop AI box at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/XGFFhczbzUjbCwk4qmUnZi-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Inside, there's an 8-billion-parameter local AI model with 26 TOPS of on-device AI performance handling these tasks. When Violoop does need to use the cloud, the company says it sends "only the information necessary" to complete the task, while your screen itself is never streamed.</p><p>There's also a dedicated STM32H563 security processor for handling approvals around sensitive tasks. The company says you'll be able to connect your preferred AI services, including ChatGPT, Claude, Gemini, and others.</p><p>The hardware itself is also pretty interesting. There's a small display on the front showing things like the time and what the AI agent is currently doing. The whole thing almost looks like a tiny old-school computer monitor sitting next to your laptop, which I actually quite like.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fHuRpEZMWPS6N2kTr2R6ai" name="violoop-hands-on-4" alt="Hands-on with the Violoop AI box at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/fHuRpEZMWPS6N2kTr2R6ai-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>One thing worth noting is that Violoop isn't powered directly through your laptop's USB-C port. It requires its own external power source. Around the back, you'll find three connections: USB-C, HDMI, and a dedicated power input.</p><p>There's also a physical button on top that acts as a hardware-level approval key. When the agent wants to perform a sensitive action or something that involves multiple steps, you can physically press the button to approve it rather than letting the AI simply go ahead on its own.</p><p>Perhaps the most interesting part for me is that Violoop isn't tied to one operating system. The company says it works with both Windows and macOS, and setup is supposed to be largely plug-and-play. At least, that's what Violoop tells me.</p><p>Violoop is launching on <a href="http://kickstarter.com/projects/bvio/violoop-plug-in-ai-for-your-computer">Kickstarter</a> on September 15, 2026, with an introductory price of $399. The company expects to begin shipping in mid-October, after which the device is expected to be more widely available for $799.</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/laptops/best-laptops-of-ifa-2026-wild-colors-ultrathin-designs-and-rollable-displays">Best laptops of IFA 2026: Wild colors, ultrathin designs and rollable displays</a></li><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/acer-predator-atlas-7-hands-on-ifa-2026">I tried Acer's new 7-inch gaming handheld at IFA 2026 — this might be the sweet spot</a></li><li><a href="https://www.tomsguide.com/computing/laptops/dell-14s-hands-on-ifa-2026">I used Dell's latest MacBook Neo rival — and I'm not complaining about having another one</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just tested the new Alienware 16 Area-51 — and the OLED panel makes it the complete package ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The new Alienware 16 Area-51 gaming laptop is largely a refresh of last year’s model, but it includes the one feature I wanted: a glare-free OLED panel. Toss in the latest Intel and Nvidia components, along with the otherworldly design, and you have one of the best gaming laptops on the market.</p><p>As with 2025’s Alienware 16 Area-51, this gaming laptop has serious flair, thanks to the Liquid Teal finish on the anodized aluminum chassis, which gives it a dark, iridescent sheen that shifts colors under different lighting conditions. The Gorilla Glass window on the bottom lets you see the internal components, while the RGB lighting enhances the laptop’s otherworldly appearance.</p><p>You can configure the Alienware 16 Area-51 (from $2,529, $3829 as tested) with up to an Intel Core Ultra 9 290HX Plus Arrow Lake Refresh CPU, an Nvidia RTX 5090 GPU, 64GB of RAM, and 12TB of SSD storage. My review unit, with its RTX 5080, Core Ultra 9 290HX Plus, and 32GB of RAM, had no issue handling even the most demanding PC games.</p><p>The star of the show is the new OLED panel, which provides rich contrast between dark and light elements. The anti-glare does rob the display of some of its luster, but the bright HDR and vibrant colors make up for that. You won’t complain much given how beautiful games look on this 16-inch 240Hz display.</p><p>While this laptop is still too bulky for my liking and has worse battery life than the previous model, this is undeniably a powerful gaming laptop with a fetching design like no other. If you have the cash for this beast, you won’t be disappointed. Find out more in my full review of the Alienware 16 Area-51 (2026).</p><h3 class="article-body__section" id="section-alienware-16-area-51-2026-review-cheat-sheet"><span>Alienware 16 Area-51 (2026) review: Cheat sheet</span></h3><ul><li><strong>What was it?</strong> The Alienware 16 Area-51 is a high-end gaming laptop.</li><li><strong>Who is it for?</strong> The Alienware 16 Area-51 is for hardcore gamers who want a machine that can easily play graphically demanding modern games and look good doing it.</li><li><strong>What does it cost?</strong> The Alienware 16 Area-51 starts at $2,529 on <a href="https://www.dell.com/en-us/shop/cty/pdp/spd/alienware-area-51-aa16250-gaming-laptop?cjdata=MXxOfDB8WXww" target="_blank" rel="nofollow">Dell’s website</a> at the time of writing. This configuration has an Intel Core Ultra 7 270HX Plus CPU, an Nvidia RTX 5060 GPU, 16GB of RAM, and 1TB of SSD storage.</li><li><strong>What do we like?</strong> We like the futuristic design, killer performance, and stunning OLED panel.</li><li><strong>What don’t we like?</strong> We don’t like the laptop’s bulkiness and poor(er) battery life.</li></ul><h3 class="article-body__section" id="section-alienware-16-area-51-2026-review-specs"><span>Alienware 16 Area-51 (2026) review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Alienware 16 Area-51 (starting)</strong></p></td><td  ><p><strong>Alienware 16 Area-51 (tested)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$2,529</p></td><td  ><p>$3,829</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>16-inch (2560x1600) OLED </p></td><td  ><p>16-inch (2560x1600) OLED </p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Intel Core Ultra 7 processor 270HX Plus </p></td><td  ><p>Intel Core Ultra 9 processor 290HX Plus </p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Nvidia GeForce RTX 5060 </p></td><td  ><p>Nvidia GeForce RTX 5080 </p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>16GB DDR5</p></td><td  ><p>32GB DDR5</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>1TB</p></td><td  ><p>1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1x headphone jack, 3x USB-A, 2x USB-C/Thunderbolt 4, 1x HDMI</p></td><td  ><p>1x headphone jack, 3x USB-A, 2x USB-C/Thunderbolt 5, 1x HDMI</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>14.37 x 11.41 x 1.12 inches</p></td><td  ><p>14.37 x 11.41 x 1.12 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>7.49 pounds</p></td><td  ><p>7.49 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-alienware-16-area-51-2026-review-the-ups"><span>Alienware 16 Area-51 (2026) review: The ups</span></h3><p>The Alienware 16 Area-51 finally features an OLED panel while retaining the best aspects of its predecessor, including the eye-catching design, monstrous performance, and mesmerizing RGB lighting.</p><h2 id="futuristic-design">Futuristic design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="EadBWdkp5t5aKGaaUYThW5" name="Alienware 16 Area-51 (2026)--7" alt="Alienware 16 Area-51 (2026)" src="https://cdn.mos.cms.futurecdn.net/EadBWdkp5t5aKGaaUYThW5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Alienware didn’t change the design here, which is good, since this is still one of the most distinctive gaming laptops on the market. The rounded corners, Liquid Teal finish and RGB lighting on the keyboard deck make you feel like you’re using a laptop from the future. The smooth, sturdy aluminum chassis also feels good to touch and hold.</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="UX8mU8tr5WRBWvBzDrgUb8" name="Alienware 16 Area-51 (2026)--12" alt="Alienware 16 Area-51 (2026)" src="https://cdn.mos.cms.futurecdn.net/UX8mU8tr5WRBWvBzDrgUb8-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The model I reviewed came with a Cherry MX ultra-low-profile mechanical keyboard. Thanks to that, I had a great experience typing, as the keys are clicky and have a short travel distance. The touchpad is still relatively small, but it didn’t ruin my flow. I also like that the spacious keyboard deck gave my hands plenty of room to move.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nfprHQmd7epvgPj2Au4FnE" name="Alienware 16 Area-51 (2026)--10" alt="Alienware 16 Area-51 (2026)" src="https://cdn.mos.cms.futurecdn.net/nfprHQmd7epvgPj2Au4FnE-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You’ll find the lion’s share of the laptop’s ports on the back, with the 3.5mm headphone jack and an SD card slot located on the left-hand side. There’s a good selection of ports, including three USB-A, two USB-C, and an HDMI port. It’s not always easy to connect and reconnect peripherals when the laptop’s lid is open, but if you always keep everything connected, then it shouldn’t be an issue.</p><h2 id="powerful-gaming-performance">Powerful gaming performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Lwgx9Aj5d6DsFJo3UopZAG" name="Alienware 16 Area-51 (2026)--6" alt="Alienware 16 Area-51 (2026)" src="https://cdn.mos.cms.futurecdn.net/Lwgx9Aj5d6DsFJo3UopZAG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Alienware 16 Area-51 I reviewed is purpose-built for high-end gaming performance, thanks to powerful components such as its Intel Core Ultra 9 290HX CPU, Nvidia GeForce RTX 5080 laptop GPU, and 32GB of RAM. If you want to play games at native resolution with high graphics settings, you won’t be disappointed.</p><p>At native resolution and default graphics settings, with frame generation disabled and the laptop’s performance mode enabled, I got Cyberpunk 2077 to generally run at around 110 frames per second. This includes both walking and driving. Frame rates dipped into the low 90s in some of the denser downtown areas, but it’s hard to complain about a game running at 90 fps.</p><div ><table><caption>Gaming performance (@ 1600p)</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Alienware 16 Area-51 (2026)</strong></p></td><td  ><p><strong>Razer Blade 16 (2026)</strong></p></td><td  ><p><strong>Asus Zephyrus G16 2026</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Assassin’s Creed Shadows</strong></p></td><td  ><p>65 fps</p></td><td  ><p>45 fps</p></td><td  ><p>34 fps</p></td></tr><tr><td class="firstcol " ><p><strong>Doom: The Dark Ages</strong></p></td><td  ><p>70 fps</p></td><td  ><p>66 fps</p></td><td  ><p>53 fps</p></td></tr><tr><td class="firstcol " ><p><strong>Cyberpunk 2077</strong></p></td><td  ><p>38 fps</p></td><td  ><p>41 fps</p></td><td  ><p>29 fps</p></td></tr></tbody></table></div><p>Using a game’s built-in benchmarking tool, we saw impressive results when we tested the laptop in our lab. At native resolution and maximum graphical settings, with the laptop’s performance mode disabled, Cyberpunk 2077 ran at 38 fps—certainly lower than when I ran it with performance mode on and at default graphics settings. Other titles, such as Assassin’s Creed Shadows and Doom: The Dark Ages, ran much better under these same conditions.</p><p>The Alienware 16 Area-51 also fared well against competing laptops with better specs. This includes the Razer Blade 16, which has a more powerful RTX 5090 GPU, and the Asus Zephyrus G16, which has the same CPU and GPU but double the RAM.</p><p>Even with frame-boosting DLSS disabled, you can still enjoy extremely high frame rates with performance mode enabled and medium-to-high graphics settings. You’ll get fantastic performance out of the box thanks to the Alienware 16’s powerful components.</p><h2 id="vivid-oled-display">Vivid OLED display</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xUiJ6UPQoZVzD7a8QyTWWP" name="Alienware 16 Area-51 (2026)--3" alt="Alienware 16 Area-51 (2026)" src="https://cdn.mos.cms.futurecdn.net/xUiJ6UPQoZVzD7a8QyTWWP-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is the big update for the Alienware 16 Area-51, and it’s a welcome one, as the lack of an OLED panel on last year’s model was one of its few setbacks. Now, games look as glorious as they perform, making the overall experience even better.</p><div><blockquote><p>A game like Cyberpunk 2077 literally shines on this 16-inch OLED panel. The contrast between dark and light elements helps the colorful neon signs and holograms really pop during the in-game night cycle.</p></blockquote></div><p>A game like Cyberpunk 2077 literally shines on this 16-inch OLED panel. The contrast between dark and light elements helps the colorful neon signs and holograms really pop out during the in-game night cycle. The scorching sun during the day is also impressive, with dark shadows contrasting nicely against the daylight.</p><p>The model I reviewed has an anti-glare screen that effectively reduces glare from light sources. While that’s a plus, it can also make the overall image look less vibrant than on a glossy screen. This is a minor setback, and one I can overlook since I’d rather have an anti-glare screen than not.</p><div ><table><caption>Display benchmark results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Alienware 16 Area-51 (2026)</strong></p></td><td  ><p><strong>Razer Blade 16 (2026)</strong></p></td><td  ><p><strong>Asus Zephyrus G16 2026 </strong></p></td></tr><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>368 (SDR) | 556 (HDR)</p></td><td  ><p>408 (SDR) | 586 (HDR)</p></td><td  ><p>469 (SDR) | 672 (HDR)</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>132.2%</p></td><td  ><p>127% </p></td><td  ><p>113.5%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>93.7%</p></td><td  ><p>90% </p></td><td  ><p>80.4%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.20</p></td><td  ><p>0.23 </p></td><td  ><p>0.22</p></td></tr></tbody></table></div><p>How did the Alienware 16’s display perform in our lab tests? As you can see above, it has strong color reproduction (sRGB and DCI-P3) and solid color accuracy (Delta-E). Hues are somewhat oversaturated, which benefits games like Cyberpunk 2077. SDR and HDR brightness are also good for an OLED panel.</p><p>Games run buttery smooth thanks to the fast 240Hz refresh rate. I didn’t encounter any stuttering or flickering during testing. The response time is now 0.2ms, which is much lower than last year’s model’s 3ms. Granted, you likely won’t notice a major difference unless you’re a competitive gamer, but the lower response time will benefit you regardless.</p><h2 id="fun-rgb-lighting">Fun RGB lighting</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LNCFZgL8DAbHiZjHNSf76W" name="Alienware 16 Area-51 (2026)--9" alt="Alienware 16 Area-51 (2026)" src="https://cdn.mos.cms.futurecdn.net/LNCFZgL8DAbHiZjHNSf76W-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Like last year’s model, this Alienware 16 laptop has some seriously impressive RGB lighting. And I don’t say that lightly since I’m not typically an RGB fan. But the way it’s implemented here complements this laptop’s unique design.</p><p>The Gorilla Glass bottom allows the RGB lighting to cast an underglow. And this same lighting also spills out through the top of the keyboard deck. As before, I haven’t seen other gaming laptops match this effect.</p><p>Naturally, you can customize the lighting effects however you prefer via the Alienware Commander Center app. The app is easy to use if you just want to use presets, but it’s also very granular for more in-depth fine-tuning.</p><h3 class="article-body__section" id="section-alienware-16-area-51-2026-review-the-downs"><span>Alienware 16 Area-51 (2026) review: The downs</span></h3><p>Though the Alienware 16 Area-51 has a lot going for it, it has some noticeable drawbacks.</p><h2 id="poor-battery-life">Poor battery life</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hnd8NdePEsHDAQbrMeq9Dg" name="Alienware 16 Area-51 (2026)--13" alt="Alienware 16 Area-51 (2026)" src="https://cdn.mos.cms.futurecdn.net/hnd8NdePEsHDAQbrMeq9Dg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I never expect gaming laptops to have stellar battery life, as they’re usually lacking in that area. The Alienware 16 Area-51 is no different, except that it actually runs out of juice faster than last year’s model.</p><p>In our testing, Alienware’s gaming laptop lasted an hour and two minutes on the PCMark 10 gaming benchmark and three and a half hours while surfing the internet. That’s about an hour less on both tests than before, which is a bummer.</p><div ><table><caption>Battery life results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Web surfing battery life (hh:mm)</strong></p></td><td  ><p><strong>Gaming battery life (hh:mm)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Alienware 16 Area-51 (2026)</strong></p></td><td  ><p>3:33</p></td><td  ><p>1:02</p></td></tr></tbody></table></div><p>You’re likely going to keep the laptop plugged in for better performance, so battery life won’t be an issue in that instance. However, if you plan to use this laptop on the go, don’t expect it to last as long as you’d need it to.</p><h2 id="cumbersome-to-carry">Cumbersome to carry</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DLd5iL2ekXiB5a47BdgV3n" name="Alienware 16 Area-51 (2026)--11" alt="Alienware 16 Area-51 (2026)" src="https://cdn.mos.cms.futurecdn.net/DLd5iL2ekXiB5a47BdgV3n-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There’s no denying that the Alienware 16 Area-51 is an attractive laptop thanks to its unique design. Unfortunately, the main downside is that at 14.37 x 11.41 x 1.12 inches and 7.92 pounds, it’s not exactly portable. Yes, you can take it with you, and it will fit in a standard backpack, but you’ll feel it.</p><div><blockquote><p>Yes, you can take this gaming beast with you, and it will fit in a standard backpack, but you’ll feel it.</p></blockquote></div><p>I typically take the laptops I’m reviewing home, but because of this notebook’s weight, I kept it at the office throughout the entire testing process. I also kept it in one of our lab rooms because even carrying it around the office isn’t pleasant.</p><p>Granted, the laptop’s weight won’t be an issue if you’re not going to travel with it and mainly plan to have it as your primary at-home computer. But if you want to take it on the road, then I suggest you build some muscle first.</p><h3 class="article-body__section" id="section-alienware-16-area-51-2026-review-verdict"><span>Alienware 16 Area-51 (2026) review: Verdict</span></h3><p>While the Alienware 16 Area-51 is mostly a refresh of the previous model, the inclusion of an OLED panel is a significant addition that makes an already fantastic gaming laptop even better. Thanks to that, it’s hard not to recommend this laptop to anyone willing to spend top dollar for a high-end gaming experience.</p><p>Alternatives like the Razer Blade 16 and Asus ROG Zephyrus G16 are solid choices if the Alienware’s design is too outlandish, though you’ll still pay a similar price for both. So given that, why not go for a gaming laptop with a truly unique design?</p><p>As with its predecessor, the Alienware 16 Area-51 comes with my highest recommendation. Forgive the cliché, but it truly is out of this world.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/gaming-laptops/alienware-16-area-51-gaming-laptop-2026-review</link>
                                                                            <description>
                            <![CDATA[ The Alienware 16 Area-51 is the complete package, with its OLED panel, powerful performance, and unique design. Though pricey, you'll get a great experience. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">coDnpRTm22TqgikkwqfWzW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/3zy3yUieCcRJmpT8oJ6ucd-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 05 Sep 2026 12:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/3zy3yUieCcRJmpT8oJ6ucd-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Alienware 16 Area-51 (2026)]]></media:description>                                                            <media:text><![CDATA[Alienware 16 Area-51 (2026)]]></media:text>
                                <media:title type="plain"><![CDATA[Alienware 16 Area-51 (2026)]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/3zy3yUieCcRJmpT8oJ6ucd-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The new Alienware 16 Area-51 gaming laptop is largely a refresh of last year’s model, but it includes the one feature I wanted: a glare-free OLED panel. Toss in the latest Intel and Nvidia components, along with the otherworldly design, and you have one of the best gaming laptops on the market.</p><p>As with 2025’s Alienware 16 Area-51, this gaming laptop has serious flair, thanks to the Liquid Teal finish on the anodized aluminum chassis, which gives it a dark, iridescent sheen that shifts colors under different lighting conditions. The Gorilla Glass window on the bottom lets you see the internal components, while the RGB lighting enhances the laptop’s otherworldly appearance.</p><p>You can configure the Alienware 16 Area-51 (from $2,529, $3829 as tested) with up to an Intel Core Ultra 9 290HX Plus Arrow Lake Refresh CPU, an Nvidia RTX 5090 GPU, 64GB of RAM, and 12TB of SSD storage. My review unit, with its RTX 5080, Core Ultra 9 290HX Plus, and 32GB of RAM, had no issue handling even the most demanding PC games.</p><p>The star of the show is the new OLED panel, which provides rich contrast between dark and light elements. The anti-glare does rob the display of some of its luster, but the bright HDR and vibrant colors make up for that. You won’t complain much given how beautiful games look on this 16-inch 240Hz display.</p><p>While this laptop is still too bulky for my liking and has worse battery life than the previous model, this is undeniably a powerful gaming laptop with a fetching design like no other. If you have the cash for this beast, you won’t be disappointed. Find out more in my full review of the Alienware 16 Area-51 (2026).</p><h3 class="article-body__section" id="section-alienware-16-area-51-2026-review-cheat-sheet"><span>Alienware 16 Area-51 (2026) review: Cheat sheet</span></h3><ul><li><strong>What was it?</strong> The Alienware 16 Area-51 is a high-end gaming laptop.</li><li><strong>Who is it for?</strong> The Alienware 16 Area-51 is for hardcore gamers who want a machine that can easily play graphically demanding modern games and look good doing it.</li><li><strong>What does it cost?</strong> The Alienware 16 Area-51 starts at $2,529 on <a href="https://www.dell.com/en-us/shop/cty/pdp/spd/alienware-area-51-aa16250-gaming-laptop?cjdata=MXxOfDB8WXww" target="_blank" rel="nofollow">Dell’s website</a> at the time of writing. This configuration has an Intel Core Ultra 7 270HX Plus CPU, an Nvidia RTX 5060 GPU, 16GB of RAM, and 1TB of SSD storage.</li><li><strong>What do we like?</strong> We like the futuristic design, killer performance, and stunning OLED panel.</li><li><strong>What don’t we like?</strong> We don’t like the laptop’s bulkiness and poor(er) battery life.</li></ul><h3 class="article-body__section" id="section-alienware-16-area-51-2026-review-specs"><span>Alienware 16 Area-51 (2026) review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Alienware 16 Area-51 (starting)</strong></p></td><td  ><p><strong>Alienware 16 Area-51 (tested)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$2,529</p></td><td  ><p>$3,829</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>16-inch (2560x1600) OLED </p></td><td  ><p>16-inch (2560x1600) OLED </p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Intel Core Ultra 7 processor 270HX Plus </p></td><td  ><p>Intel Core Ultra 9 processor 290HX Plus </p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Nvidia GeForce RTX 5060 </p></td><td  ><p>Nvidia GeForce RTX 5080 </p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>16GB DDR5</p></td><td  ><p>32GB DDR5</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>1TB</p></td><td  ><p>1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1x headphone jack, 3x USB-A, 2x USB-C/Thunderbolt 4, 1x HDMI</p></td><td  ><p>1x headphone jack, 3x USB-A, 2x USB-C/Thunderbolt 5, 1x HDMI</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>14.37 x 11.41 x 1.12 inches</p></td><td  ><p>14.37 x 11.41 x 1.12 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>7.49 pounds</p></td><td  ><p>7.49 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-alienware-16-area-51-2026-review-the-ups"><span>Alienware 16 Area-51 (2026) review: The ups</span></h3><p>The Alienware 16 Area-51 finally features an OLED panel while retaining the best aspects of its predecessor, including the eye-catching design, monstrous performance, and mesmerizing RGB lighting.</p><h2 id="futuristic-design">Futuristic design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="EadBWdkp5t5aKGaaUYThW5" name="Alienware 16 Area-51 (2026)--7" alt="Alienware 16 Area-51 (2026)" src="https://cdn.mos.cms.futurecdn.net/EadBWdkp5t5aKGaaUYThW5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Alienware didn’t change the design here, which is good, since this is still one of the most distinctive gaming laptops on the market. The rounded corners, Liquid Teal finish and RGB lighting on the keyboard deck make you feel like you’re using a laptop from the future. The smooth, sturdy aluminum chassis also feels good to touch and hold.</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="UX8mU8tr5WRBWvBzDrgUb8" name="Alienware 16 Area-51 (2026)--12" alt="Alienware 16 Area-51 (2026)" src="https://cdn.mos.cms.futurecdn.net/UX8mU8tr5WRBWvBzDrgUb8-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The model I reviewed came with a Cherry MX ultra-low-profile mechanical keyboard. Thanks to that, I had a great experience typing, as the keys are clicky and have a short travel distance. The touchpad is still relatively small, but it didn’t ruin my flow. I also like that the spacious keyboard deck gave my hands plenty of room to move.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nfprHQmd7epvgPj2Au4FnE" name="Alienware 16 Area-51 (2026)--10" alt="Alienware 16 Area-51 (2026)" src="https://cdn.mos.cms.futurecdn.net/nfprHQmd7epvgPj2Au4FnE-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You’ll find the lion’s share of the laptop’s ports on the back, with the 3.5mm headphone jack and an SD card slot located on the left-hand side. There’s a good selection of ports, including three USB-A, two USB-C, and an HDMI port. It’s not always easy to connect and reconnect peripherals when the laptop’s lid is open, but if you always keep everything connected, then it shouldn’t be an issue.</p><h2 id="powerful-gaming-performance">Powerful gaming performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Lwgx9Aj5d6DsFJo3UopZAG" name="Alienware 16 Area-51 (2026)--6" alt="Alienware 16 Area-51 (2026)" src="https://cdn.mos.cms.futurecdn.net/Lwgx9Aj5d6DsFJo3UopZAG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Alienware 16 Area-51 I reviewed is purpose-built for high-end gaming performance, thanks to powerful components such as its Intel Core Ultra 9 290HX CPU, Nvidia GeForce RTX 5080 laptop GPU, and 32GB of RAM. If you want to play games at native resolution with high graphics settings, you won’t be disappointed.</p><p>At native resolution and default graphics settings, with frame generation disabled and the laptop’s performance mode enabled, I got Cyberpunk 2077 to generally run at around 110 frames per second. This includes both walking and driving. Frame rates dipped into the low 90s in some of the denser downtown areas, but it’s hard to complain about a game running at 90 fps.</p><div ><table><caption>Gaming performance (@ 1600p)</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Alienware 16 Area-51 (2026)</strong></p></td><td  ><p><strong>Razer Blade 16 (2026)</strong></p></td><td  ><p><strong>Asus Zephyrus G16 2026</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Assassin’s Creed Shadows</strong></p></td><td  ><p>65 fps</p></td><td  ><p>45 fps</p></td><td  ><p>34 fps</p></td></tr><tr><td class="firstcol " ><p><strong>Doom: The Dark Ages</strong></p></td><td  ><p>70 fps</p></td><td  ><p>66 fps</p></td><td  ><p>53 fps</p></td></tr><tr><td class="firstcol " ><p><strong>Cyberpunk 2077</strong></p></td><td  ><p>38 fps</p></td><td  ><p>41 fps</p></td><td  ><p>29 fps</p></td></tr></tbody></table></div><p>Using a game’s built-in benchmarking tool, we saw impressive results when we tested the laptop in our lab. At native resolution and maximum graphical settings, with the laptop’s performance mode disabled, Cyberpunk 2077 ran at 38 fps—certainly lower than when I ran it with performance mode on and at default graphics settings. Other titles, such as Assassin’s Creed Shadows and Doom: The Dark Ages, ran much better under these same conditions.</p><p>The Alienware 16 Area-51 also fared well against competing laptops with better specs. This includes the Razer Blade 16, which has a more powerful RTX 5090 GPU, and the Asus Zephyrus G16, which has the same CPU and GPU but double the RAM.</p><p>Even with frame-boosting DLSS disabled, you can still enjoy extremely high frame rates with performance mode enabled and medium-to-high graphics settings. You’ll get fantastic performance out of the box thanks to the Alienware 16’s powerful components.</p><h2 id="vivid-oled-display">Vivid OLED display</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xUiJ6UPQoZVzD7a8QyTWWP" name="Alienware 16 Area-51 (2026)--3" alt="Alienware 16 Area-51 (2026)" src="https://cdn.mos.cms.futurecdn.net/xUiJ6UPQoZVzD7a8QyTWWP-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is the big update for the Alienware 16 Area-51, and it’s a welcome one, as the lack of an OLED panel on last year’s model was one of its few setbacks. Now, games look as glorious as they perform, making the overall experience even better.</p><div><blockquote><p>A game like Cyberpunk 2077 literally shines on this 16-inch OLED panel. The contrast between dark and light elements helps the colorful neon signs and holograms really pop during the in-game night cycle.</p></blockquote></div><p>A game like Cyberpunk 2077 literally shines on this 16-inch OLED panel. The contrast between dark and light elements helps the colorful neon signs and holograms really pop out during the in-game night cycle. The scorching sun during the day is also impressive, with dark shadows contrasting nicely against the daylight.</p><p>The model I reviewed has an anti-glare screen that effectively reduces glare from light sources. While that’s a plus, it can also make the overall image look less vibrant than on a glossy screen. This is a minor setback, and one I can overlook since I’d rather have an anti-glare screen than not.</p><div ><table><caption>Display benchmark results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Alienware 16 Area-51 (2026)</strong></p></td><td  ><p><strong>Razer Blade 16 (2026)</strong></p></td><td  ><p><strong>Asus Zephyrus G16 2026 </strong></p></td></tr><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>368 (SDR) | 556 (HDR)</p></td><td  ><p>408 (SDR) | 586 (HDR)</p></td><td  ><p>469 (SDR) | 672 (HDR)</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>132.2%</p></td><td  ><p>127% </p></td><td  ><p>113.5%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>93.7%</p></td><td  ><p>90% </p></td><td  ><p>80.4%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.20</p></td><td  ><p>0.23 </p></td><td  ><p>0.22</p></td></tr></tbody></table></div><p>How did the Alienware 16’s display perform in our lab tests? As you can see above, it has strong color reproduction (sRGB and DCI-P3) and solid color accuracy (Delta-E). Hues are somewhat oversaturated, which benefits games like Cyberpunk 2077. SDR and HDR brightness are also good for an OLED panel.</p><p>Games run buttery smooth thanks to the fast 240Hz refresh rate. I didn’t encounter any stuttering or flickering during testing. The response time is now 0.2ms, which is much lower than last year’s model’s 3ms. Granted, you likely won’t notice a major difference unless you’re a competitive gamer, but the lower response time will benefit you regardless.</p><h2 id="fun-rgb-lighting">Fun RGB lighting</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LNCFZgL8DAbHiZjHNSf76W" name="Alienware 16 Area-51 (2026)--9" alt="Alienware 16 Area-51 (2026)" src="https://cdn.mos.cms.futurecdn.net/LNCFZgL8DAbHiZjHNSf76W-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Like last year’s model, this Alienware 16 laptop has some seriously impressive RGB lighting. And I don’t say that lightly since I’m not typically an RGB fan. But the way it’s implemented here complements this laptop’s unique design.</p><p>The Gorilla Glass bottom allows the RGB lighting to cast an underglow. And this same lighting also spills out through the top of the keyboard deck. As before, I haven’t seen other gaming laptops match this effect.</p><p>Naturally, you can customize the lighting effects however you prefer via the Alienware Commander Center app. The app is easy to use if you just want to use presets, but it’s also very granular for more in-depth fine-tuning.</p><h3 class="article-body__section" id="section-alienware-16-area-51-2026-review-the-downs"><span>Alienware 16 Area-51 (2026) review: The downs</span></h3><p>Though the Alienware 16 Area-51 has a lot going for it, it has some noticeable drawbacks.</p><h2 id="poor-battery-life">Poor battery life</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hnd8NdePEsHDAQbrMeq9Dg" name="Alienware 16 Area-51 (2026)--13" alt="Alienware 16 Area-51 (2026)" src="https://cdn.mos.cms.futurecdn.net/hnd8NdePEsHDAQbrMeq9Dg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I never expect gaming laptops to have stellar battery life, as they’re usually lacking in that area. The Alienware 16 Area-51 is no different, except that it actually runs out of juice faster than last year’s model.</p><p>In our testing, Alienware’s gaming laptop lasted an hour and two minutes on the PCMark 10 gaming benchmark and three and a half hours while surfing the internet. That’s about an hour less on both tests than before, which is a bummer.</p><div ><table><caption>Battery life results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Web surfing battery life (hh:mm)</strong></p></td><td  ><p><strong>Gaming battery life (hh:mm)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Alienware 16 Area-51 (2026)</strong></p></td><td  ><p>3:33</p></td><td  ><p>1:02</p></td></tr></tbody></table></div><p>You’re likely going to keep the laptop plugged in for better performance, so battery life won’t be an issue in that instance. However, if you plan to use this laptop on the go, don’t expect it to last as long as you’d need it to.</p><h2 id="cumbersome-to-carry">Cumbersome to carry</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DLd5iL2ekXiB5a47BdgV3n" name="Alienware 16 Area-51 (2026)--11" alt="Alienware 16 Area-51 (2026)" src="https://cdn.mos.cms.futurecdn.net/DLd5iL2ekXiB5a47BdgV3n-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There’s no denying that the Alienware 16 Area-51 is an attractive laptop thanks to its unique design. Unfortunately, the main downside is that at 14.37 x 11.41 x 1.12 inches and 7.92 pounds, it’s not exactly portable. Yes, you can take it with you, and it will fit in a standard backpack, but you’ll feel it.</p><div><blockquote><p>Yes, you can take this gaming beast with you, and it will fit in a standard backpack, but you’ll feel it.</p></blockquote></div><p>I typically take the laptops I’m reviewing home, but because of this notebook’s weight, I kept it at the office throughout the entire testing process. I also kept it in one of our lab rooms because even carrying it around the office isn’t pleasant.</p><p>Granted, the laptop’s weight won’t be an issue if you’re not going to travel with it and mainly plan to have it as your primary at-home computer. But if you want to take it on the road, then I suggest you build some muscle first.</p><h3 class="article-body__section" id="section-alienware-16-area-51-2026-review-verdict"><span>Alienware 16 Area-51 (2026) review: Verdict</span></h3><p>While the Alienware 16 Area-51 is mostly a refresh of the previous model, the inclusion of an OLED panel is a significant addition that makes an already fantastic gaming laptop even better. Thanks to that, it’s hard not to recommend this laptop to anyone willing to spend top dollar for a high-end gaming experience.</p><p>Alternatives like the Razer Blade 16 and Asus ROG Zephyrus G16 are solid choices if the Alienware’s design is too outlandish, though you’ll still pay a similar price for both. So given that, why not go for a gaming laptop with a truly unique design?</p><p>As with its predecessor, the Alienware 16 Area-51 comes with my highest recommendation. Forgive the cliché, but it truly is out of this world.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Best laptops of IFA 2026: Wild colors, ultrathin designs and rollable displays ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Alongside massive TVs, home robots, and all sorts of futuristic tech, PC makers came out in a big way for IFA 2026 — and for good reason. With Nvidia’s new RTX Spark chips on the horizon and local AI ramping up fast, we saw tons of fresh silicon and hardware in Berlin this year.</p><p>What we didn’t expect was for them to be so colorful, thin, and experimental. From budget-friendly laptops in every shade imaginable to designs so impossibly slim they’d make Steve Jobs jealous, and even the return of the netbook in a totally new form factor, this year’s show was an absolute blast for computing.</p><p>Here are our 7 favorite laptops from IFA 2026, including models landing before the holidays and wild concepts that show us where PCs are heading next.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="g1WBrp" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-best-laptops-of-ifa-2026-the-ones-you-can-buy-soon"><span>Best laptops of IFA 2026: The ones you can buy soon</span></h3><h2 id="lenovo-yoga-flip-9n-2-in-1">Lenovo Yoga Flip 9n 2-in-1 </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eCQEBtDWpHyg6giVsMi5wg" name="lenovo-yoga-9n" alt="The Lenovo Yoga Flip 9n 2-in-1 with an IFA 2026 badge" src="https://cdn.mos.cms.futurecdn.net/eCQEBtDWpHyg6giVsMi5wg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you’re an artist who needs a powerful machine to work on, the <a href="https://www.tomsguide.com/computing/laptops/lenovo-yoga-9n-2-in-1-hands-on">Lenovo Yoga Flip 9n 2-in-1</a> is the convertible laptop to watch. Packing an Nvidia RTX Spark chip for handling AI workloads on-device, and the ability to draw on its OLED screen or haptic touchpad, this is one seriously versatile notebook for busy doodlers on the go. And for work, it even packs a full keyboard and plenty of ports. </p><p>We don’t yet have a price or release date, but the Yoga Flip 9n 2-in-1 could be the perfect fit for creatives.</p><p><em>Tony Polanco</em></p><h2 id="dell-14s">Dell 14S</h2><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="V6wKsNogfauk7H6285cD6m" name="dell-14-s" alt="The Dell 14S with an IFA 2026 badge" src="https://cdn.mos.cms.futurecdn.net/V6wKsNogfauk7H6285cD6m-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Dell’s adding another MacBook Neo competitor to its lineage after the stellar XPS 13, and this one's aimed more at the college student/those just entering the world of work. The <a href="https://www.tomsguide.com/computing/laptops/dell-14s-hands-on-ifa-2026">Dell 14S</a> has gone through a huge upgrade since the last time I heard that name last year!</p><p>Instead of a cheap plastic build, we’re now to an all-aluminum build in a selection of fresh colors. The keyboard feels great on it, you’ve got display options starting from a 2K resolution all the way to 2.8K OLED, and the pricing will be “complementary” to the <a href="https://www.tomsguide.com/computing/laptops/dell-xps-13-2026-review">XPS 13</a> — Dell’s words not mine. </p><p>Take from that what you will…but also…$699 is my prediction.</p><p><em>Jason England</em></p><h2 id="lenovo-ideapad-vibe">Lenovo IdeaPad Vibe </h2><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="LAkKiFhVnBeyTpDYM8tW2A" name="lenovo-ideapad-vibe" alt="The Lenovo IdeaPad Vibe with an IFA 2026 badge" src="https://cdn.mos.cms.futurecdn.net/LAkKiFhVnBeyTpDYM8tW2A-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/laptops/lenovo-ideapad-vibe-hands-on">Lenovo IdeaPad Vibe</a> aims to be the next MacBook Neo killer, and it certainly has a decent shot at dethroning Apple’s affordable laptop. Lenovo’s machine features a sturdy metal chassis available in seven unique colors to match your personality. It also packs a wide range of ports — more than the MacBook Neo and Dell XPS 13 — and even swappable keycaps. </p><p>Configurable with AMD, Snapdragon, and eventually Intel CPUs, the IdeaPad Vibe, with its expected $699 asking price, is hard to ignore.</p><p><em>Tony Polanco</em></p><h2 id="acer-swift-blade-14">Acer Swift Blade 14 </h2><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="7yB2hM7M2uEfe3XcNPLfoD" name="acer-swift-blade-14" alt="The Acer Swift Blade 14 with an IFA 2026 badge" src="https://cdn.mos.cms.futurecdn.net/7yB2hM7M2uEfe3XcNPLfoD-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Yes, I know there’s the Acer Vero 16, and it’s modularity/repairability chops. All great and nice. But I’m here for the laptops that blew my tiny mind, and the <a href="https://www.tomsguide.com/computing/laptops/acer-swift-blade-14-ifa-2026-hands-on">799g Swift Blade</a> did indeed blow my mind, because it’s <em>insanely </em>lightweight.</p><p>You get a full-blown OLED display, decent build quality Intel Core Series 3 chipsets and the RAM and storage you need in something that’s lighter than two cans of soup. It’s really quite the shocking piece of kit to hold in your hands.</p><p><em>Jason England</em></p><h3 class="article-body__section" id="section-best-laptops-of-ifa-2026-the-prototypes"><span>Best laptops of IFA 2026: The prototypes</span></h3><h2 id="lenovo-project-aeroblade">Lenovo Project Aeroblade </h2><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="XBhc2A6T8sgRTvuPLsqNVJ" name="Lenovo Project AeroBlade-5" alt="The Lenovo Project Aeroblade with an IFA 2026 badge" src="https://cdn.mos.cms.futurecdn.net/XBhc2A6T8sgRTvuPLsqNVJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Lenovo’s <a href="https://www.tomsguide.com/computing/laptops/i-held-lenovos-project-aeroblade-laptop-and-its-giving-me-serious-yet-more-powerful-macbook-air-vibes">Project AeroBlade</a> gives off serious MacBook Air vibes thanks to its ultraportable design. At under 10mm thick and just 1.83 pounds, it feels like a screen with a keyboard attached. It achieves this with a fanless design. Instead, four tiny Frore AirJet modules use silent ultrasonic vibrations to cool an Intel Lunar Lake chip without sacrificing sustained performance. You still get OLED, Thunderbolt 4, Wi-Fi 7, and Lenovo’s excellent keyboard in a magnesium-aluminum shell. </p><p>It’s only a concept for now, but if this ships, it could be a game-changer for thin-and-light laptops.</p><p><em>Tony Polanco</em></p><p><strong>Lenovo Project Swan</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ixxi7hAhhgbStTXePkD3GN" name="Lenovo Project Swan" alt="The Lenovo Project Swan with an IFA 2026 badge" src="https://cdn.mos.cms.futurecdn.net/ixxi7hAhhgbStTXePkD3GN-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Lenovo didn’t want its Legion Pro Rollable gaming laptop to have all the fun when it comes to horizontally expanding screens, so this year at IFA, it unveiled a more business-friendly solution using upgraded tech. </p><p>Project Swan starts out as a small and compact 14-inch productivity laptop but with the push of a button, its screen extends out on either side to become a 17-inch display. That way, instead of bringing a portable monitor with you on your next business trip, you can just pack one device.</p><p>Just like Lenovo’s incredibly light laptop, Project Swan is only a concept for now but as we saw a few years ago with the T<a href="https://www.tomsguide.com/news/i-just-tried-the-transformer-of-laptops-at-ces-2024-and-it-feels-like-the-future">hinkBook Plus Gen 6 Rollable</a>, this design could find its way into a product you can actually buy sooner than you’d think.</p><p><em>Anthony Spadafora</em></p><h2 id="acer-project-dualplay-mini">Acer Project DualPlay Mini </h2><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="ksLNnZiDr2KbgJNSVAxnPS" name="acer-project-dual-play-mini" alt="The Acer Project DualPlay Mini with an IFA 2026 badge" src="https://cdn.mos.cms.futurecdn.net/ksLNnZiDr2KbgJNSVAxnPS-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Now I know the initial thoughts here. “This is a gaming handheld, wtf are you thinking!?” Well, actually, this is a netbook…you can’t see it yet but when you open the handheld like a clamshell and flip the display, you’ve got that QWERTY keyboard inside.</p><p>As someone who has missed using something like my Asus Eee PC in the mid 2000s, this was a serious trip back in time to a better time. And when you think about the versatility of it, not only does this mean “work by day, play by night,” but it also means wider gameplay accessibility. Have you ever played an RTS with a controller? …that’s what I thought!</p><p><em>Jason England</em></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/wellness/smart-rings/i-just-went-hands-on-with-the-new-circular-ring-3-and-it-beats-the-oura-ring-5-in-3-big-ways"><strong>I just went hands-on with the new Circular Ring 3 — and it beats the Oura Ring 5 in 3 big ways</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/gaming/pc-gaming/i-tested-the-real-dlss-5-forget-the-leaked-mods-its-not-an-ai-filter-this-is-nvidias-photorealistic-game-changer"><strong>I wanted to hate Nvidia’s DLSS 5 ‘AI filter’ — but the real DLSS 5 is photorealistic black magic</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/home/coffee-makers/i-just-tried-the-worlds-first-ai-espresso-machine-im-a-coffee-snob-and-it-was-surprisingly-good"><strong>I just tried the world’s first AI espresso machine — I'm a coffee snob, and it was surprisingly... good?</strong></a><strong></strong></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/best-laptops-of-ifa-2026-wild-colors-ultrathin-designs-and-rollable-displays</link>
                                                                            <description>
                            <![CDATA[ PC makers at IFA 2026 traded safe, gray aluminum for bright designs and wild form factors, proving personal computing is fun again. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Z5m6UG7swpPTJW8JitpBeT</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/XhjobrMpzB5F7Hftmk8zhb-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 05 Sep 2026 11:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Tech Events]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></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-320-70.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;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;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[ Jason England ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Tony Polanco ]]></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/XhjobrMpzB5F7Hftmk8zhb-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A collage showing laptops from IFA 2026]]></media:description>                                                            <media:text><![CDATA[A collage showing laptops from IFA 2026]]></media:text>
                                <media:title type="plain"><![CDATA[A collage showing laptops from IFA 2026]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/XhjobrMpzB5F7Hftmk8zhb-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Alongside massive TVs, home robots, and all sorts of futuristic tech, PC makers came out in a big way for IFA 2026 — and for good reason. With Nvidia’s new RTX Spark chips on the horizon and local AI ramping up fast, we saw tons of fresh silicon and hardware in Berlin this year.</p><p>What we didn’t expect was for them to be so colorful, thin, and experimental. From budget-friendly laptops in every shade imaginable to designs so impossibly slim they’d make Steve Jobs jealous, and even the return of the netbook in a totally new form factor, this year’s show was an absolute blast for computing.</p><p>Here are our 7 favorite laptops from IFA 2026, including models landing before the holidays and wild concepts that show us where PCs are heading next.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="g1WBrp" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-best-laptops-of-ifa-2026-the-ones-you-can-buy-soon"><span>Best laptops of IFA 2026: The ones you can buy soon</span></h3><h2 id="lenovo-yoga-flip-9n-2-in-1">Lenovo Yoga Flip 9n 2-in-1 </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eCQEBtDWpHyg6giVsMi5wg" name="lenovo-yoga-9n" alt="The Lenovo Yoga Flip 9n 2-in-1 with an IFA 2026 badge" src="https://cdn.mos.cms.futurecdn.net/eCQEBtDWpHyg6giVsMi5wg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you’re an artist who needs a powerful machine to work on, the <a href="https://www.tomsguide.com/computing/laptops/lenovo-yoga-9n-2-in-1-hands-on">Lenovo Yoga Flip 9n 2-in-1</a> is the convertible laptop to watch. Packing an Nvidia RTX Spark chip for handling AI workloads on-device, and the ability to draw on its OLED screen or haptic touchpad, this is one seriously versatile notebook for busy doodlers on the go. And for work, it even packs a full keyboard and plenty of ports. </p><p>We don’t yet have a price or release date, but the Yoga Flip 9n 2-in-1 could be the perfect fit for creatives.</p><p><em>Tony Polanco</em></p><h2 id="dell-14s">Dell 14S</h2><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="V6wKsNogfauk7H6285cD6m" name="dell-14-s" alt="The Dell 14S with an IFA 2026 badge" src="https://cdn.mos.cms.futurecdn.net/V6wKsNogfauk7H6285cD6m-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Dell’s adding another MacBook Neo competitor to its lineage after the stellar XPS 13, and this one's aimed more at the college student/those just entering the world of work. The <a href="https://www.tomsguide.com/computing/laptops/dell-14s-hands-on-ifa-2026">Dell 14S</a> has gone through a huge upgrade since the last time I heard that name last year!</p><p>Instead of a cheap plastic build, we’re now to an all-aluminum build in a selection of fresh colors. The keyboard feels great on it, you’ve got display options starting from a 2K resolution all the way to 2.8K OLED, and the pricing will be “complementary” to the <a href="https://www.tomsguide.com/computing/laptops/dell-xps-13-2026-review">XPS 13</a> — Dell’s words not mine. </p><p>Take from that what you will…but also…$699 is my prediction.</p><p><em>Jason England</em></p><h2 id="lenovo-ideapad-vibe">Lenovo IdeaPad Vibe </h2><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="LAkKiFhVnBeyTpDYM8tW2A" name="lenovo-ideapad-vibe" alt="The Lenovo IdeaPad Vibe with an IFA 2026 badge" src="https://cdn.mos.cms.futurecdn.net/LAkKiFhVnBeyTpDYM8tW2A-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.tomsguide.com/computing/laptops/lenovo-ideapad-vibe-hands-on">Lenovo IdeaPad Vibe</a> aims to be the next MacBook Neo killer, and it certainly has a decent shot at dethroning Apple’s affordable laptop. Lenovo’s machine features a sturdy metal chassis available in seven unique colors to match your personality. It also packs a wide range of ports — more than the MacBook Neo and Dell XPS 13 — and even swappable keycaps. </p><p>Configurable with AMD, Snapdragon, and eventually Intel CPUs, the IdeaPad Vibe, with its expected $699 asking price, is hard to ignore.</p><p><em>Tony Polanco</em></p><h2 id="acer-swift-blade-14">Acer Swift Blade 14 </h2><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="7yB2hM7M2uEfe3XcNPLfoD" name="acer-swift-blade-14" alt="The Acer Swift Blade 14 with an IFA 2026 badge" src="https://cdn.mos.cms.futurecdn.net/7yB2hM7M2uEfe3XcNPLfoD-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Yes, I know there’s the Acer Vero 16, and it’s modularity/repairability chops. All great and nice. But I’m here for the laptops that blew my tiny mind, and the <a href="https://www.tomsguide.com/computing/laptops/acer-swift-blade-14-ifa-2026-hands-on">799g Swift Blade</a> did indeed blow my mind, because it’s <em>insanely </em>lightweight.</p><p>You get a full-blown OLED display, decent build quality Intel Core Series 3 chipsets and the RAM and storage you need in something that’s lighter than two cans of soup. It’s really quite the shocking piece of kit to hold in your hands.</p><p><em>Jason England</em></p><h3 class="article-body__section" id="section-best-laptops-of-ifa-2026-the-prototypes"><span>Best laptops of IFA 2026: The prototypes</span></h3><h2 id="lenovo-project-aeroblade">Lenovo Project Aeroblade </h2><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="XBhc2A6T8sgRTvuPLsqNVJ" name="Lenovo Project AeroBlade-5" alt="The Lenovo Project Aeroblade with an IFA 2026 badge" src="https://cdn.mos.cms.futurecdn.net/XBhc2A6T8sgRTvuPLsqNVJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Lenovo’s <a href="https://www.tomsguide.com/computing/laptops/i-held-lenovos-project-aeroblade-laptop-and-its-giving-me-serious-yet-more-powerful-macbook-air-vibes">Project AeroBlade</a> gives off serious MacBook Air vibes thanks to its ultraportable design. At under 10mm thick and just 1.83 pounds, it feels like a screen with a keyboard attached. It achieves this with a fanless design. Instead, four tiny Frore AirJet modules use silent ultrasonic vibrations to cool an Intel Lunar Lake chip without sacrificing sustained performance. You still get OLED, Thunderbolt 4, Wi-Fi 7, and Lenovo’s excellent keyboard in a magnesium-aluminum shell. </p><p>It’s only a concept for now, but if this ships, it could be a game-changer for thin-and-light laptops.</p><p><em>Tony Polanco</em></p><p><strong>Lenovo Project Swan</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ixxi7hAhhgbStTXePkD3GN" name="Lenovo Project Swan" alt="The Lenovo Project Swan with an IFA 2026 badge" src="https://cdn.mos.cms.futurecdn.net/ixxi7hAhhgbStTXePkD3GN-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Lenovo didn’t want its Legion Pro Rollable gaming laptop to have all the fun when it comes to horizontally expanding screens, so this year at IFA, it unveiled a more business-friendly solution using upgraded tech. </p><p>Project Swan starts out as a small and compact 14-inch productivity laptop but with the push of a button, its screen extends out on either side to become a 17-inch display. That way, instead of bringing a portable monitor with you on your next business trip, you can just pack one device.</p><p>Just like Lenovo’s incredibly light laptop, Project Swan is only a concept for now but as we saw a few years ago with the T<a href="https://www.tomsguide.com/news/i-just-tried-the-transformer-of-laptops-at-ces-2024-and-it-feels-like-the-future">hinkBook Plus Gen 6 Rollable</a>, this design could find its way into a product you can actually buy sooner than you’d think.</p><p><em>Anthony Spadafora</em></p><h2 id="acer-project-dualplay-mini">Acer Project DualPlay Mini </h2><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="ksLNnZiDr2KbgJNSVAxnPS" name="acer-project-dual-play-mini" alt="The Acer Project DualPlay Mini with an IFA 2026 badge" src="https://cdn.mos.cms.futurecdn.net/ksLNnZiDr2KbgJNSVAxnPS-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Now I know the initial thoughts here. “This is a gaming handheld, wtf are you thinking!?” Well, actually, this is a netbook…you can’t see it yet but when you open the handheld like a clamshell and flip the display, you’ve got that QWERTY keyboard inside.</p><p>As someone who has missed using something like my Asus Eee PC in the mid 2000s, this was a serious trip back in time to a better time. And when you think about the versatility of it, not only does this mean “work by day, play by night,” but it also means wider gameplay accessibility. Have you ever played an RTS with a controller? …that’s what I thought!</p><p><em>Jason England</em></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/wellness/smart-rings/i-just-went-hands-on-with-the-new-circular-ring-3-and-it-beats-the-oura-ring-5-in-3-big-ways"><strong>I just went hands-on with the new Circular Ring 3 — and it beats the Oura Ring 5 in 3 big ways</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/gaming/pc-gaming/i-tested-the-real-dlss-5-forget-the-leaked-mods-its-not-an-ai-filter-this-is-nvidias-photorealistic-game-changer"><strong>I wanted to hate Nvidia’s DLSS 5 ‘AI filter’ — but the real DLSS 5 is photorealistic black magic</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/home/coffee-makers/i-just-tried-the-worlds-first-ai-espresso-machine-im-a-coffee-snob-and-it-was-surprisingly-good"><strong>I just tried the world’s first AI espresso machine — I'm a coffee snob, and it was surprisingly... good?</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Huge new Apple report details all 41 products coming under new CEO John Ternus ]]></title>
                                                                                                <dc:content><![CDATA[ <p>John Ternus has finally taken over as CEO of Apple, and his term could kickstart a wave of new and redefined Apple devices. It all starts next week with the <a href="https://www.tomsguide.com/phones/iphones/apple-sept-9-event-all-9-new-products-were-expecting-to-see">"Surprise and Shine" iPhone event</a>.</p><p>However, that's just the beginning, and <a href="https://www.bloomberg.com/news/articles/2026-09-04/what-to-expect-at-sept-9-apple-event-foldable-iphone-iphone-18-pro-watch">Bloomberg's Mark Gurman</a> just released a massive report that highlights 41 devices that could be released in the next three years and beyond. </p><p>That includes new devices like the foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone">iPhone Ultra</a> and Apple's <a href="https://www.tomsguide.com/computing/smart-glasses/apple-glasses-everything-we-know-so-far">first foray into smart glasses</a>. </p><h2 id="later-2026-and-early-2027">Later 2026 and Early 2027</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:59.60%;"><img id="BXFPFEcaHQrVivQScPBNff" name="iPhone Ultra" alt="iPhone Ultra." src="https://cdn.mos.cms.futurecdn.net/BXFPFEcaHQrVivQScPBNff-1920-80.jpg" mos="" align="middle" fullscreen="" width="1510" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Most every device meant to launch in the next six months should arrive during one of two events: the September 9 iPhone soiree and an announcement in October or early November. </p><p>Mostly, the difference here is that new MacBooks are usually announced in mid-fall, usually with a new chipset. </p><p>The key devices to be aware of in the next few months include Apple's first foldable<a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-latest-release-date-rumors-heres-when-we-expect-it-to-launch" target="_blank"> iPhone</a><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-latest-release-date-rumors-heres-when-we-expect-it-to-launch"> Ultra</a> and the <a href="https://www.tomsguide.com/phones/iphones/apple-event-is-official-for-september-9-iphone-ultra-iphone-18-pro-max-watch-12-and-more">iPhone 18 Pro</a> and <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">iPhone 18 Pro Max</a> models, all of which are expected to launch next week. There's also the first iPad mini <a href="https://www.tomsguide.com/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried">with an OLED </a><a href="https://www.tomsguide.com/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried" target="_blank">screen </a>and the rumored HomePad with a screen, which should be Apple's next steps into smart home devices.</p><p>There's also the rumored <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Ultra</a>, a high-end version of Apple's Pro laptop with a touch display and OLED panel. Personally, I'm interested in the refreshed  <a href="https://www.tomsguide.com/entertainment/streaming-devices/apple-tv-4k-could-get-its-long-awaited-refresh-this-year-what-we-know-so-far">Apple TV 4K </a> with a faster chip and more Siri features. Though that has been rumored for years now and has yet to actually be released.</p><ul><li><strong>iPhone Ultra</strong></li><li><strong>iPhone 18 Pro and Pro Max</strong></li><li><strong>Apple Watch Series 12 and Ultra 4</strong></li><li><strong>AirPods 5</strong></li><li><strong>Apple TV 4K set-top box</strong></li><li><strong>HomePod mini</strong></li><li><strong>HomePad</strong></li><li><strong>iPad mini with OLED screen</strong></li><li><strong>M6 iMac refresh</strong></li><li><strong>M6 14-inch MacBook Pro refresh</strong></li><li><strong>MacBook Ultra</strong></li></ul><h2 id="in-development-for-2027">In development for 2027</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.30%;"><img id="tbGfgnwudZZvAWqyL687hg" name="Tim-Cook-Apple-Glasses-LEDE2" alt="Tim Cook with Apple Glass render" src="https://cdn.mos.cms.futurecdn.net/tbGfgnwudZZvAWqyL687hg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1126" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Martin Hajek/ iDrop News/ Shutterstock/ Tom’s Guide)</span></figcaption></figure><p>Next year is when we could start seeing some truly updated designs for Apple's products from the all-glass iPhone 20 to redesigned Apple Watches and even more smart home products. </p><p>Some devices will be a simple chip refresh, like the M6 MacBook Air or the <a href="https://www.tomsguide.com/computing/macbooks/macbook-neo-could-get-these-two-major-performance-upgrades-in-2027-but-i-want-apple-to-fix-this-instead">A19 Pro MacBook Neo,</a> which proved so popular the first go-round that Apple <a href="https://www.tomsguide.com/computing/macbooks/macbook-neo-inventory-has-reportedly-sold-out-what-you-need-to-know">couldn't keep it in stock</a>.</p><p>A slew of iPads, from a refreshed <a href="https://www.tomsguide.com/computing/ipads/ipad-12-just-got-teased-by-an-accessory-maker-and-theres-a-disappointing-bit-of-news">iPad 12</a> to an <a href="https://www.tomsguide.com/computing/ipads/ipad-air-oled-tipped-for-long-overdue-2027-launch-but-at-what-cost">iPad Air OLED</a> are also expected next year.</p><p>iPhones will get weird next year starting in the spring where Apple <a href="https://www.tomsguide.com/phones/iphones/iphone-18-tipped-for-cost-cutting-downgrades-heres-what-we-know">splits the launch </a>of the iPhone 18 series. We should see the<a href="https://www.tomsguide.com/phones/iphone-18-release-just-tipped-for-major-shakeup-heres-when-all-the-new-models-could-launch"> vanilla iPhone 18</a>, alongside the iPhone 18e and<a href="https://www.tomsguide.com/phones/iphones/iphone-air-2-rumors-5-biggest-expected-upgrades"> iPhone Air 2</a>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1456px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="r2pW7STcGyqWJttRcb5SAH" name="iPhone 20 render" alt="iPhone 20 render" src="https://cdn.mos.cms.futurecdn.net/r2pW7STcGyqWJttRcb5SAH-1920-80.jpg" mos="" align="middle" fullscreen="" width="1456" height="819" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: AppleTrack)</span></figcaption></figure><p>In the back half of the year, the 20th anniversary iPhone could feature one of the largest design changes in years. The biggest is a curvy all-glass wraparound design that seamlessly covers the entire phone. An analyst <a href="https://www.tomsguide.com/phones/iphones/all-glass-iphone-20-reportedly-canceled-20th-anniversary-iphone-hits-major-setback">claimed this design was canceled</a> in August, but Mark Gurman pushed back, saying that it's still on track. There are <a href="https://www.tomsguide.com/phones/iphones/new-iphone-20-video-reveals-the-8-biggest-upgrades-to-expect-from-the-20th-anniversary-iphone">more potential changes, </a>but the glass look will be immediately noticeable.</p><p>We were expecting to see <a href="https://www.tomsguide.com/audio/airpods/airpods-ultra-everything-we-know-so-far-about-apples-camera-earbuds">camera-laden AirPods</a> this year after leaked code and videos appeared, but Gurman claims these have been delayed until 2027. The cameras would enable Siri AI to "see" the world around you and respond to queries. People are voicing privacy concerns already, but presumably the cameras would not record photos or video.</p><p>Finally, <a href="https://www.tomsguide.com/computing/vr-ar/lighter-and-cheaper-apple-vision-pro-2-sounds-like-a-headset-youll-actually-buy-but-heres-why-you-shouldnt">Tim Cook was allegedly obsessed</a> with <a href="https://www.tomsguide.com/computing/smart-glasses/apple-glasses-everything-we-know-so-far">Apple Glasses</a>, but it's not clear if Ternus shares that same excitement. Apple's take on the form should arrive next year and be similar to the Meta Ray-Ban allowing you to take calls, pictures and videos but lacking a display. Rumors had slated the glasses for 2028 but a summer report claimed <a href="https://www.tomsguide.com/computing/smart-glasses/apple-is-rethinking-its-future-product-roadmap-after-losing-smart-glasses-chief-to-openai-analysts-say">Apple was rethinking its roadmap</a> after Vision head Paul Meade left for OpenAI.</p><ul><li><strong>M6 MacBook Air</strong></li><li><strong>A19 Pro MacBook Neo</strong></li><li><strong>Entry-level iPad refresh</strong></li><li><strong>iPad Air OLED</strong></li><li><strong>iPad Pro</strong></li><li><strong>New Apple Pencils</strong>.</li><li><strong>iPhone 18 and 18e</strong></li><li><strong>iPhone Air 2</strong></li><li><strong>M7 14-inch MacBook Pro</strong></li><li><strong>AirPods with cameras</strong></li><li><strong>In-home security sensor and system</strong>.</li><li><strong>Apple Glasses</strong></li><li><strong>iPhone 20 (XX)</strong></li><li><strong>iPhone Ultra 2</strong></li><li><strong>Redesigned Apple Watches</strong></li><li><strong>M7 Pro and M7 Max MacBooks</strong></li></ul><h2 id="2028-2029-and-beyond">2028, 2029 and beyond</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.30%;"><img id="h6GpFcSGTZ9Rtx4HpLMVE7" name="apple-campus.jpeg" alt="Apple Event" src="https://cdn.mos.cms.futurecdn.net/h6GpFcSGTZ9Rtx4HpLMVE7-1920-80.jpeg" mos="" align="middle" fullscreen="" width="2000" height="1126" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>The next batch of potential Apple devices could be released any time between 2028 and 2030. Some are chip and OLED updates, but a couple are new devices that we haven't seen from Apple before.</p><p>The <a href="https://www.tomsguide.com/home/smart-home/apples-next-big-thing-could-be-a-dollar1000-home-robot-ipad-combo">HomePod on a robot arm</a> was rumored two years ago and apparently will actually debut in the next couple of years. Per Gurman, this version will have a 9-inch display and advanced AI features. </p><p>Before the rumor mill settled on the foldable iPhone, Apple's first foldable device was actually supposed to be a  <a href="https://www.tomsguide.com/tablets/ipads/apple-reportedly-has-an-18-8-inch-foldable-ipad-prototype-with-under-display-face-id">giant foldable 18-inch iPad</a> or MacBook. Apparently, this is still in the works and <a href="https://www.tomsguide.com/computing/ipads/apples-giant-foldable-ipad-likely-wont-launch-until-2028-what-weve-heard">could launch in 2028</a>. Gurman claims manufacturing issues pushed a potential launch back.</p><p>Apple allegedly wants to release its own AR glasses à la the <a href="https://www.tomsguide.com/computing/smart-glasses/ive-been-wearing-the-meta-ray-ban-display-smart-glasses-for-24-hours-heres-what-i-like-and-hate">Meta Ray-Ban Display</a>. The glasses would superimpose data on your real-world view. There's no specific release year for these, but they could arrive before 2030.</p><p>Apple is apparently working on an AI pendant as well. <a href="https://www.tomsguide.com/computing/apples-ai-wearable-roadmap-is-getting-wild-prepare-for-ai-pendant-smart-glasses-and-airpods-with-cameras">The Apple version </a>would work with your iPhone and use AI and the camera for tasks.</p><ul><li><strong>HomePad with a robot arm</strong></li><li><strong>M7 Max and M7 Ultra Mac Studio</strong></li><li><strong>Apple Vision Pro revamp</strong></li><li><strong>AI Pendant</strong></li><li><strong>Larger foldable iPhone</strong></li><li><strong>Foldable iPad  </strong></li><li><strong>MacBook Air OLED</strong></li><li><strong>Higher-end iMac OLED</strong></li><li><strong>Augmented reality glasses</strong></li></ul><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/home/smart-home/apple-homepad-rumored-release-date-price-and-all-the-latest-leaks">Apple HomePad rumored release date, price and all the latest leaks</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-price-rumors-heres-how-much-you-can-expect-to-pay-for-apples-first-foldable">iPhone Ultra price rumors — here's how much you can expect to pay for Apple’s first foldable</a></li><li><a href="https://www.tomsguide.com/computing/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions">Nvidia’s RTX Spark N1X launches this October: My price predictions for the potential MacBook Pro killer</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/macbooks/huge-new-apple-report-details-all-41-products-coming-under-new-ceo-john-ternus</link>
                                                                            <description>
                            <![CDATA[ A massive report reveals about 41 devices that Apple could launch in the next three years. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">b6F32CnPvCcV3mLyRLeoJV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/TrT3r6fXvJDENQATkwjnxN-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 04 Sep 2026 19:32:30 +0000</pubDate>                                                                                                                                <updated>Fri, 04 Sep 2026 22:28:53 +0000</updated>
                                                                                                                                            <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Smart Home]]></category>
                                                    <category><![CDATA[Smart Glasses]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                    <category><![CDATA[VR & AR]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;br&gt;Send secure tips on Signal: scyo1.55.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/TrT3r6fXvJDENQATkwjnxN-1920-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[John Ternus in front of the Apple logo]]></media:description>                                                            <media:text><![CDATA[John Ternus in front of the Apple logo]]></media:text>
                                <media:title type="plain"><![CDATA[John Ternus in front of the Apple logo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/TrT3r6fXvJDENQATkwjnxN-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>John Ternus has finally taken over as CEO of Apple, and his term could kickstart a wave of new and redefined Apple devices. It all starts next week with the <a href="https://www.tomsguide.com/phones/iphones/apple-sept-9-event-all-9-new-products-were-expecting-to-see">"Surprise and Shine" iPhone event</a>.</p><p>However, that's just the beginning, and <a href="https://www.bloomberg.com/news/articles/2026-09-04/what-to-expect-at-sept-9-apple-event-foldable-iphone-iphone-18-pro-watch">Bloomberg's Mark Gurman</a> just released a massive report that highlights 41 devices that could be released in the next three years and beyond. </p><p>That includes new devices like the foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone">iPhone Ultra</a> and Apple's <a href="https://www.tomsguide.com/computing/smart-glasses/apple-glasses-everything-we-know-so-far">first foray into smart glasses</a>. </p><h2 id="later-2026-and-early-2027">Later 2026 and Early 2027</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:59.60%;"><img id="BXFPFEcaHQrVivQScPBNff" name="iPhone Ultra" alt="iPhone Ultra." src="https://cdn.mos.cms.futurecdn.net/BXFPFEcaHQrVivQScPBNff-1920-80.jpg" mos="" align="middle" fullscreen="" width="1510" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Most every device meant to launch in the next six months should arrive during one of two events: the September 9 iPhone soiree and an announcement in October or early November. </p><p>Mostly, the difference here is that new MacBooks are usually announced in mid-fall, usually with a new chipset. </p><p>The key devices to be aware of in the next few months include Apple's first foldable<a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-latest-release-date-rumors-heres-when-we-expect-it-to-launch" target="_blank"> iPhone</a><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-latest-release-date-rumors-heres-when-we-expect-it-to-launch"> Ultra</a> and the <a href="https://www.tomsguide.com/phones/iphones/apple-event-is-official-for-september-9-iphone-ultra-iphone-18-pro-max-watch-12-and-more">iPhone 18 Pro</a> and <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-rumors-and-leaks-everything-we-know-so-far">iPhone 18 Pro Max</a> models, all of which are expected to launch next week. There's also the first iPad mini <a href="https://www.tomsguide.com/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried">with an OLED </a><a href="https://www.tomsguide.com/computing/ipads/first-oled-ipad-mini-tipped-for-october-launch-heres-why-im-excited-and-worried" target="_blank">screen </a>and the rumored HomePad with a screen, which should be Apple's next steps into smart home devices.</p><p>There's also the rumored <a href="https://www.tomsguide.com/computing/laptops/macbook-ultra-everything-we-know-so-far">MacBook Ultra</a>, a high-end version of Apple's Pro laptop with a touch display and OLED panel. Personally, I'm interested in the refreshed  <a href="https://www.tomsguide.com/entertainment/streaming-devices/apple-tv-4k-could-get-its-long-awaited-refresh-this-year-what-we-know-so-far">Apple TV 4K </a> with a faster chip and more Siri features. Though that has been rumored for years now and has yet to actually be released.</p><ul><li><strong>iPhone Ultra</strong></li><li><strong>iPhone 18 Pro and Pro Max</strong></li><li><strong>Apple Watch Series 12 and Ultra 4</strong></li><li><strong>AirPods 5</strong></li><li><strong>Apple TV 4K set-top box</strong></li><li><strong>HomePod mini</strong></li><li><strong>HomePad</strong></li><li><strong>iPad mini with OLED screen</strong></li><li><strong>M6 iMac refresh</strong></li><li><strong>M6 14-inch MacBook Pro refresh</strong></li><li><strong>MacBook Ultra</strong></li></ul><h2 id="in-development-for-2027">In development for 2027</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.30%;"><img id="tbGfgnwudZZvAWqyL687hg" name="Tim-Cook-Apple-Glasses-LEDE2" alt="Tim Cook with Apple Glass render" src="https://cdn.mos.cms.futurecdn.net/tbGfgnwudZZvAWqyL687hg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1126" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Martin Hajek/ iDrop News/ Shutterstock/ Tom’s Guide)</span></figcaption></figure><p>Next year is when we could start seeing some truly updated designs for Apple's products from the all-glass iPhone 20 to redesigned Apple Watches and even more smart home products. </p><p>Some devices will be a simple chip refresh, like the M6 MacBook Air or the <a href="https://www.tomsguide.com/computing/macbooks/macbook-neo-could-get-these-two-major-performance-upgrades-in-2027-but-i-want-apple-to-fix-this-instead">A19 Pro MacBook Neo,</a> which proved so popular the first go-round that Apple <a href="https://www.tomsguide.com/computing/macbooks/macbook-neo-inventory-has-reportedly-sold-out-what-you-need-to-know">couldn't keep it in stock</a>.</p><p>A slew of iPads, from a refreshed <a href="https://www.tomsguide.com/computing/ipads/ipad-12-just-got-teased-by-an-accessory-maker-and-theres-a-disappointing-bit-of-news">iPad 12</a> to an <a href="https://www.tomsguide.com/computing/ipads/ipad-air-oled-tipped-for-long-overdue-2027-launch-but-at-what-cost">iPad Air OLED</a> are also expected next year.</p><p>iPhones will get weird next year starting in the spring where Apple <a href="https://www.tomsguide.com/phones/iphones/iphone-18-tipped-for-cost-cutting-downgrades-heres-what-we-know">splits the launch </a>of the iPhone 18 series. We should see the<a href="https://www.tomsguide.com/phones/iphone-18-release-just-tipped-for-major-shakeup-heres-when-all-the-new-models-could-launch"> vanilla iPhone 18</a>, alongside the iPhone 18e and<a href="https://www.tomsguide.com/phones/iphones/iphone-air-2-rumors-5-biggest-expected-upgrades"> iPhone Air 2</a>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1456px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="r2pW7STcGyqWJttRcb5SAH" name="iPhone 20 render" alt="iPhone 20 render" src="https://cdn.mos.cms.futurecdn.net/r2pW7STcGyqWJttRcb5SAH-1920-80.jpg" mos="" align="middle" fullscreen="" width="1456" height="819" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: AppleTrack)</span></figcaption></figure><p>In the back half of the year, the 20th anniversary iPhone could feature one of the largest design changes in years. The biggest is a curvy all-glass wraparound design that seamlessly covers the entire phone. An analyst <a href="https://www.tomsguide.com/phones/iphones/all-glass-iphone-20-reportedly-canceled-20th-anniversary-iphone-hits-major-setback">claimed this design was canceled</a> in August, but Mark Gurman pushed back, saying that it's still on track. There are <a href="https://www.tomsguide.com/phones/iphones/new-iphone-20-video-reveals-the-8-biggest-upgrades-to-expect-from-the-20th-anniversary-iphone">more potential changes, </a>but the glass look will be immediately noticeable.</p><p>We were expecting to see <a href="https://www.tomsguide.com/audio/airpods/airpods-ultra-everything-we-know-so-far-about-apples-camera-earbuds">camera-laden AirPods</a> this year after leaked code and videos appeared, but Gurman claims these have been delayed until 2027. The cameras would enable Siri AI to "see" the world around you and respond to queries. People are voicing privacy concerns already, but presumably the cameras would not record photos or video.</p><p>Finally, <a href="https://www.tomsguide.com/computing/vr-ar/lighter-and-cheaper-apple-vision-pro-2-sounds-like-a-headset-youll-actually-buy-but-heres-why-you-shouldnt">Tim Cook was allegedly obsessed</a> with <a href="https://www.tomsguide.com/computing/smart-glasses/apple-glasses-everything-we-know-so-far">Apple Glasses</a>, but it's not clear if Ternus shares that same excitement. Apple's take on the form should arrive next year and be similar to the Meta Ray-Ban allowing you to take calls, pictures and videos but lacking a display. Rumors had slated the glasses for 2028 but a summer report claimed <a href="https://www.tomsguide.com/computing/smart-glasses/apple-is-rethinking-its-future-product-roadmap-after-losing-smart-glasses-chief-to-openai-analysts-say">Apple was rethinking its roadmap</a> after Vision head Paul Meade left for OpenAI.</p><ul><li><strong>M6 MacBook Air</strong></li><li><strong>A19 Pro MacBook Neo</strong></li><li><strong>Entry-level iPad refresh</strong></li><li><strong>iPad Air OLED</strong></li><li><strong>iPad Pro</strong></li><li><strong>New Apple Pencils</strong>.</li><li><strong>iPhone 18 and 18e</strong></li><li><strong>iPhone Air 2</strong></li><li><strong>M7 14-inch MacBook Pro</strong></li><li><strong>AirPods with cameras</strong></li><li><strong>In-home security sensor and system</strong>.</li><li><strong>Apple Glasses</strong></li><li><strong>iPhone 20 (XX)</strong></li><li><strong>iPhone Ultra 2</strong></li><li><strong>Redesigned Apple Watches</strong></li><li><strong>M7 Pro and M7 Max MacBooks</strong></li></ul><h2 id="2028-2029-and-beyond">2028, 2029 and beyond</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.30%;"><img id="h6GpFcSGTZ9Rtx4HpLMVE7" name="apple-campus.jpeg" alt="Apple Event" src="https://cdn.mos.cms.futurecdn.net/h6GpFcSGTZ9Rtx4HpLMVE7-1920-80.jpeg" mos="" align="middle" fullscreen="" width="2000" height="1126" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>The next batch of potential Apple devices could be released any time between 2028 and 2030. Some are chip and OLED updates, but a couple are new devices that we haven't seen from Apple before.</p><p>The <a href="https://www.tomsguide.com/home/smart-home/apples-next-big-thing-could-be-a-dollar1000-home-robot-ipad-combo">HomePod on a robot arm</a> was rumored two years ago and apparently will actually debut in the next couple of years. Per Gurman, this version will have a 9-inch display and advanced AI features. </p><p>Before the rumor mill settled on the foldable iPhone, Apple's first foldable device was actually supposed to be a  <a href="https://www.tomsguide.com/tablets/ipads/apple-reportedly-has-an-18-8-inch-foldable-ipad-prototype-with-under-display-face-id">giant foldable 18-inch iPad</a> or MacBook. Apparently, this is still in the works and <a href="https://www.tomsguide.com/computing/ipads/apples-giant-foldable-ipad-likely-wont-launch-until-2028-what-weve-heard">could launch in 2028</a>. Gurman claims manufacturing issues pushed a potential launch back.</p><p>Apple allegedly wants to release its own AR glasses à la the <a href="https://www.tomsguide.com/computing/smart-glasses/ive-been-wearing-the-meta-ray-ban-display-smart-glasses-for-24-hours-heres-what-i-like-and-hate">Meta Ray-Ban Display</a>. The glasses would superimpose data on your real-world view. There's no specific release year for these, but they could arrive before 2030.</p><p>Apple is apparently working on an AI pendant as well. <a href="https://www.tomsguide.com/computing/apples-ai-wearable-roadmap-is-getting-wild-prepare-for-ai-pendant-smart-glasses-and-airpods-with-cameras">The Apple version </a>would work with your iPhone and use AI and the camera for tasks.</p><ul><li><strong>HomePad with a robot arm</strong></li><li><strong>M7 Max and M7 Ultra Mac Studio</strong></li><li><strong>Apple Vision Pro revamp</strong></li><li><strong>AI Pendant</strong></li><li><strong>Larger foldable iPhone</strong></li><li><strong>Foldable iPad  </strong></li><li><strong>MacBook Air OLED</strong></li><li><strong>Higher-end iMac OLED</strong></li><li><strong>Augmented reality glasses</strong></li></ul><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/home/smart-home/apple-homepad-rumored-release-date-price-and-all-the-latest-leaks">Apple HomePad rumored release date, price and all the latest leaks</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-price-rumors-heres-how-much-you-can-expect-to-pay-for-apples-first-foldable">iPhone Ultra price rumors — here's how much you can expect to pay for Apple’s first foldable</a></li><li><a href="https://www.tomsguide.com/computing/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions">Nvidia’s RTX Spark N1X launches this October: My price predictions for the potential MacBook Pro killer</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ NordVPN's Next-Gen Antivirus scores 94% in independent phishing and malware testing ]]></title>
                                                                                                <dc:content><![CDATA[ <p><a href="https://www.tomsguide.com/reviews/nordvpn-review">NordVPN</a>'s <a href="https://www.tomsguide.com/computing/vpns/nordvpn-combines-vpn-and-next-generation-antivirus-into-one-app">next-gen antivirus</a> has achieved a 94% phishing detection rate in AV-Comparatives' latest anti-phishing test, ranking third among security products in the independent evaluation. The result our choice as the <a href="https://www.tomsguide.com/best-picks/best-vpn">best VPN</a> behind only Avast One Free Antivirus and Norton Antivirus Plus, both of which scored 96%.</p><p>The <a href="https://www.av-comparatives.org/wp-content/uploads/2026/08/phishing_comp_Q3-2026.pdf" target="_blank" rel="nofollow">test</a>, which ran from August 12–22, 2026, assessed phishing-page detection rates across 250 live phishing URLs, with an additional 250 legitimate URLs used to check for false positives. NordVPN recorded zero false alarms – a result that puts it ahead of Malwarebytes Premium and Webroot SecureAnywhere Internet Security Plus, both of which triggered false positives during the evaluation.</p><p>The findings come as NordVPN continues to reposition itself as an all-in-one digital security app. The company's <a href="https://www.tomsguide.com/computing/vpns/nordvpn-combines-vpn-and-next-generation-antivirus-into-one-app">recent rebrand</a> saw Threat Protection Pro renamed as "next-generation antivirus," placing it alongside its VPN and Dark Web Monitor as one of three core pillars of the product.</p><h2 id="how-does-nordvpn-compare">How does NordVPN compare?</h2><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="UtDZFoTmPNBWUcdJsQqvG" name="NordVPN 2026 phishing test results" alt="Graph displaying the test's results" src="https://cdn.mos.cms.futurecdn.net/UtDZFoTmPNBWUcdJsQqvG-1920-80.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Finishing third among nine security products is a strong result, but the detail behind NordVPN's score is arguably just as telling as the number itself. Avast One Free Antivirus and Norton Antivirus Plus both edged it out with 96% detection rates, but the gap is narrow – a two-percentage-point difference across 250 live phishing URLs amounts to five URLs.</p><p>The rest of the field tells its own story. At the other end of the table, Dr. Web Security Space managed just 57% and K7 Total Security 70% – results that illustrate how inconsistent phishing protection remains across the security products market, even among established names. </p><p>NordVPN's advantage over the field is clearest on false positives. It was one of seven security products to record zero false alarms – and false positives erode confidence in a security tool just as surely as missed threats do.</p><p>"Phishing is a numbers game for attackers, and they're very good at it," said Domininkas Virbickas, product director at NordVPN. "Anybody might slip up eventually, and when you do click on something you shouldn't, that's where we step in."</p><h2 id="a-strong-track-record-in-independent-testing">A strong track record in independent testing</h2><p>This is not the first time NordVPN's threat protection feature has performed well under independent scrutiny. In November 2024, AV-TEST – a German independent IT security research institute – <a href="https://www.tomsguide.com/computing/online-security/nords-threat-protection-pro-rated-the-best-vpn-malware-protection">previously rated</a> Threat Protection Pro the best VPN tool for malware protection, achieving an 83.42% total detection rate across 3,209 tested links. That result placed it well ahead of the next-best VPN tested, IPVanish, which scored 46.96%.</p><p>NordVPN also has history with AV-Comparatives specifically. In June 2024, it became the first VPN provider to earn the organisation's <a href="https://www.tomsguide.com/computing/vpns/nordvpn-certified-as-the-only-anti-phishing-vpn-for-the-second-year-running">anti-phishing protection badge</a> – a significant distinction given that AV-Comparatives is best known for evaluating dedicated antivirus software, not VPNs. Earning the badge requires a minimum 85% detection rate with zero false alarms on legitimate sites, a bar not all established antivirus products have cleared. The August 2026 result, at 94%, clears it by some distance.</p><p>NordVPN's next-gen antivirus is available on Plus plans and above – the feature was previously known as Threat Protection Pro, and is included across Plus, Complete, and Prime tiers. </p><div data-widget-type="merchantlink" data-model-name="NordVPN"></div><p>We test and review VPN services in the context of legal recreational uses. For example:<strong>1.</strong> Accessing a service from another country (subject to the terms and conditions of that service).<strong>2.</strong> Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/vpns/nordvpns-next-gen-antivirus-scores-94-percent-in-independent-phishing-and-malware-testing</link>
                                                                            <description>
                            <![CDATA[ NordVPN's next-gen antivirus scored 94% in AV-Comparatives' August 2026 anti-phishing test, finishing third among security products behind Avast and Norton, with no false positives. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">rxV2uExpVnrLzHBWK6JMDe</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/BK6jKgGh8BGjbBSEnE5VDL-1920-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Fri, 04 Sep 2026 10:56:09 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[VPNs]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Internet]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Aleksandar Stevanović ]]></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/BK6jKgGh8BGjbBSEnE5VDL-1920-80.png">
                                                            <media:credit><![CDATA[NordVPN]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[NordVPN in action protecting a phone and laptop simultaneously]]></media:description>                                                            <media:text><![CDATA[NordVPN in action protecting a phone and laptop simultaneously]]></media:text>
                                <media:title type="plain"><![CDATA[NordVPN in action protecting a phone and laptop simultaneously]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/BK6jKgGh8BGjbBSEnE5VDL-1920-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/reviews/nordvpn-review">NordVPN</a>'s <a href="https://www.tomsguide.com/computing/vpns/nordvpn-combines-vpn-and-next-generation-antivirus-into-one-app">next-gen antivirus</a> has achieved a 94% phishing detection rate in AV-Comparatives' latest anti-phishing test, ranking third among security products in the independent evaluation. The result our choice as the <a href="https://www.tomsguide.com/best-picks/best-vpn">best VPN</a> behind only Avast One Free Antivirus and Norton Antivirus Plus, both of which scored 96%.</p><p>The <a href="https://www.av-comparatives.org/wp-content/uploads/2026/08/phishing_comp_Q3-2026.pdf" target="_blank" rel="nofollow">test</a>, which ran from August 12–22, 2026, assessed phishing-page detection rates across 250 live phishing URLs, with an additional 250 legitimate URLs used to check for false positives. NordVPN recorded zero false alarms – a result that puts it ahead of Malwarebytes Premium and Webroot SecureAnywhere Internet Security Plus, both of which triggered false positives during the evaluation.</p><p>The findings come as NordVPN continues to reposition itself as an all-in-one digital security app. The company's <a href="https://www.tomsguide.com/computing/vpns/nordvpn-combines-vpn-and-next-generation-antivirus-into-one-app">recent rebrand</a> saw Threat Protection Pro renamed as "next-generation antivirus," placing it alongside its VPN and Dark Web Monitor as one of three core pillars of the product.</p><h2 id="how-does-nordvpn-compare">How does NordVPN compare?</h2><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="UtDZFoTmPNBWUcdJsQqvG" name="NordVPN 2026 phishing test results" alt="Graph displaying the test's results" src="https://cdn.mos.cms.futurecdn.net/UtDZFoTmPNBWUcdJsQqvG-1920-80.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Finishing third among nine security products is a strong result, but the detail behind NordVPN's score is arguably just as telling as the number itself. Avast One Free Antivirus and Norton Antivirus Plus both edged it out with 96% detection rates, but the gap is narrow – a two-percentage-point difference across 250 live phishing URLs amounts to five URLs.</p><p>The rest of the field tells its own story. At the other end of the table, Dr. Web Security Space managed just 57% and K7 Total Security 70% – results that illustrate how inconsistent phishing protection remains across the security products market, even among established names. </p><p>NordVPN's advantage over the field is clearest on false positives. It was one of seven security products to record zero false alarms – and false positives erode confidence in a security tool just as surely as missed threats do.</p><p>"Phishing is a numbers game for attackers, and they're very good at it," said Domininkas Virbickas, product director at NordVPN. "Anybody might slip up eventually, and when you do click on something you shouldn't, that's where we step in."</p><h2 id="a-strong-track-record-in-independent-testing">A strong track record in independent testing</h2><p>This is not the first time NordVPN's threat protection feature has performed well under independent scrutiny. In November 2024, AV-TEST – a German independent IT security research institute – <a href="https://www.tomsguide.com/computing/online-security/nords-threat-protection-pro-rated-the-best-vpn-malware-protection">previously rated</a> Threat Protection Pro the best VPN tool for malware protection, achieving an 83.42% total detection rate across 3,209 tested links. That result placed it well ahead of the next-best VPN tested, IPVanish, which scored 46.96%.</p><p>NordVPN also has history with AV-Comparatives specifically. In June 2024, it became the first VPN provider to earn the organisation's <a href="https://www.tomsguide.com/computing/vpns/nordvpn-certified-as-the-only-anti-phishing-vpn-for-the-second-year-running">anti-phishing protection badge</a> – a significant distinction given that AV-Comparatives is best known for evaluating dedicated antivirus software, not VPNs. Earning the badge requires a minimum 85% detection rate with zero false alarms on legitimate sites, a bar not all established antivirus products have cleared. The August 2026 result, at 94%, clears it by some distance.</p><p>NordVPN's next-gen antivirus is available on Plus plans and above – the feature was previously known as Threat Protection Pro, and is included across Plus, Complete, and Prime tiers. </p><div data-widget-type="merchantlink" data-model-name="NordVPN"></div><p>We test and review VPN services in the context of legal recreational uses. For example:<strong>1.</strong> Accessing a service from another country (subject to the terms and conditions of that service).<strong>2.</strong> Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I held the Asus ProArt P14 next to my MacBook Pro 14 — and Apple should be genuinely terrified of Nvidia’s RTX Spark ]]></title>
                                                                                                <dc:content><![CDATA[ <p>As I keep saying, there’s a big two-device compromise problem. I love my 14-inch MacBook Pro for its rigidity, battery life, silent thermals, great ergonomics, and raw performance for my prosumer workload. But macOS locks me out of native PC gaming (mostly), so I need <em>another </em>machine to do that.</p><p>So when <a href="https://www.tomsguide.com/computing/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions">Nvidia’s RTX Spark</a> was announced, I saw the possibility of a future daily driver pull into view — the everything machine I’d always wanted. And then when I held the Asus ProArt P14 in my right hand and the <a href="https://www.tomsguide.com/computing/macbooks/macbook-pro-m5-review">14-inch M5 MacBook Pro</a> in my left, it became clear I’d found my top pick of Team Green’s roster.</p><p>That’s because Asus didn’t just build a competitor; they pretty obviously reverse-engineered the MacBook Pro’s footprint and low-profile industrial aesthetic. It was going to take a lot to get me to switch from my Apple lifestyle, but coming as close to the Apple feel as possible is a helpful start, to say the least!</p><p>So for the first time, a Windows machine has the silicon architecture to challenge Apple Silicon, and Asus is packing it into a machine that rolls tanks onto the MacBook Pro’s turf.</p><h2 class="article-body__section" id="section-design-and-build-spotting-the-physical-differences"><span>Design and build: spotting the physical differences</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:2252px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="ctV2oQ993HC4K2YGEhyUp3" name="Asus ProArt P14 vs MacBook Pro M5-4" alt="Asus ProArt P14 vs MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/ctV2oQ993HC4K2YGEhyUp3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="1267" 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><div ><table><thead><tr><th class="firstcol " ><p>Laptop</p></th><th  ><p>Dimensions</p></th><th  ><p>Weight</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Asus ProArt P14</strong></p></td><td  ><p>12.2 x 8.6 x 0.6 inches</p></td><td  ><p>3.3 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>M5 MacBook Pro</strong></p></td><td  ><p>12.3 x 8.7 x 0.6 inches </p></td><td  ><p>3.4 pounds</p></td></tr></tbody></table></div><p>Stacking them directly, you can see how much Asus took inspiration from Apple, as the ProArt P14 matches the MacBook Pro 14 almost millimeter for millimeter. But there are subtle differences.</p><p>First is the finish. Apple’s anodized aluminum has a smoother, more metallic texture, whereas Asus’ stealthy matte charcoal coating has a much more interesting texture under your fingers.</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:1939px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="TEfbvPPiTx8rkw63wxqVp3" name="Asus ProArt P14 vs MacBook Pro M5-3" alt="Asus ProArt P14 vs MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/TEfbvPPiTx8rkw63wxqVp3-1920-80.jpg" mos="" align="middle" fullscreen="" width="1939" height="1091" 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>And second is the weight balance. Holding them both one-handed, the Pro definitely feels denser, but the distribution feels better balanced. Whereas in the ProArt P14, it’s lighter but more heavily weighted toward thermal management at the back of the system (more on that later).</p><p>Ports-wise, both are effectively set up for creators with full-size HDMI, high-speed USB-C, a headphone jack, and a full-size SD card slot. But the ProArt flex here comes with the legacy USB-A port on the right flank — a minor detail that saves you from carrying dongles.</p><h3 class="article-body__section" id="section-screen-showdown-2-8k-oled-vs-liquid-retina-xdr"><span>Screen showdown: 2.8K OLED vs Liquid Retina XDR</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YfDkKjavVW2VjBgLTRD9u3" name="Asus ProArt P14 vs MacBook Pro M5-2" alt="Asus ProArt P14 vs MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/YfDkKjavVW2VjBgLTRD9u3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><div ><table><thead><tr><th class="firstcol " ><p>Laptop</p></th><th  ><p>Display</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Asus ProArt P14</strong></p></td><td  ><p>14-inch 2.8K (2800 x 1800) 16:10 OLED</p></td></tr><tr><td class="firstcol " ><p><strong>M5 MacBook Pro</strong></p></td><td  ><p>14.2-inch (3024 x 1964) Liquid Retina XDR Mini-LED</p></td></tr></tbody></table></div><p>So when it comes to picking between these screens, I know the default is to say “OLED is better,” but there are levels to this.</p><p>Because yes, the infinite contrast, instant pixel response times for gaming, zero blooming, and no camera notch give the ProArt P14 an advantage. It’s a gorgeous display — this is Asus’ bread and butter after all, as colors melt off the screen.</p><p>But the MacBook Pro (I’m assuming, as we won’t know until full testing — this is just based on what’s always happened before) will likely have a higher sustained peak brightness for outdoor work.</p><p>Really, it comes down to what you’re going to do with it. For gaming and color-accurate video grading in indoor/studio settings, the OLED wins on pure punch. However, for working out and about in bright coffee shops, Apple’s Mini-LED will probably retain the top spot.</p><h3 class="article-body__section" id="section-the-tactile-friction-point-key-feel-and-trackpad"><span>The tactile friction point: Key feel and trackpad</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:2283px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="PjazzbgGFaXr5deUkzKUu3" name="Asus ProArt P14 vs MacBook Pro M5" alt="Asus ProArt P14 vs MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/PjazzbgGFaXr5deUkzKUu3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2283" height="1284" 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 MacBook Pro has always been one of my favorites ergonomically speaking —packing shallow but snappy scissor keyboard switches set in a well. It feels familiar, reliable, and fatigue-free, but it does lack the travel for deep gaming presses.</p><p>Meanwhile, the ProArt P14’s keys have a deeper dish, a little more key travel, and a softer landing underneath. The added depth creates a more satisfying impact, and the WASD stability for gaming feels a little better. But the slight added mushiness may come back to haunt me if I type all day.</p><p>Then there’s the trackpads. Now don’t get me wrong, the ProArt’s physical trackpad is massive and smooth, with a nice tactility to the physical click. But Apple’s Force Touch haptics are basically witchcraft, with an identical click anywhere on the glass and zero chance of any mechanical dead zones.</p><h3 class="article-body__section" id="section-under-the-hood"><span>Under the hood</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9i5mcD3e3DmixKtuq3mnzU" name="Asus ProArt P14 vs MacBook Pro M5" alt="Asus ProArt P14 vs MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/9i5mcD3e3DmixKtuq3mnzU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Currently, I’m on an M5 MacBook Pro, but you can spec it up to M5 Pro or M5 Max with unified memory shared between CPU and GPU cores. The end result is lightning-fast performance across all your tasks that has always been one step ahead of the competition from Qualcomm, Intel, and AMD.</p><p>And now, the ProArt P14 is taking on Apple with the RTX Spark N1X platform — marrying an Arm-based Nvidia Grace CPU with a dedicated Blackwell RTX GPU, backed up by up to 128GB of unified memory.</p><p>In terms of how much you can spec it, ProArt P14 configurations start from that baseline N1X with fewer cores and 24GB of memory, so the versatility of configs means you can run the full gamut against the MacBook Pro.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5X7LesSj9fyDU8yrouBoSU" name="Asus ProArt P14 vs MacBook Pro M5" alt="Asus ProArt P14 vs MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/5X7LesSj9fyDU8yrouBoSU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Apple’s machine falls down in modern AAA PC gaming backlogs — some of it works through Metal compatibility, but most will be left to crippling emulation or cloud streaming.</p><p>But with N1X’s CUDA cores, the ProArt P14 can run 1440p games at 100 FPS, complete with DLSS support and anti-cheat compatibility. Beyond that, I expect they’ll be pretty evenly matched in creator performance and AI. Differences there will come down to the software optimization for the silicon.</p><h3 class="article-body__section" id="section-the-potential-dealbreakers"><span>The potential dealbreakers</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pbfBZx7ZmNxAR8JxpPcEHU" name="Asus ProArt P14 vs MacBook Pro M5" alt="Asus ProArt P14 vs MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/pbfBZx7ZmNxAR8JxpPcEHU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’m just going to summarize some quick things that may become the thorn in the ProArt P14’s side once we get one in the labs to fully test.</p><ul><li><strong>The fan noise: </strong>When I tested the <a href="https://www.tomsguide.com/computing/gaming-laptops/i-tested-6-rtx-spark-laptops-for-gaming-and-the-winner-completely-shocked-me">ProArt P14 for gaming</a>, it was the loudest RTX Spark laptop in the room. The MacBook Pro stays near-silent during everyday tasks, and hopefully the P14 is the same — but it’s clear that an insane amount of Nvidia silicon requires aggressive airflow.</li><li><strong>Battery endurance: </strong>Nvidia is claiming “all-day” battery life and the same performance both on and off the charger. During my testing, I can confirm the latter, but we don’t know about the former yet! If it can achieve that 12-14+ hours of mixed real-world productivity, Apple loses its biggest single advantage.</li><li><strong>The price: </strong>The MacBook Pro starts at $1,999. To get the equivalent amount of memory (24GB), that price goes up to $2,199. This is the big question mark for N1X laptops, and hopefully they’ll be competitive on cost.</li></ul><h2 class="article-body__section" id="section-early-verdict"><span>Early verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RPrRBEsYKHxXze25EpotYU" name="Asus ProArt P14 vs MacBook Pro M5" alt="Asus ProArt P14 vs MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/RPrRBEsYKHxXze25EpotYU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This is a way-too-early verdict, as I’m piecing together the few times I’ve had to test the ProArt P14 and its potential against months of MacBook Pro use. But I’ll give it a stab.</p><section class="howto-block">                    <h3>Switch to the Asus ProArt P14 if</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/r2srK5bDXmnczCLfapywsU.jpg"                                        alt="Asus ProArt P14 vs MacBook Pro M5"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/r2srK5bDXmnczCLfapywsU.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>You refuse to carry two laptops ever again. If you want a sleek, premium aluminum daily driver that can handle your prosumer work by day and play games by night, the ProArt P14 is the first Windows laptop that really steps on the MacBook Pro's throat.</p></p>                </section><section class="howto-block">                    <h3>Stick with the MacBook Pro 14 if</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/aeAsuGHPsdeNftt767USaK.jpg"                                        alt="MacBook Pro M5"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/aeAsuGHPsdeNftt767USaK.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Gaming isn't a priority; you prioritize whisper-quiet operation, a uniform haptic trackpad, and a pure macOS creative pipeline. Battery endurance is proven on this machine, but the jury’s still out until we get the P14 in for testing.</p></p>                </section><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter">I tested Acer’s wild flip-and-swivel handheld — why Project DualPlay Mini is the ultimate netbook love letter</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-tested-the-real-dlss-5-forget-the-leaked-mods-its-not-an-ai-filter-this-is-nvidias-photorealistic-game-changer">I wanted to hate Nvidia’s DLSS 5 ‘AI filter’ — but the real DLSS 5 is photorealistic black magic</a></li><li><a href="https://www.tomsguide.com/gaming/playstation/as-a-pc-snob-i-wanted-to-catch-gta-6-making-console-compromises-instead-im-in-awe-of-the-trickery">As a PC snob, I wanted to catch GTA 6 making console compromises. Instead, I’m in awe of the trickery</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/macbook-pro-14-inch-vs-asus-proart-p14-nvidia-rtx-spark</link>
                                                                            <description>
                            <![CDATA[ I compared the Asus ProArt P14 directly against the MacBook Pro 14. With an Nvidia RTX Spark N1X inside, here is why Apple Silicon faces its biggest threat. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">33izTM5yiYMybq5eKoynuK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/J3R2bCJ8gw5H7tBVt5kWvC-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 04 Sep 2026 09:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/J3R2bCJ8gw5H7tBVt5kWvC-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Asus ProArt P14 vs MacBook Pro M5]]></media:description>                                                            <media:text><![CDATA[Asus ProArt P14 vs MacBook Pro M5]]></media:text>
                                <media:title type="plain"><![CDATA[Asus ProArt P14 vs MacBook Pro M5]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/J3R2bCJ8gw5H7tBVt5kWvC-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As I keep saying, there’s a big two-device compromise problem. I love my 14-inch MacBook Pro for its rigidity, battery life, silent thermals, great ergonomics, and raw performance for my prosumer workload. But macOS locks me out of native PC gaming (mostly), so I need <em>another </em>machine to do that.</p><p>So when <a href="https://www.tomsguide.com/computing/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions">Nvidia’s RTX Spark</a> was announced, I saw the possibility of a future daily driver pull into view — the everything machine I’d always wanted. And then when I held the Asus ProArt P14 in my right hand and the <a href="https://www.tomsguide.com/computing/macbooks/macbook-pro-m5-review">14-inch M5 MacBook Pro</a> in my left, it became clear I’d found my top pick of Team Green’s roster.</p><p>That’s because Asus didn’t just build a competitor; they pretty obviously reverse-engineered the MacBook Pro’s footprint and low-profile industrial aesthetic. It was going to take a lot to get me to switch from my Apple lifestyle, but coming as close to the Apple feel as possible is a helpful start, to say the least!</p><p>So for the first time, a Windows machine has the silicon architecture to challenge Apple Silicon, and Asus is packing it into a machine that rolls tanks onto the MacBook Pro’s turf.</p><h2 class="article-body__section" id="section-design-and-build-spotting-the-physical-differences"><span>Design and build: spotting the physical differences</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:2252px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="ctV2oQ993HC4K2YGEhyUp3" name="Asus ProArt P14 vs MacBook Pro M5-4" alt="Asus ProArt P14 vs MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/ctV2oQ993HC4K2YGEhyUp3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2252" height="1267" 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><div ><table><thead><tr><th class="firstcol " ><p>Laptop</p></th><th  ><p>Dimensions</p></th><th  ><p>Weight</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Asus ProArt P14</strong></p></td><td  ><p>12.2 x 8.6 x 0.6 inches</p></td><td  ><p>3.3 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>M5 MacBook Pro</strong></p></td><td  ><p>12.3 x 8.7 x 0.6 inches </p></td><td  ><p>3.4 pounds</p></td></tr></tbody></table></div><p>Stacking them directly, you can see how much Asus took inspiration from Apple, as the ProArt P14 matches the MacBook Pro 14 almost millimeter for millimeter. But there are subtle differences.</p><p>First is the finish. Apple’s anodized aluminum has a smoother, more metallic texture, whereas Asus’ stealthy matte charcoal coating has a much more interesting texture under your fingers.</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:1939px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="TEfbvPPiTx8rkw63wxqVp3" name="Asus ProArt P14 vs MacBook Pro M5-3" alt="Asus ProArt P14 vs MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/TEfbvPPiTx8rkw63wxqVp3-1920-80.jpg" mos="" align="middle" fullscreen="" width="1939" height="1091" 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>And second is the weight balance. Holding them both one-handed, the Pro definitely feels denser, but the distribution feels better balanced. Whereas in the ProArt P14, it’s lighter but more heavily weighted toward thermal management at the back of the system (more on that later).</p><p>Ports-wise, both are effectively set up for creators with full-size HDMI, high-speed USB-C, a headphone jack, and a full-size SD card slot. But the ProArt flex here comes with the legacy USB-A port on the right flank — a minor detail that saves you from carrying dongles.</p><h3 class="article-body__section" id="section-screen-showdown-2-8k-oled-vs-liquid-retina-xdr"><span>Screen showdown: 2.8K OLED vs Liquid Retina XDR</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YfDkKjavVW2VjBgLTRD9u3" name="Asus ProArt P14 vs MacBook Pro M5-2" alt="Asus ProArt P14 vs MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/YfDkKjavVW2VjBgLTRD9u3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><div ><table><thead><tr><th class="firstcol " ><p>Laptop</p></th><th  ><p>Display</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Asus ProArt P14</strong></p></td><td  ><p>14-inch 2.8K (2800 x 1800) 16:10 OLED</p></td></tr><tr><td class="firstcol " ><p><strong>M5 MacBook Pro</strong></p></td><td  ><p>14.2-inch (3024 x 1964) Liquid Retina XDR Mini-LED</p></td></tr></tbody></table></div><p>So when it comes to picking between these screens, I know the default is to say “OLED is better,” but there are levels to this.</p><p>Because yes, the infinite contrast, instant pixel response times for gaming, zero blooming, and no camera notch give the ProArt P14 an advantage. It’s a gorgeous display — this is Asus’ bread and butter after all, as colors melt off the screen.</p><p>But the MacBook Pro (I’m assuming, as we won’t know until full testing — this is just based on what’s always happened before) will likely have a higher sustained peak brightness for outdoor work.</p><p>Really, it comes down to what you’re going to do with it. For gaming and color-accurate video grading in indoor/studio settings, the OLED wins on pure punch. However, for working out and about in bright coffee shops, Apple’s Mini-LED will probably retain the top spot.</p><h3 class="article-body__section" id="section-the-tactile-friction-point-key-feel-and-trackpad"><span>The tactile friction point: Key feel and trackpad</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:2283px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="PjazzbgGFaXr5deUkzKUu3" name="Asus ProArt P14 vs MacBook Pro M5" alt="Asus ProArt P14 vs MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/PjazzbgGFaXr5deUkzKUu3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2283" height="1284" 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 MacBook Pro has always been one of my favorites ergonomically speaking —packing shallow but snappy scissor keyboard switches set in a well. It feels familiar, reliable, and fatigue-free, but it does lack the travel for deep gaming presses.</p><p>Meanwhile, the ProArt P14’s keys have a deeper dish, a little more key travel, and a softer landing underneath. The added depth creates a more satisfying impact, and the WASD stability for gaming feels a little better. But the slight added mushiness may come back to haunt me if I type all day.</p><p>Then there’s the trackpads. Now don’t get me wrong, the ProArt’s physical trackpad is massive and smooth, with a nice tactility to the physical click. But Apple’s Force Touch haptics are basically witchcraft, with an identical click anywhere on the glass and zero chance of any mechanical dead zones.</p><h3 class="article-body__section" id="section-under-the-hood"><span>Under the hood</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9i5mcD3e3DmixKtuq3mnzU" name="Asus ProArt P14 vs MacBook Pro M5" alt="Asus ProArt P14 vs MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/9i5mcD3e3DmixKtuq3mnzU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Currently, I’m on an M5 MacBook Pro, but you can spec it up to M5 Pro or M5 Max with unified memory shared between CPU and GPU cores. The end result is lightning-fast performance across all your tasks that has always been one step ahead of the competition from Qualcomm, Intel, and AMD.</p><p>And now, the ProArt P14 is taking on Apple with the RTX Spark N1X platform — marrying an Arm-based Nvidia Grace CPU with a dedicated Blackwell RTX GPU, backed up by up to 128GB of unified memory.</p><p>In terms of how much you can spec it, ProArt P14 configurations start from that baseline N1X with fewer cores and 24GB of memory, so the versatility of configs means you can run the full gamut against the MacBook Pro.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5X7LesSj9fyDU8yrouBoSU" name="Asus ProArt P14 vs MacBook Pro M5" alt="Asus ProArt P14 vs MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/5X7LesSj9fyDU8yrouBoSU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Apple’s machine falls down in modern AAA PC gaming backlogs — some of it works through Metal compatibility, but most will be left to crippling emulation or cloud streaming.</p><p>But with N1X’s CUDA cores, the ProArt P14 can run 1440p games at 100 FPS, complete with DLSS support and anti-cheat compatibility. Beyond that, I expect they’ll be pretty evenly matched in creator performance and AI. Differences there will come down to the software optimization for the silicon.</p><h3 class="article-body__section" id="section-the-potential-dealbreakers"><span>The potential dealbreakers</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pbfBZx7ZmNxAR8JxpPcEHU" name="Asus ProArt P14 vs MacBook Pro M5" alt="Asus ProArt P14 vs MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/pbfBZx7ZmNxAR8JxpPcEHU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’m just going to summarize some quick things that may become the thorn in the ProArt P14’s side once we get one in the labs to fully test.</p><ul><li><strong>The fan noise: </strong>When I tested the <a href="https://www.tomsguide.com/computing/gaming-laptops/i-tested-6-rtx-spark-laptops-for-gaming-and-the-winner-completely-shocked-me">ProArt P14 for gaming</a>, it was the loudest RTX Spark laptop in the room. The MacBook Pro stays near-silent during everyday tasks, and hopefully the P14 is the same — but it’s clear that an insane amount of Nvidia silicon requires aggressive airflow.</li><li><strong>Battery endurance: </strong>Nvidia is claiming “all-day” battery life and the same performance both on and off the charger. During my testing, I can confirm the latter, but we don’t know about the former yet! If it can achieve that 12-14+ hours of mixed real-world productivity, Apple loses its biggest single advantage.</li><li><strong>The price: </strong>The MacBook Pro starts at $1,999. To get the equivalent amount of memory (24GB), that price goes up to $2,199. This is the big question mark for N1X laptops, and hopefully they’ll be competitive on cost.</li></ul><h2 class="article-body__section" id="section-early-verdict"><span>Early verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RPrRBEsYKHxXze25EpotYU" name="Asus ProArt P14 vs MacBook Pro M5" alt="Asus ProArt P14 vs MacBook Pro M5" src="https://cdn.mos.cms.futurecdn.net/RPrRBEsYKHxXze25EpotYU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This is a way-too-early verdict, as I’m piecing together the few times I’ve had to test the ProArt P14 and its potential against months of MacBook Pro use. But I’ll give it a stab.</p><section class="howto-block">                    <h3>Switch to the Asus ProArt P14 if</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/r2srK5bDXmnczCLfapywsU.jpg"                                        alt="Asus ProArt P14 vs MacBook Pro M5"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/r2srK5bDXmnczCLfapywsU.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>You refuse to carry two laptops ever again. If you want a sleek, premium aluminum daily driver that can handle your prosumer work by day and play games by night, the ProArt P14 is the first Windows laptop that really steps on the MacBook Pro's throat.</p></p>                </section><section class="howto-block">                    <h3>Stick with the MacBook Pro 14 if</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/aeAsuGHPsdeNftt767USaK.jpg"                                        alt="MacBook Pro M5"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/aeAsuGHPsdeNftt767USaK.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Gaming isn't a priority; you prioritize whisper-quiet operation, a uniform haptic trackpad, and a pure macOS creative pipeline. Battery endurance is proven on this machine, but the jury’s still out until we get the P14 in for testing.</p></p>                </section><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter">I tested Acer’s wild flip-and-swivel handheld — why Project DualPlay Mini is the ultimate netbook love letter</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-tested-the-real-dlss-5-forget-the-leaked-mods-its-not-an-ai-filter-this-is-nvidias-photorealistic-game-changer">I wanted to hate Nvidia’s DLSS 5 ‘AI filter’ — but the real DLSS 5 is photorealistic black magic</a></li><li><a href="https://www.tomsguide.com/gaming/playstation/as-a-pc-snob-i-wanted-to-catch-gta-6-making-console-compromises-instead-im-in-awe-of-the-trickery">As a PC snob, I wanted to catch GTA 6 making console compromises. Instead, I’m in awe of the trickery</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ This $700 BenQ rivals $1,500 Apple's Studio Display on color accuracy — here's why it's great for professionals ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If you’re a professional photographer, content creator or editor, you need one of the <a href="https://www.tomsguide.com/best-picks/best-monitors">best monitors</a> to accurately edit your work. The BenQ Creative Pro PD2732U is an excellent choice, and it makes a strong first impression with its sleek, gun metal design and superb build quality. Its generous selection of ports and seriously impressive color coverage and accuracy make it an outstanding option for pros.</p><p>That said, the PD2732U isn’t quite perfect — but neither of its flaws are massive dealbreakers. Its panel isn’t the brightest in SDR or HDR modes, and the 60Hz refresh rate feels limiting if you’re working with high-framerate videos.</p><p>Should you still buy it? Read my full BenQ Creative Pro PD2732U review to find out.</p><h2 class="article-body__section" id="section-benq-creative-pro-pd2732u-review-specs"><span>BenQ Creative Pro PD2732U review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.bhphotovideo.com/c/product/1967588-REG/benq_pd2732u_32_4k_professional.html" target="_blank" rel="nofollow">$699</a> / <a href="https://www.amazon.co.uk/dp/B0H862B5P7" target="_blank" rel="nofollow">£649</a></p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>27-inch</p></td></tr><tr><td class="firstcol " ><p><strong>Resolution</strong></p></td><td  ><p>3840 x 2160</p></td></tr><tr><td class="firstcol " ><p><strong>Aspect ratio</strong></p></td><td  ><p>16:9</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>60Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Response time</strong></p></td><td  ><p>5ms</p></td></tr><tr><td class="firstcol " ><p><strong>Panel type</strong></p></td><td  ><p>IPS</p></td></tr><tr><td class="firstcol " ><p><strong>Color depth</strong></p></td><td  ><p>10-bit</p></td></tr><tr><td class="firstcol " ><p><strong>DPI</strong></p></td><td  ><p>163</p></td></tr><tr><td class="firstcol " ><p><strong>Backlight</strong></p></td><td  ><p>LED</p></td></tr><tr><td class="firstcol " ><p><strong>Inputs</strong></p></td><td  ><p>Power, 1x HDMI 2.0, 1x DisplayPort 1.4, 2x Thunderbolt 4 (90W PD), 3x USB-A (downstream, 5Gbps, 7.5W and 4.5W PD), 1x USB-C (upstream, 5Gbps)</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>24.2 x 16.9-21.5 x 9.5 inches (with stand)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>18.87lbs (with stand)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-benq-creative-pro-pd2732u-review-cheat-sheet"><span>BenQ Creative Pro PD2732U review: Cheat sheet</span></h2><ul><li><strong>What is it?</strong> A Calman Verified 27-inch 4K monitor with lots of ports</li><li><strong>Who is it for?</strong> Professional photographers, creators and editors</li><li><strong>How much does it cost? </strong>The BenQ Creative Pro PD2732U is available for <a href="https://www.bhphotovideo.com/c/product/1967588-REG/benq_pd2732u_32_4k_professional.html" target="_blank" rel="nofollow">$699</a> / <a href="https://www.amazon.co.uk/dp/B0H862B5P7" target="_blank" rel="nofollow">£649</a></li><li><strong>What do we like? </strong>The sleek design, photography-centric features, excellent color coverage and accuracy, and array of ports</li><li><strong>What don’t we like? </strong>The dim panel, and 60Hz refresh rate</li></ul><h2 class="article-body__section" id="section-benq-creative-pro-pd2732u-review-the-ups"><span>BenQ Creative Pro PD2732U review: The ups</span></h2><p>From its lovely design and wide array of ports, to its fantastic color coverage and accuracy, the BenQ Creative Pro PD2732U is a wonderful monitor for professionals.</p><h2 id="lovely-design-and-build-quality">Lovely design and build quality</h2><p>The BenQ Creative Pro PD2732U is a looker. Unlike its siblings, like the <a href="https://www.tomsguide.com/computing/monitors/benq-pd3226g-review">BenQ PD3226G</a> ($1,099) and the <a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2730s-5k-monitor-review">BenQ PD2730S</a> ($1,199) which feature gray bezels and stands, the PD2732U sports a gun metal look that is just so pleasing to the eye. The part metal construction adds to the monitor’s visual appeal — and to its structural integrity, of course.</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="aTXvubDMiHmaWyE8AR4ogF" name="BenQ_Designer_monitor_.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/aTXvubDMiHmaWyE8AR4ogF-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Thanks to that, the PD2732U feels like an extremely well-built monitor. Its IPS panel doesn’t feel overly plasticky or flimsy. Unlike the <a href="https://www.tomsguide.com/computing/monitors/alogic-edge-40-inch-5k-ultrawide-review">Alogic Edge 40-inch 5K Ultrawide</a> ($1,499), the PD2732U’s hinges don’t feel flimsy either, and the panel doesn’t move easily, even when someone shakes your desk.</p><p>I also appreciate being able to lift the monitor easily and move it around, as it weighs 18.87lbs (with stand and base). It’s a little lighter than some other productivity-focused monitors I’ve tested, like the <a href="https://www.tomsguide.com/computing/monitors/dell-pro-p34-usb-c-hub-webcam-monitor-p3426wev-review">Dell Pro P3426WEV</a> (21.96lbs, $749), and the <a href="https://www.tomsguide.com/computing/monitors/benq-ma270s-review">BenQ MA270S</a> (19.05lbs, $999).</p><p>The 27-inch screen size also means that you should be able to place another similarly-sized (or smaller) monitor next to it if you prefer a dual-monitor setup. The PD2732U measures 24.2 x 16.9-21.5 x 9.5 inches, and it didn’t take up too much space on my office desk. Overall, the PD2732U’s design, dimensions and build quality don’t give you much to complain about.</p><h2 id="plenty-of-ports">Plenty of ports</h2><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="NapNfbfgeLDAu77Fm3WekF" name="BenQ_Designer_monitor_ 8.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/NapNfbfgeLDAu77Fm3WekF-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>In addition to the stellar design and build, the BenQ Creative Pro PD2732U hosts a plethora of ports that ensure better cable management and give you plenty of room to hook up various peripherals and accessories. Around the back, you’ll find the power port (duh), an HDMI 2.0 port, a DisplayPort 1.4 port, and two Thunderbolt 4 ports with 90W of power delivery and daisy-chaining.</p><p>I used one of the Thunderbolt ports to connect my <a href="https://www.tomsguide.com/reviews/macbook-air-2022-m2">MacBook Air M2</a> to the monitor and charge my laptop at the same time. There’s Smart KVM, too, which enables you to use a single keyboard and mouse with two computers when both are hooked up to the monitor (even wirelessly) — great for those who regularly switch between macOS and Windows.</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="683JiaEyYzrykJ5L67xEMF" name="BenQ_Designer_monitor_ 7.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/683JiaEyYzrykJ5L67xEMF-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You also get a USB hub with three USB-A ports and one USB-C port. The Type-C port is an upstream one, while the Type-A ports are downstream ones (two with 7.5W PD and one with 4.5W PD). All ports have transfer speeds of up to 5Gbps. This level of connectivity is similar to what you’ll find on other BenQ monitors, like the MA270S and the PD2730S.</p><p>To help with cable management, BenQ happily includes a handy cable holder in the box. You can clip it around the PD2732U’s stand before attaching it to the base, and then bunch up your cables and run them through it. I find this very helpful, and it makes me wish all monitors came with one.</p><h2 id="photography-centric-features">Photography-centric features</h2><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="9Sv7kRevZ3r9Fdi5aTDhqE" name="BenQ_Designer_monitor_ 2.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/9Sv7kRevZ3r9Fdi5aTDhqE-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>In the past when we’ve reviewed BenQ monitors, we’ve complained about the lack of a dedicated Adobe RGB mode on the likes of the PD2730S and the PD3226G. Not anymore! Alongside other photography-centric features that I’ll get into, the BenQ Creative Pro PD2732U features an Adobe RGB mode which makes the monitor <em>actually </em>useful for photographers who print. Because the Adobe RGB gamut covers a wider range of colors used by CMYK printers versus sRGB, having a dedicated mode is crucial for ensuring color accuracy when printing, so it’s great that the PD2732U doesn’t skimp on it.</p><p>The PD2732U carries a bunch of certifications, too. It’s Calman Verified, which means that it’s been tested by the popular brand that makes display calibration software (it’s what we use to test the <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TVs</a>). Calman Verification basically ascertains that Calman approves of the monitor’s AQColor technology.</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="Kgav2K6M2QXGyka3zEzhVF" name="BenQ_Designer_monitor_ 5.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/Kgav2K6M2QXGyka3zEzhVF-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It’s Pantone Validated and Pantone SkinTone Validated. The latter is the creative industry-standard color definition for printing, and the latter guarantees that the monitor is capable of showing accurate human skin tones. The PD2732U features Eye Care flicker-free technology, too, which eliminates invisible screen flashing at all brightness levels to prevent eye strain. Having stared at the monitor for up to eight hours a day for nearly a week, I can confirm that I did not feel any eye fatigue or get any headaches, so this is a wonderful display for those who spend long hours editing.</p><p>The PD2732U is a great monitor for creators who are MacBook users, too, as it features M-book Mode. This eliminates differences between macOS displays and the monitor, so colors on the PD2732U appear exactly as they do on my MacBook Air M2. You also get iDevice Color Sync for accurate previews of iPhone and iPad content, and iKeyboard Control which allows you to adjust the monitor’s brightness and volume directly from your laptop’s keyboard.</p><h2 id="my-favorite-monitor-accessory-returns">My favorite monitor accessory returns</h2><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="XQF2T4NEfpvFmLyRJVWByE" name="BenQ_Designer_monitor_ 3.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/XQF2T4NEfpvFmLyRJVWByE-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When I unboxed the BenQ Creative Pro PD2732U, I was very happy to see my favorite monitor accessory make a return. The monitor comes with BenQ’s Hotkey Puck — this time in gun metal to match the display — and it’s a white circular remote with a scroll wheel and a few customizable buttons. It enables you to control the monitor without extending your arms and reaching for the buttons on the display itself.</p><p>The three customizable buttons can be remapped to gain quick access to color modes, input, app launch, and more. I love how the Hotkey Puck streamlines workflows, and it’s especially useful if you frequently switch between color spaces.</p><h2 id="wide-color-coverage-and-great-accuracy">Wide color coverage and great accuracy</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:773px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="aTXvubDMiHmaWyE8AR4ogF" name="BenQ_Designer_monitor_.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:36,l:865,cw:773,ch:435,q:80/aTXvubDMiHmaWyE8AR4ogF.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 BenQ Creative Pro PD2732U’s stellar design, connectivity options and useful Hotkey Puck would amount to nothing if the monitor didn’t boast excellent color coverage and accuracy… and it ticks both boxes. First of all, the PD2732U’s 4K IPS panel has a resolution of 3840 x 2160, and it’s beautiful to look at. Even before I conducted my lab tests, I could tell that the monitor was displaying lovely and accurate colors.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>sRGB</strong></p></th><th  ><p><strong>DCI P3</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>BenQ PD2732U</strong></p></td><td  ><p>147.1%</p></td><td  ><p>104.2%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/dell-pro-p34-usb-c-hub-webcam-monitor-p3426wev-review"><strong>Dell Pro P3426WEV</strong></a></p></td><td  ><p>122.8%</p></td><td  ><p>87%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-ma270s-review"><strong>BenQ MA270S</strong></a></p></td><td  ><p>158.7%</p></td><td  ><p>112.4%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-pd3226g-review"><strong>BenQ PD3226G</strong></a></p></td><td  ><p>147%</p></td><td  ><p>104.1%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2730s-5k-monitor-review"><strong>BenQ PD2730S</strong></a></p></td><td  ><p>104.9%</p></td><td  ><p>98.3%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/alogic-edge-40-inch-5k-ultrawide-review"><strong>Alogic Edge 40-inch 5K Ultrawide</strong></a></p></td><td  ><p>104.5%</p></td><td  ><p>99.8%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/reviews/apple-studio-display"><strong>Apple Studio Display</strong></a></p></td><td  ><p>114.1%</p></td><td  ><p>80.8%</p></td></tr></tbody></table></div><p>And then, my lab tests confirmed it. BenQ claims that the PD2732U covers 100% of the sRGB and 99% of the DCI P3 color spaces. My lab tests showed that it covers 100% and then some across both gamuts. As you can see from the table above, the PD2732U covers 147.1% of the sRGB space and 104.2% of the wider DCI P3 gamut.</p><p>The PD2732U outperforms the pricier BenQ PD2730S and the Alogic Edge 40-inch 5K Ultrawide in the sRGB space, and easily outperforms both in the DCI P3 space, as neither cover 100% of it. Even the very expensive <a href="https://www.tomsguide.com/reviews/apple-studio-display">Apple Studio Display</a> ($1,499) can’t hold a candle to the PD2732U as its DCI P3 coverage is limited to just 80.8%.</p><p>In real-world use, when I was watching YouTube videos and editing images, I found the colors to be bright, vivid and detailed. There was plenty of detail to be found and enjoyed in the shadows, and highlights didn’t appear too sharp or peaking in 4K videos.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Delta-E</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>BenQ PD2732U</strong></p></td><td  ><p>0.11</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/dell-pro-p34-usb-c-hub-webcam-monitor-p3426wev-review"><strong>Dell Pro P3426WEV</strong></a></p></td><td  ><p>0.05</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-ma270s-review"><strong>BenQ MA270S</strong></a></p></td><td  ><p>0.09</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-pd3226g-review"><strong>BenQ PD3226G</strong></a></p></td><td  ><p>0.16</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2730s-5k-monitor-review"><strong>BenQ PD2730S</strong></a></p></td><td  ><p>0.1</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/alogic-edge-40-inch-5k-ultrawide-review"><strong>Alogic Edge 40-inch 5K Ultrawide</strong></a></p></td><td  ><p>0.08</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/reviews/apple-studio-display"><strong>Apple Studio Display</strong></a></p></td><td  ><p>0.2</p></td></tr></tbody></table></div><p>In addition to wide color coverage, the PD2732U color accuracy, measured as a Delta-E score, is outstanding, too. Delta-E is a numerical representation of how much two colors differ, and it gives you an idea of how close the color relayed on screen (i.e. the monitor) is to the color output from the source (i.e. the computer). You ideally want this score to be as close to zero as possible.</p><p>According to BenQ, the PD2732U should have a Delta-E score of less than or equal to 2 straight out of the box. In my testing, the monitor achieved a score of 0.11, upstaging the Apple Studio Display and the BenQ PD3226G (albeit narrowly). This essentially means that the monitor relays colors extremely accurately. After seeing that number, I was more confident when editing photos for various camera reviews and my <a href="https://www.instagram.com/photos.bynikita" target="_blank" rel="nofollow">photography Instagram page</a> as I knew that the colors I was seeing were as accurate as they could be.</p><h2 class="article-body__section" id="section-benq-creative-pro-pd2732u-review-the-downs"><span>BenQ Creative Pro PD2732U review: The downs</span></h2><p>The BenQ Creative Pro PD2732U isn’t perfect — it’s not the brightness monitor out there, and its refresh rate is limited to 60Hz only.</p><h2 id="not-very-bright">Not very bright</h2><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="XJxryGtXDa2yf3SHUu6q8F" name="BenQ_Designer_monitor_ 6.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/XJxryGtXDa2yf3SHUu6q8F-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of my biggest gripes with the BenQ Creative Pro PD2732U is that it isn’t a very bright display, and its poor SDR and HDR performance stick out like a sore thumb. In my lab testing, the PD2732U achieved a peak brightness of just 182.6 nits in SDR, and 184 nits in HDR (10% window size).</p><p>If you’re editing photos or videos, you shouldn’t have your monitor’s brightness turned all the way up anyway, but the extra brightness is nice to have when watching movies, playing games or browsing the internet, for instance. The PD2732U is, then, upstaged by other productivity-focused monitors, as you can see in the table below.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Peak brightness (SDR)</strong></p></th><th  ><p><strong>Peak brightness (10% window size, HDR)</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>BenQ PD2732U</strong></p></td><td  ><p>182.6</p></td><td  ><p>184</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/dell-pro-p34-usb-c-hub-webcam-monitor-p3426wev-review"><strong>Dell Pro P3426WEV</strong></a></p></td><td  ><p>284.8</p></td><td  ><p>N/A</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-ma270s-review"><strong>BenQ MA270S</strong></a></p></td><td  ><p>387.4</p></td><td  ><p>272</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-pd3226g-review"><strong>BenQ PD3226G</strong></a></p></td><td  ><p>252.4</p></td><td  ><p>267</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2730s-5k-monitor-review"><strong>BenQ PD2730S</strong></a></p></td><td  ><p>3882</p></td><td  ><p>346</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/alogic-edge-40-inch-5k-ultrawide-review"><strong>Alogic Edge 40-inch 5K Ultrawide</strong></a></p></td><td  ><p>417</p></td><td  ><p>216</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/reviews/apple-studio-display"><strong>Apple Studio Display</strong></a></p></td><td  ><p>518</p></td><td  ><p>N/A</p></td></tr></tbody></table></div><p>All of its siblings, like the MA270S, the PD3226G and the PD2730S, beat the PD2732U with ease when it comes to peak brightness. I will say, though, that all three monitors are pricier than the PD2732U — as are the Dell Pro P3426WEV and the Alogic Edge 40-inch 5K Ultrawide, which also outperform it.</p><p>There’s another reason why the PD2732U’s SDR performance, at least, is handicapped. Similar to the PD3226G, the PD2732U features <a href="https://www.benq.com/en-us/knowledge-center/knowledge/screen-uniformity.html" target="_blank" rel="nofollow">BenQ’s Uniformity Technology</a> which applies automatic uniformity compensation to keep the brightness at appropriate levels for editing, especially in sRGB and Display P3 modes. Basically, it’s a deliberate feature specifically designed for creators and editors. If you want a bright panel, I’d recommend any of the aforementioned monitors instead — though they will cost you more. </p><h2 id="60hz-refresh-rate-only">60Hz refresh rate only</h2><p>The BenQ Creative Pro PD2732U is a productivity-first monitor so it’s not surprising that its refresh rate tops out at 60Hz only. It’s not meant for competitive gaming or esports, and you may want to consider one of the <a href="https://www.tomsguide.com/us/best-gaming-monitors,review-3114.html">best gaming monitors</a>, like the <a href="https://www.tomsguide.com/computing/monitors/alienware-34-280hz-qd-oled-aw3426dw-review">Alienware AW3426DW</a> ($799), for those purposes.</p><p>For casual video viewing and most editing tasks, 60Hz should suffice, especially if you want the monitor’s extensive color coverage and accuracy. However, if you edit high-framerate footage (120fps or higher) and do rapid timeline scrubbing, 60Hz might not be enough. The BenQ PD3226G with its 144Hz refresh rate might suit your needs better, if that’s the case.</p><h2 class="article-body__section" id="section-benq-creative-pro-pd2732u-review-verdict"><span>BenQ Creative Pro PD2732U review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LQ6kpWLWQH5EPsfQsGBKHF" name="BenQ_Designer_monitor_ 4.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/LQ6kpWLWQH5EPsfQsGBKHF-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There’s a lot to love about the BenQ Creative Pro PD2732U, especially if you’re a professional photographer or editor. It’s ideal for those who care more about color accuracy and connectivity than outright brightness or a high refresh rate. Its stylish, sturdy design looks great on a desk, while the wealth of photography-centric features (including the handy Hotkey Puck) make it a practical choice for day-to-day work.</p><p>There are a couple of notable compromises, though. The low brightness holds it back for general entertainment, while 60Hz feels restrictive for high-framerate video editing. But if you’re buying a monitor primarily for photo and digital-to-print editing, the PD2732U shouldn’t give you much grief.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2732u-review</link>
                                                                            <description>
                            <![CDATA[ The BenQ Creative Pro PD2732U 4K monitor boasts excellent color coverage and accuracy. There are plenty of ports and the monitor looks great too. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Yn74CKaX8zTiKLPRcH9j8A</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aTXvubDMiHmaWyE8AR4ogF-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 04 Sep 2026 08:52:48 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Monitors]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Computing Hardware]]></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-320-70.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.&lt;/p&gt;&lt;p&gt;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/aTXvubDMiHmaWyE8AR4ogF-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A BenQ Creative Pro PD2732U productivity monitor]]></media:description>                                                            <media:text><![CDATA[A BenQ Creative Pro PD2732U productivity monitor]]></media:text>
                                <media:title type="plain"><![CDATA[A BenQ Creative Pro PD2732U productivity monitor]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aTXvubDMiHmaWyE8AR4ogF-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you’re a professional photographer, content creator or editor, you need one of the <a href="https://www.tomsguide.com/best-picks/best-monitors">best monitors</a> to accurately edit your work. The BenQ Creative Pro PD2732U is an excellent choice, and it makes a strong first impression with its sleek, gun metal design and superb build quality. Its generous selection of ports and seriously impressive color coverage and accuracy make it an outstanding option for pros.</p><p>That said, the PD2732U isn’t quite perfect — but neither of its flaws are massive dealbreakers. Its panel isn’t the brightest in SDR or HDR modes, and the 60Hz refresh rate feels limiting if you’re working with high-framerate videos.</p><p>Should you still buy it? Read my full BenQ Creative Pro PD2732U review to find out.</p><h2 class="article-body__section" id="section-benq-creative-pro-pd2732u-review-specs"><span>BenQ Creative Pro PD2732U review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.bhphotovideo.com/c/product/1967588-REG/benq_pd2732u_32_4k_professional.html" target="_blank" rel="nofollow">$699</a> / <a href="https://www.amazon.co.uk/dp/B0H862B5P7" target="_blank" rel="nofollow">£649</a></p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>27-inch</p></td></tr><tr><td class="firstcol " ><p><strong>Resolution</strong></p></td><td  ><p>3840 x 2160</p></td></tr><tr><td class="firstcol " ><p><strong>Aspect ratio</strong></p></td><td  ><p>16:9</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>60Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Response time</strong></p></td><td  ><p>5ms</p></td></tr><tr><td class="firstcol " ><p><strong>Panel type</strong></p></td><td  ><p>IPS</p></td></tr><tr><td class="firstcol " ><p><strong>Color depth</strong></p></td><td  ><p>10-bit</p></td></tr><tr><td class="firstcol " ><p><strong>DPI</strong></p></td><td  ><p>163</p></td></tr><tr><td class="firstcol " ><p><strong>Backlight</strong></p></td><td  ><p>LED</p></td></tr><tr><td class="firstcol " ><p><strong>Inputs</strong></p></td><td  ><p>Power, 1x HDMI 2.0, 1x DisplayPort 1.4, 2x Thunderbolt 4 (90W PD), 3x USB-A (downstream, 5Gbps, 7.5W and 4.5W PD), 1x USB-C (upstream, 5Gbps)</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>24.2 x 16.9-21.5 x 9.5 inches (with stand)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>18.87lbs (with stand)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-benq-creative-pro-pd2732u-review-cheat-sheet"><span>BenQ Creative Pro PD2732U review: Cheat sheet</span></h2><ul><li><strong>What is it?</strong> A Calman Verified 27-inch 4K monitor with lots of ports</li><li><strong>Who is it for?</strong> Professional photographers, creators and editors</li><li><strong>How much does it cost? </strong>The BenQ Creative Pro PD2732U is available for <a href="https://www.bhphotovideo.com/c/product/1967588-REG/benq_pd2732u_32_4k_professional.html" target="_blank" rel="nofollow">$699</a> / <a href="https://www.amazon.co.uk/dp/B0H862B5P7" target="_blank" rel="nofollow">£649</a></li><li><strong>What do we like? </strong>The sleek design, photography-centric features, excellent color coverage and accuracy, and array of ports</li><li><strong>What don’t we like? </strong>The dim panel, and 60Hz refresh rate</li></ul><h2 class="article-body__section" id="section-benq-creative-pro-pd2732u-review-the-ups"><span>BenQ Creative Pro PD2732U review: The ups</span></h2><p>From its lovely design and wide array of ports, to its fantastic color coverage and accuracy, the BenQ Creative Pro PD2732U is a wonderful monitor for professionals.</p><h2 id="lovely-design-and-build-quality">Lovely design and build quality</h2><p>The BenQ Creative Pro PD2732U is a looker. Unlike its siblings, like the <a href="https://www.tomsguide.com/computing/monitors/benq-pd3226g-review">BenQ PD3226G</a> ($1,099) and the <a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2730s-5k-monitor-review">BenQ PD2730S</a> ($1,199) which feature gray bezels and stands, the PD2732U sports a gun metal look that is just so pleasing to the eye. The part metal construction adds to the monitor’s visual appeal — and to its structural integrity, of course.</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="aTXvubDMiHmaWyE8AR4ogF" name="BenQ_Designer_monitor_.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/aTXvubDMiHmaWyE8AR4ogF-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Thanks to that, the PD2732U feels like an extremely well-built monitor. Its IPS panel doesn’t feel overly plasticky or flimsy. Unlike the <a href="https://www.tomsguide.com/computing/monitors/alogic-edge-40-inch-5k-ultrawide-review">Alogic Edge 40-inch 5K Ultrawide</a> ($1,499), the PD2732U’s hinges don’t feel flimsy either, and the panel doesn’t move easily, even when someone shakes your desk.</p><p>I also appreciate being able to lift the monitor easily and move it around, as it weighs 18.87lbs (with stand and base). It’s a little lighter than some other productivity-focused monitors I’ve tested, like the <a href="https://www.tomsguide.com/computing/monitors/dell-pro-p34-usb-c-hub-webcam-monitor-p3426wev-review">Dell Pro P3426WEV</a> (21.96lbs, $749), and the <a href="https://www.tomsguide.com/computing/monitors/benq-ma270s-review">BenQ MA270S</a> (19.05lbs, $999).</p><p>The 27-inch screen size also means that you should be able to place another similarly-sized (or smaller) monitor next to it if you prefer a dual-monitor setup. The PD2732U measures 24.2 x 16.9-21.5 x 9.5 inches, and it didn’t take up too much space on my office desk. Overall, the PD2732U’s design, dimensions and build quality don’t give you much to complain about.</p><h2 id="plenty-of-ports">Plenty of ports</h2><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="NapNfbfgeLDAu77Fm3WekF" name="BenQ_Designer_monitor_ 8.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/NapNfbfgeLDAu77Fm3WekF-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>In addition to the stellar design and build, the BenQ Creative Pro PD2732U hosts a plethora of ports that ensure better cable management and give you plenty of room to hook up various peripherals and accessories. Around the back, you’ll find the power port (duh), an HDMI 2.0 port, a DisplayPort 1.4 port, and two Thunderbolt 4 ports with 90W of power delivery and daisy-chaining.</p><p>I used one of the Thunderbolt ports to connect my <a href="https://www.tomsguide.com/reviews/macbook-air-2022-m2">MacBook Air M2</a> to the monitor and charge my laptop at the same time. There’s Smart KVM, too, which enables you to use a single keyboard and mouse with two computers when both are hooked up to the monitor (even wirelessly) — great for those who regularly switch between macOS and Windows.</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="683JiaEyYzrykJ5L67xEMF" name="BenQ_Designer_monitor_ 7.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/683JiaEyYzrykJ5L67xEMF-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You also get a USB hub with three USB-A ports and one USB-C port. The Type-C port is an upstream one, while the Type-A ports are downstream ones (two with 7.5W PD and one with 4.5W PD). All ports have transfer speeds of up to 5Gbps. This level of connectivity is similar to what you’ll find on other BenQ monitors, like the MA270S and the PD2730S.</p><p>To help with cable management, BenQ happily includes a handy cable holder in the box. You can clip it around the PD2732U’s stand before attaching it to the base, and then bunch up your cables and run them through it. I find this very helpful, and it makes me wish all monitors came with one.</p><h2 id="photography-centric-features">Photography-centric features</h2><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="9Sv7kRevZ3r9Fdi5aTDhqE" name="BenQ_Designer_monitor_ 2.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/9Sv7kRevZ3r9Fdi5aTDhqE-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>In the past when we’ve reviewed BenQ monitors, we’ve complained about the lack of a dedicated Adobe RGB mode on the likes of the PD2730S and the PD3226G. Not anymore! Alongside other photography-centric features that I’ll get into, the BenQ Creative Pro PD2732U features an Adobe RGB mode which makes the monitor <em>actually </em>useful for photographers who print. Because the Adobe RGB gamut covers a wider range of colors used by CMYK printers versus sRGB, having a dedicated mode is crucial for ensuring color accuracy when printing, so it’s great that the PD2732U doesn’t skimp on it.</p><p>The PD2732U carries a bunch of certifications, too. It’s Calman Verified, which means that it’s been tested by the popular brand that makes display calibration software (it’s what we use to test the <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">best TVs</a>). Calman Verification basically ascertains that Calman approves of the monitor’s AQColor technology.</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="Kgav2K6M2QXGyka3zEzhVF" name="BenQ_Designer_monitor_ 5.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/Kgav2K6M2QXGyka3zEzhVF-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It’s Pantone Validated and Pantone SkinTone Validated. The latter is the creative industry-standard color definition for printing, and the latter guarantees that the monitor is capable of showing accurate human skin tones. The PD2732U features Eye Care flicker-free technology, too, which eliminates invisible screen flashing at all brightness levels to prevent eye strain. Having stared at the monitor for up to eight hours a day for nearly a week, I can confirm that I did not feel any eye fatigue or get any headaches, so this is a wonderful display for those who spend long hours editing.</p><p>The PD2732U is a great monitor for creators who are MacBook users, too, as it features M-book Mode. This eliminates differences between macOS displays and the monitor, so colors on the PD2732U appear exactly as they do on my MacBook Air M2. You also get iDevice Color Sync for accurate previews of iPhone and iPad content, and iKeyboard Control which allows you to adjust the monitor’s brightness and volume directly from your laptop’s keyboard.</p><h2 id="my-favorite-monitor-accessory-returns">My favorite monitor accessory returns</h2><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="XQF2T4NEfpvFmLyRJVWByE" name="BenQ_Designer_monitor_ 3.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/XQF2T4NEfpvFmLyRJVWByE-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When I unboxed the BenQ Creative Pro PD2732U, I was very happy to see my favorite monitor accessory make a return. The monitor comes with BenQ’s Hotkey Puck — this time in gun metal to match the display — and it’s a white circular remote with a scroll wheel and a few customizable buttons. It enables you to control the monitor without extending your arms and reaching for the buttons on the display itself.</p><p>The three customizable buttons can be remapped to gain quick access to color modes, input, app launch, and more. I love how the Hotkey Puck streamlines workflows, and it’s especially useful if you frequently switch between color spaces.</p><h2 id="wide-color-coverage-and-great-accuracy">Wide color coverage and great accuracy</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:773px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="aTXvubDMiHmaWyE8AR4ogF" name="BenQ_Designer_monitor_.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:36,l:865,cw:773,ch:435,q:80/aTXvubDMiHmaWyE8AR4ogF.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 BenQ Creative Pro PD2732U’s stellar design, connectivity options and useful Hotkey Puck would amount to nothing if the monitor didn’t boast excellent color coverage and accuracy… and it ticks both boxes. First of all, the PD2732U’s 4K IPS panel has a resolution of 3840 x 2160, and it’s beautiful to look at. Even before I conducted my lab tests, I could tell that the monitor was displaying lovely and accurate colors.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>sRGB</strong></p></th><th  ><p><strong>DCI P3</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>BenQ PD2732U</strong></p></td><td  ><p>147.1%</p></td><td  ><p>104.2%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/dell-pro-p34-usb-c-hub-webcam-monitor-p3426wev-review"><strong>Dell Pro P3426WEV</strong></a></p></td><td  ><p>122.8%</p></td><td  ><p>87%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-ma270s-review"><strong>BenQ MA270S</strong></a></p></td><td  ><p>158.7%</p></td><td  ><p>112.4%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-pd3226g-review"><strong>BenQ PD3226G</strong></a></p></td><td  ><p>147%</p></td><td  ><p>104.1%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2730s-5k-monitor-review"><strong>BenQ PD2730S</strong></a></p></td><td  ><p>104.9%</p></td><td  ><p>98.3%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/alogic-edge-40-inch-5k-ultrawide-review"><strong>Alogic Edge 40-inch 5K Ultrawide</strong></a></p></td><td  ><p>104.5%</p></td><td  ><p>99.8%</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/reviews/apple-studio-display"><strong>Apple Studio Display</strong></a></p></td><td  ><p>114.1%</p></td><td  ><p>80.8%</p></td></tr></tbody></table></div><p>And then, my lab tests confirmed it. BenQ claims that the PD2732U covers 100% of the sRGB and 99% of the DCI P3 color spaces. My lab tests showed that it covers 100% and then some across both gamuts. As you can see from the table above, the PD2732U covers 147.1% of the sRGB space and 104.2% of the wider DCI P3 gamut.</p><p>The PD2732U outperforms the pricier BenQ PD2730S and the Alogic Edge 40-inch 5K Ultrawide in the sRGB space, and easily outperforms both in the DCI P3 space, as neither cover 100% of it. Even the very expensive <a href="https://www.tomsguide.com/reviews/apple-studio-display">Apple Studio Display</a> ($1,499) can’t hold a candle to the PD2732U as its DCI P3 coverage is limited to just 80.8%.</p><p>In real-world use, when I was watching YouTube videos and editing images, I found the colors to be bright, vivid and detailed. There was plenty of detail to be found and enjoyed in the shadows, and highlights didn’t appear too sharp or peaking in 4K videos.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Delta-E</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>BenQ PD2732U</strong></p></td><td  ><p>0.11</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/dell-pro-p34-usb-c-hub-webcam-monitor-p3426wev-review"><strong>Dell Pro P3426WEV</strong></a></p></td><td  ><p>0.05</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-ma270s-review"><strong>BenQ MA270S</strong></a></p></td><td  ><p>0.09</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-pd3226g-review"><strong>BenQ PD3226G</strong></a></p></td><td  ><p>0.16</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2730s-5k-monitor-review"><strong>BenQ PD2730S</strong></a></p></td><td  ><p>0.1</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/alogic-edge-40-inch-5k-ultrawide-review"><strong>Alogic Edge 40-inch 5K Ultrawide</strong></a></p></td><td  ><p>0.08</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/reviews/apple-studio-display"><strong>Apple Studio Display</strong></a></p></td><td  ><p>0.2</p></td></tr></tbody></table></div><p>In addition to wide color coverage, the PD2732U color accuracy, measured as a Delta-E score, is outstanding, too. Delta-E is a numerical representation of how much two colors differ, and it gives you an idea of how close the color relayed on screen (i.e. the monitor) is to the color output from the source (i.e. the computer). You ideally want this score to be as close to zero as possible.</p><p>According to BenQ, the PD2732U should have a Delta-E score of less than or equal to 2 straight out of the box. In my testing, the monitor achieved a score of 0.11, upstaging the Apple Studio Display and the BenQ PD3226G (albeit narrowly). This essentially means that the monitor relays colors extremely accurately. After seeing that number, I was more confident when editing photos for various camera reviews and my <a href="https://www.instagram.com/photos.bynikita" target="_blank" rel="nofollow">photography Instagram page</a> as I knew that the colors I was seeing were as accurate as they could be.</p><h2 class="article-body__section" id="section-benq-creative-pro-pd2732u-review-the-downs"><span>BenQ Creative Pro PD2732U review: The downs</span></h2><p>The BenQ Creative Pro PD2732U isn’t perfect — it’s not the brightness monitor out there, and its refresh rate is limited to 60Hz only.</p><h2 id="not-very-bright">Not very bright</h2><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="XJxryGtXDa2yf3SHUu6q8F" name="BenQ_Designer_monitor_ 6.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/XJxryGtXDa2yf3SHUu6q8F-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of my biggest gripes with the BenQ Creative Pro PD2732U is that it isn’t a very bright display, and its poor SDR and HDR performance stick out like a sore thumb. In my lab testing, the PD2732U achieved a peak brightness of just 182.6 nits in SDR, and 184 nits in HDR (10% window size).</p><p>If you’re editing photos or videos, you shouldn’t have your monitor’s brightness turned all the way up anyway, but the extra brightness is nice to have when watching movies, playing games or browsing the internet, for instance. The PD2732U is, then, upstaged by other productivity-focused monitors, as you can see in the table below.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Peak brightness (SDR)</strong></p></th><th  ><p><strong>Peak brightness (10% window size, HDR)</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>BenQ PD2732U</strong></p></td><td  ><p>182.6</p></td><td  ><p>184</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/dell-pro-p34-usb-c-hub-webcam-monitor-p3426wev-review"><strong>Dell Pro P3426WEV</strong></a></p></td><td  ><p>284.8</p></td><td  ><p>N/A</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-ma270s-review"><strong>BenQ MA270S</strong></a></p></td><td  ><p>387.4</p></td><td  ><p>272</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-pd3226g-review"><strong>BenQ PD3226G</strong></a></p></td><td  ><p>252.4</p></td><td  ><p>267</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/benq-creative-pro-pd2730s-5k-monitor-review"><strong>BenQ PD2730S</strong></a></p></td><td  ><p>3882</p></td><td  ><p>346</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/computing/monitors/alogic-edge-40-inch-5k-ultrawide-review"><strong>Alogic Edge 40-inch 5K Ultrawide</strong></a></p></td><td  ><p>417</p></td><td  ><p>216</p></td></tr><tr><td class="firstcol " ><p><a href="https://www.tomsguide.com/reviews/apple-studio-display"><strong>Apple Studio Display</strong></a></p></td><td  ><p>518</p></td><td  ><p>N/A</p></td></tr></tbody></table></div><p>All of its siblings, like the MA270S, the PD3226G and the PD2730S, beat the PD2732U with ease when it comes to peak brightness. I will say, though, that all three monitors are pricier than the PD2732U — as are the Dell Pro P3426WEV and the Alogic Edge 40-inch 5K Ultrawide, which also outperform it.</p><p>There’s another reason why the PD2732U’s SDR performance, at least, is handicapped. Similar to the PD3226G, the PD2732U features <a href="https://www.benq.com/en-us/knowledge-center/knowledge/screen-uniformity.html" target="_blank" rel="nofollow">BenQ’s Uniformity Technology</a> which applies automatic uniformity compensation to keep the brightness at appropriate levels for editing, especially in sRGB and Display P3 modes. Basically, it’s a deliberate feature specifically designed for creators and editors. If you want a bright panel, I’d recommend any of the aforementioned monitors instead — though they will cost you more. </p><h2 id="60hz-refresh-rate-only">60Hz refresh rate only</h2><p>The BenQ Creative Pro PD2732U is a productivity-first monitor so it’s not surprising that its refresh rate tops out at 60Hz only. It’s not meant for competitive gaming or esports, and you may want to consider one of the <a href="https://www.tomsguide.com/us/best-gaming-monitors,review-3114.html">best gaming monitors</a>, like the <a href="https://www.tomsguide.com/computing/monitors/alienware-34-280hz-qd-oled-aw3426dw-review">Alienware AW3426DW</a> ($799), for those purposes.</p><p>For casual video viewing and most editing tasks, 60Hz should suffice, especially if you want the monitor’s extensive color coverage and accuracy. However, if you edit high-framerate footage (120fps or higher) and do rapid timeline scrubbing, 60Hz might not be enough. The BenQ PD3226G with its 144Hz refresh rate might suit your needs better, if that’s the case.</p><h2 class="article-body__section" id="section-benq-creative-pro-pd2732u-review-verdict"><span>BenQ Creative Pro PD2732U review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LQ6kpWLWQH5EPsfQsGBKHF" name="BenQ_Designer_monitor_ 4.JPG" alt="A BenQ Creative Pro PD2732U productivity monitor" src="https://cdn.mos.cms.futurecdn.net/LQ6kpWLWQH5EPsfQsGBKHF-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There’s a lot to love about the BenQ Creative Pro PD2732U, especially if you’re a professional photographer or editor. It’s ideal for those who care more about color accuracy and connectivity than outright brightness or a high refresh rate. Its stylish, sturdy design looks great on a desk, while the wealth of photography-centric features (including the handy Hotkey Puck) make it a practical choice for day-to-day work.</p><p>There are a couple of notable compromises, though. The low brightness holds it back for general entertainment, while 60Hz feels restrictive for high-framerate video editing. But if you’re buying a monitor primarily for photo and digital-to-print editing, the PD2732U shouldn’t give you much grief.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ This $349 gaming headset gives SteelSeries, Razer and Audeze a serious run for their money ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Stealth Pro II is the flagship gaming headset from Turtle Beach, intended to compete with the heavy hitters from Razer, SteelSeries and Audeze. The <em>crème de la crème</em> are getting pricey now, with all the manufacturers above asking several hundred dollars for their very <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a>. </p><p>The Stealth Pro II is no different, and hella pricey by objective standards, but actually comes in a little cheaper than some of its competition. It also offers excellent sound; an attractive, premium design; zero downtime battery; plus customization via a solid companion app. So could this be a fantastic balanced alternative to the main ultra-premium players?</p><p>As long as you don’t mind fairly weak ANC and a slightly tight clamp force! Find out more in my full Turtle Beach Stealth Pro II review.</p><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-cheat-sheet"><span>Turtle Beach Stealth Pro II review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A premium flagship gaming headset from Turtle Beach</li><li><strong>Who is it for? </strong>Competitive gamers and those who value sound quality</li><li><strong>What does it cost? </strong><a href="https://www.amazon.com/Turtle-Beach-Stealth-Premium-Wireless/dp/B0GN4NBD2V/" target="_blank" rel="nofollow">$349</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Stealth-Wireless-Multiplatform-Black/dp/B0GQCNJCPR" target="_blank" rel="nofollow">£299</a></li><li><strong>What do we like?</strong> The sound, mic, companion app, styling and build, base station and zero downtime battery system</li><li><strong>What don’t we like?</strong> The ANC is a little weak, and I found the headset a tad clampy</li></ul><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-specs"><span>Turtle Beach Stealth Pro II review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Turtle-Beach-Stealth-Premium-Wireless/dp/B0GN4NBD2V/" target="_blank" rel="nofollow">$349</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Stealth-Wireless-Multiplatform-Black/dp/B0GQCNJCPR" target="_blank" rel="nofollow">£299</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black, white</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PC, Xbox, PlayStation, Bluetooth devices</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wired, 3x 2.4Ghz, 1x Bluetooth</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>2x rechargeable</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong></p></td><td  ><p>40 hours combined</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>10-40,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>60mm coaxial</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>4 (3x 2.4G, 1x BT)</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Unidirectional floating boom mic</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>13.8 ounces / 393 grams</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-the-ups"><span>Turtle Beach Stealth Pro II review: The ups</span></h2><p>There’s a lot to love about the Stealth Pro II. Sound quality is excellent, there’s a useful companion app, a super clear mic, and a handy base station for ‘zero downtime’ battery life. It’s also moderately priced versus competition.</p><h2 id="excellent-sound-quality">Excellent sound quality</h2><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="HFWdi2AigrzMKFpu3MX5bc" name="Turtle Beach Stealth Pro II_test shots2" alt="The Turtle Beach Stealth Pro II with an earcup removed showing the coaxial driver" src="https://cdn.mos.cms.futurecdn.net/HFWdi2AigrzMKFpu3MX5bc-1920-80.jpg" mos="" align="middle" fullscreen="1" width="2560" height="1440" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/HFWdi2AigrzMKFpu3MX5bc-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Coaxial drivers feature a tweeter that sits in the middle/on top of a main woofer. The tweeter sits under that central circular housing, while the main woofer is the larger, fluted circle. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Turtle Beach Stealth Pro II’s biggest strength is its sound quality. It uses a coaxial driver setup, with a 60mm woofer and separate tweeter in each earcup. This, in theory, gives better clarity and more separation between higher and lower frequencies, as each driver can focus on its own job. Connectivity-wise, there’s 24-bit/96kHz high resolution data/sampling rates over 2.4G, so this is a true hi-res headset, akin to the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-pro-omni-review">SteelSeries Arctis Nova Pro Omni</a> / Elite and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-anc-review">Audeze Maxwell 2 ANC</a>.</p><p>The sound is super spacious with exceptional clarity up top and very strong imaging (this lets you pinpoint noises to a specific point). This naturally benefits competitive gameplay, letting me hear the location of enemy cues like footsteps or reloads in my test FPS games: Counter Strike 2 and Isonzo. It was also handy for stealthy games like Sniper Elite: Resistance, where I could again hear and locate even the quietest tapping of enemy footsteps. And it was ideal for immersion, giving three-dimensionality to sounds and effects in the campaign and battles of Total War: Rome II.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mXPzdXE3NLgxLtw9ZvfbHc" name="Turtle Beach Stealth Pro II_screenshots3" alt="A screenshot of the Turtle Beach Swarm II app being used to customize the Stealth Pro II" src="https://cdn.mos.cms.futurecdn.net/mXPzdXE3NLgxLtw9ZvfbHc-1920-80.jpg" mos="" align="middle" fullscreen="1" width="1600" height="900" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/mXPzdXE3NLgxLtw9ZvfbHc-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Via the Swarm II app, you have access to a preset Footsteps EQ for a competitive edge. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Turtle Beach / Future)</span></figcaption></figure><p>There’s also Dolby Atmos (DA) support, so you can benefit from that codec in games that use it for surround sound. But even without DA, the sound is impressively spatial.</p><p>Tonal separation and mid-range clarity are really excellent, too. Each of the instruments and layers of the beautiful Rome II soundtrack sounded isolated yet cohesive — the panpipes, the atmospheric flutes, the drums, the horns, all occupied their own distinct space.</p><p>And thanks to that hefty 60mm main driver, there’s plenty of bass performance, giving strong, impactful artillery explosions in Isonzo. Bass response is not quite as nicely controlled as on the Arctis Nova Pro Omni or Elite, and you don’t get anywhere near the tightness of the Maxwell 2’s low-end. I noticed a little bit of booming and muddying at times, too, but it was nothing major, and generally, I loved listening to games and music on the Stealth Pro II.</p><p><em>Listen along to my audio testing playlist on </em><a href="https://www.tomsguide.com/audio/qobuz-review"><em>Qobuz</em></a><em>, our favorite </em><a href="https://www.tomsguide.com/buying-guide/best-music-streaming-services"><em>music streaming service</em></a><em> for audiophiles.</em></p><iframe allow="" height="390" width="400" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/59666746?zone=GB-en"></iframe><h2 id="useful-companion-app">Useful companion app</h2><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="WKivUJJSayR32JEJFmsJPc" name="Turtle Beach Stealth Pro II_screenshots4" alt="A screenshot of the Turtle Beach Swarm II app being used to customize the Stealth Pro II EQ" src="https://cdn.mos.cms.futurecdn.net/WKivUJJSayR32JEJFmsJPc-1920-80.jpg" mos="" align="middle" fullscreen="1" width="1600" height="900" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/WKivUJJSayR32JEJFmsJPc-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Turtle Beach / Future)</span></figcaption></figure><p>Complementing the Stealth Pro II’s sound is an equally strong companion app, which gives you access to a full custom EQ, as well as EQ presets and a (<em>cringe</em>) “Superhuman hearing” mode — essentially some EQ presets to enhance things like footsteps.</p><p>There’s not the same enormous range of presets as on the SteelSeries GG app, with its hundreds-strong library of per-game EQs. But there’s still more than enough control in Swarm II to get the most out of your game audio.</p><p>In the app, you can also control the microphone EQ, update the headset and (my favorite aspect) change the control assignments to customize how the headset operates. So useful!</p><h2 id="multipoint-connectivity">Multipoint connectivity</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1181px;"><p class="vanilla-image-block" style="padding-top:56.31%;"><img id="phhk8xiqF6fCKSfmxYZ5vK" name="Turtlebeach_StealthPro_II_012.JPG" alt="The Turtle Beach Stealth Pro II earcup and controls" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:380,l:413,cw:1181,ch:665,q:80/phhk8xiqF6fCKSfmxYZ5vK.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 Stealth Pro II offers multipoint connectivity. You can hook up two devices over 2.4G out of the box, using the base station and included USB dongle. You can also buy more dongles (the carry case even comes with a spare dongle slot) to connect to even more, up to four devices. </p><p>If that weren’t enough, you can also connect over Bluetooth simultaneously. I found this a little annoying, though, as the headset doesn’t mute game sounds to prioritize Bluetooth if, for example, you get a call or need to take a work meeting while gaming (which, as you can imagine, happens a lot in my job). You just have both going on at once, and the sidetone dial didn't work to fix this. It’s not a huge issue, but I like that the Nova Pro Omni and Maxwell 2 prioritize Bluetooth in those scenarios.</p><h2 id="super-clear-mic">Super clear mic</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:960px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3EgUuzZLcuowP7EX98QduK" name="Turtlebeach_StealthPro_II_014.JPG" alt="The Turtle Beach Stealth Pro II next to its base station and 2.4G dongle" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:540,l:476,cw:960,ch:540,q:80/3EgUuzZLcuowP7EX98QduK.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 Stealth Pro II uses a unidirectional mic that’s “floating,” meaning it’s suspended on rubber spokes to eliminate vibration. Turtle Beach says this gives exceptional clarity, although in fairness it’s just a great mic anyway, floating or otherwise.</p><p>Headset mics, even flagship ones, usually disappoint, so I was very surprised at the cleanness and airiness of voice recordings. There was arguably a little too much clarity, as I started to pick up on some of my inherent lispy and sibilant qualities — but there’s no denying how clean and noise-free the recordings were, especially using the ‘clarity’ mic EQ. </p><p>There’s environmental noise reduction, but being a unidirectional mic, that isn’t really needed — the mic only picks up sound from your mouth anyway. I recorded test clips with my window open to a very busy and loud road. Even with noise reduction off, I couldn’t hear the road in any recordings.</p><h2 id="stealthy-grown-up-design">Stealthy, grown-up design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9im4tknZx6qrX7paMavoqK" name="Turtlebeach_StealthPro_II_011.JPG" alt="The Turtle Beach Stealth Pro II earcup showing the controls" src="https://cdn.mos.cms.futurecdn.net/9im4tknZx6qrX7paMavoqK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Turtle Beach gear is very often styled a little ‘gamer-y’ for my tastes. Even the pricey stuff is typically a bit garish for me, like the $200 <a href="https://www.tomsguide.com/computing/keyboards/turtle-beach-command-series-kb7-tkl-review">Turtle Beach Command KB7</a> we tested before this headset. So I was pleasantly surprised by how grown up the Stealth Pro II feels. The eponymous, stealthy, blacked-out look means it won’t seem out of place in any setup — whether you’re an RGB-clad unicorn puke kinda person, or an anti-RGBer like me.</p><p>I definitely prefer the look of the Stealth Pro II to the chunky Maxwell 2 ANC, and I’d say it edges the Arctis Nova Pro Omni and Elite (although there’s not much in it). For sheer prettiness, the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review">Fractal Design Scape</a> still win out for me, but naturally this is all highly subjective.</p><h2 id="premium-build-too">Premium build, too</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8eL6o2trwA4CdbAWuBoEwK" name="Turtlebeach_StealthPro_II_013.JPG" alt="The Turtle Beach Stealth Pro II soft padded earcup pads" src="https://cdn.mos.cms.futurecdn.net/8eL6o2trwA4CdbAWuBoEwK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Stealth Pro II looks and feels like a premium headset, too (as it should, given the price). The brushed metal earcup plates, gunmetal earcup carriers, matte black rubberized headband and mesh padding all scream quality. </p><p>Again, there’s very little between all the flagships here. You’ll find a touch of extra finesse and attention to detail on the Fractal Design Scape and BlackShark V3 Pro, but there’s seriously not much in it. The Maxwell 2 ANC feels as sturdy as they come, sure, but that’s mainly because it weighs a frankly preposterous 1.2lbs — it’s like comparing supercars to a dump truck. I’d say the Stealth Pro II feels a tad sturdier than the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">Arctis Nova Elite</a> / Pro Omni, though. But did I mention there isn’t much in it? </p><h2 id="handy-base-station">Handy base station</h2><p>Man, I love me a base station. The Stealth Pro II’s is perhaps rather basic versus the Arctis Nova base station, which bundles a DAC for hi-res wireless, a multipoint USB-C hub, an EQ interface, a settings menu and a battery charging dock. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ggKFe2mTDHGacW5py94Uic" name="Turtle Beach Stealth Pro II_test shots1" alt="The Turtle Beach Stealth Pro II base station with a charging battery and the status lights illuminated purple and green" src="https://cdn.mos.cms.futurecdn.net/ggKFe2mTDHGacW5py94Uic-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>But hey, the Stealth Pro II’s base station is still super handy, facilitating wireless hi-res audio and battery charging for no downtime (more on this later). I love the simplistic status lights, too. The outer light shows you the audio sample rate and/or mic mute status, while the inner light around the battery eject button displays the current charge of the docked power cell.</p><p>By contrast, the Audeze Maxwell 2 ANC and Razer BlackShark V3 Pro only come with a 2.4G dongle — and the Razer’s was particularly annoying in testing.</p><h2 id="39-zero-downtime-39-battery">'Zero-downtime' battery</h2><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="SykCfeEQLDNVpgTarrTptK" name="Turtlebeach_StealthPro_II_008.JPG" alt="The Turtle Beach Stealth Pro II battery removed next to the open earcup" src="https://cdn.mos.cms.futurecdn.net/SykCfeEQLDNVpgTarrTptK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Stealth Pro II is rated for up to 20 hours on a single charge by Turtle Beach, ANC off. This is ostensibly a little weak. The BlackShark V3 Pro is rated for up to 70 hours, while even the power-hungry Maxwell 2 ANC manages 40 hours without ANC. </p><p>However, from my testing, I think Turtle Beach is being a little conservative. After around 18 hours of use with ANC on, I still had around 65% left — partly, this is because the headset is really loud, meaning I only ran it at around 30% volume to hear everything and be comfortable. That saves juice.</p><p>Just like SteelSeries’ Arctis Nova headsets, though, the important factor is that the Stealth Pro II is a zero downtime headset. Its second battery charges in the base station as you play, meaning no meaningful downtime when gaming near the base station.</p><h2 id="competitively-priced">Competitively priced</h2><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="aSSXJHNEycTaASgCARkhvK" name="Turtlebeach_StealthPro_II_010.JPG" alt="The Turtle Beach Stealth Pro II in hand" src="https://cdn.mos.cms.futurecdn.net/aSSXJHNEycTaASgCARkhvK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It’d be remiss of me not to clarify here that the Stealth Pro II is objectively rather expensive at <a href="https://www.amazon.com/Turtle-Beach-Stealth-Premium-Wireless/dp/B0GN4NBD2V/" target="_blank" rel="nofollow">$349</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Stealth-Wireless-Multiplatform-Black/dp/B0GQCNJCPR" target="_blank" rel="nofollow">£299</a>. That said, it offers comparable performance and build quality to all its rivals, despite sitting in the middle of them all.</p><p>It’s cheaper than the $399 Arctis Nova Pro Omni and especially the $599 Elite, while offering comparatively strong sound quality. Its mic is just as good as the $449 Maxwell 2 ANC, and it’s a hell of a lot lighter and more breathable, even if it can’t match the sheer sound quality of Audeze’s planar drivers. Yet it’s cheaper than all the above.</p><p>The Stealth Pro II’s biggest foil is the $249 Razer BlackShark V3 Pro, which looks a little more premium and offers better ANC for around $100 less. But the Razer lacks the Stealth Pro II’s ‘zero downtime’ battery system and handy base station, and uses the Synapse companion software, which I like a whole lot less than Swarm II (to put it mildly).</p><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-the-downs"><span>Turtle Beach Stealth Pro II review: The downs</span></h2><p>It ain’t perfect, though. The Stealth Pro II’s biggest letdown for me was its ANC, which let through a lot of sound it shouldn’t. I also found the headset a little too clampy, although mileage may vary based on your head shape.</p><h2 id="a-little-too-clampy-for-me">A little too clampy for me</h2><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="YeKMHatYuYGg8XQZGNrEwK" name="Turtlebeach_StealthPro_II_009.JPG" alt="The Turtle Beach Stealth Pro II laying flat on a white surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/YeKMHatYuYGg8XQZGNrEwK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I'll caveat this section by saying I found the Stealth Pro II mostly very comfortable. The earcups are super thick and padded, not to mention breathable. There's a layer of foam covering the drivers so even if your ears stick out, they won't rub against the plastic driver housing. And the mesh headband padding is a marvel — it’s supportive, light, breathable and effortlessly comfy. </p><p>Unfortunately, the headset is a little too clampy for me, though. After a few hours using it, I started to feel pressure on my temples and experience headaches. In fairness, this may reduce over time as the headset flexes, and mileage will vary based on the shape of your head. I’ve got a moderately large noggin, so ye of average headsize may be just fine.</p><h2 id="disappointing-anc">Disappointing ANC</h2><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="rsmr74xACd434fhrxJgMwK" name="Turtlebeach_StealthPro_II_006.JPG" alt="The Turtle Beach Stealth Pro II earcup pads" src="https://cdn.mos.cms.futurecdn.net/rsmr74xACd434fhrxJgMwK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>My biggest grip with the Stealth Pro II is its ANC. It has it, and it works to some extent, but it’s really rather poor versus rivals. The SteelSeries Arctis Nova Pro Omni and Elite, while their ANC isn’t perfect (and certainly doesn’t live up to the claims it can drown out a helicopter), performed much better than the Stealth Pro II in the same test. The Audeze Maxwell 2 ANC, meanwhile, is in a different league, as is the Razer BlackShark V3 Pro.</p><p>The Stealth Pro II, tested in my home office with traffic outside, let through substantial amounts of traffic noise. It also let through voices, keyboard sounds, mouse clicks, and chairs moving across the floor. It’s better than no ANC, but I wouldn’t recommend buying this headset if immersive and isolating ANC is your chief priority.</p><h2 id="what-s-that-smell">What’s that… smell?</h2><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="N6ujaJ4qU4bXnjgNscN7vK" name="Turtlebeach_StealthPro_II_003.JPG" alt="The Turtle Beach Stealth Pro II in its carry case" src="https://cdn.mos.cms.futurecdn.net/N6ujaJ4qU4bXnjgNscN7vK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Here’s a weird one: I’ve never had to say this about a headset before, but my Stealth Pro II smells bad. Like really bad. Of smoke or burning or something carcinogenic. It’s as though it was QC’d in a room where someone smokes 80-a-day… for a week.</p><p>I’m not sure whether this is to do with the materials used or the manufacturing process, or both. But it’s bad enough to be noticeable when holding the headset, and even when wearing it sometimes. At times it made me feel a little nauseous.</p><p>I’ve reached out to Turtle Beach’s representative to see why this may be. They’ve confirmed it was an issue with some pre-production models, but I’ve arranged a replacement full production unit to confirm it’s a one-off. I’ll update this review accordingly.</p><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-verdict"><span>Turtle Beach Stealth Pro II review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3QuLvQvhuMrcGhzHBiY4vK" name="Turtlebeach_StealthPro_II_007.JPG" alt="The Turtle Beach Stealth Pro II against a blue background" src="https://cdn.mos.cms.futurecdn.net/3QuLvQvhuMrcGhzHBiY4vK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Stealth Pro II is a really strong flagship offering from Turtle Beach. The sound quality is impressive, as is the mic, and I love the array of super useful features, from the handy companion app to the base station and ‘zero downtime’ battery. For Xbox and PC gamers, this is a highly commendable choice.</p><p>But it’s not perfect. The ANC system isn't quite up to scratch with the best in the biz, although that’s my only major issue. I found it a little clampy, but that’s really an anatomical roll of the dice, and my headset smelled rather weird, which is likely an isolated manufacturing issue. Given this headset comes in at a cool $50 cheaper than its chief rival, the Nova Pro Omni, they’re definitely things I can forgive.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/gaming-peripherals/turtle-beach-stealth-pro-ii-review</link>
                                                                            <description>
                            <![CDATA[ The Turtle Beach Stealth Pro II is a formidable flagship headset with sound quality to rival Razer and SteelSeries. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gkTqoHMyLYWakTHQiDpMAU</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/3EgUuzZLcuowP7EX98QduK-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 04 Sep 2026 08:49:03 +0000</pubDate>                                                                                                                                <updated>Fri, 04 Sep 2026 08:49:07 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Peripherals]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Gaming]]></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-320-70.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/3EgUuzZLcuowP7EX98QduK-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Turtle Beach Stealth Pro II next to its base station and 2.4G dongle]]></media:description>                                                            <media:text><![CDATA[The Turtle Beach Stealth Pro II next to its base station and 2.4G dongle]]></media:text>
                                <media:title type="plain"><![CDATA[The Turtle Beach Stealth Pro II next to its base station and 2.4G dongle]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/3EgUuzZLcuowP7EX98QduK-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Stealth Pro II is the flagship gaming headset from Turtle Beach, intended to compete with the heavy hitters from Razer, SteelSeries and Audeze. The <em>crème de la crème</em> are getting pricey now, with all the manufacturers above asking several hundred dollars for their very <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a>. </p><p>The Stealth Pro II is no different, and hella pricey by objective standards, but actually comes in a little cheaper than some of its competition. It also offers excellent sound; an attractive, premium design; zero downtime battery; plus customization via a solid companion app. So could this be a fantastic balanced alternative to the main ultra-premium players?</p><p>As long as you don’t mind fairly weak ANC and a slightly tight clamp force! Find out more in my full Turtle Beach Stealth Pro II review.</p><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-cheat-sheet"><span>Turtle Beach Stealth Pro II review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>A premium flagship gaming headset from Turtle Beach</li><li><strong>Who is it for? </strong>Competitive gamers and those who value sound quality</li><li><strong>What does it cost? </strong><a href="https://www.amazon.com/Turtle-Beach-Stealth-Premium-Wireless/dp/B0GN4NBD2V/" target="_blank" rel="nofollow">$349</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Stealth-Wireless-Multiplatform-Black/dp/B0GQCNJCPR" target="_blank" rel="nofollow">£299</a></li><li><strong>What do we like?</strong> The sound, mic, companion app, styling and build, base station and zero downtime battery system</li><li><strong>What don’t we like?</strong> The ANC is a little weak, and I found the headset a tad clampy</li></ul><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-specs"><span>Turtle Beach Stealth Pro II review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Turtle-Beach-Stealth-Premium-Wireless/dp/B0GN4NBD2V/" target="_blank" rel="nofollow">$349</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Stealth-Wireless-Multiplatform-Black/dp/B0GQCNJCPR" target="_blank" rel="nofollow">£299</a></p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black, white</p></td></tr><tr><td class="firstcol " ><p><strong>Platforms</strong></p></td><td  ><p>PC, Xbox, PlayStation, Bluetooth devices</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wired, 3x 2.4Ghz, 1x Bluetooth</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>2x rechargeable</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong></p></td><td  ><p>40 hours combined</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>10-40,000Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Drivers</strong></p></td><td  ><p>60mm coaxial</p></td></tr><tr><td class="firstcol " ><p><strong>Multipoint connectivity</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Paired devices max</strong></p></td><td  ><p>4 (3x 2.4G, 1x BT)</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone</strong></p></td><td  ><p>Unidirectional floating boom mic</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>13.8 ounces / 393 grams</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-the-ups"><span>Turtle Beach Stealth Pro II review: The ups</span></h2><p>There’s a lot to love about the Stealth Pro II. Sound quality is excellent, there’s a useful companion app, a super clear mic, and a handy base station for ‘zero downtime’ battery life. It’s also moderately priced versus competition.</p><h2 id="excellent-sound-quality">Excellent sound quality</h2><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="HFWdi2AigrzMKFpu3MX5bc" name="Turtle Beach Stealth Pro II_test shots2" alt="The Turtle Beach Stealth Pro II with an earcup removed showing the coaxial driver" src="https://cdn.mos.cms.futurecdn.net/HFWdi2AigrzMKFpu3MX5bc-1920-80.jpg" mos="" align="middle" fullscreen="1" width="2560" height="1440" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/HFWdi2AigrzMKFpu3MX5bc-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Coaxial drivers feature a tweeter that sits in the middle/on top of a main woofer. The tweeter sits under that central circular housing, while the main woofer is the larger, fluted circle. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Turtle Beach Stealth Pro II’s biggest strength is its sound quality. It uses a coaxial driver setup, with a 60mm woofer and separate tweeter in each earcup. This, in theory, gives better clarity and more separation between higher and lower frequencies, as each driver can focus on its own job. Connectivity-wise, there’s 24-bit/96kHz high resolution data/sampling rates over 2.4G, so this is a true hi-res headset, akin to the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-pro-omni-review">SteelSeries Arctis Nova Pro Omni</a> / Elite and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/audeze-maxwell-2-anc-review">Audeze Maxwell 2 ANC</a>.</p><p>The sound is super spacious with exceptional clarity up top and very strong imaging (this lets you pinpoint noises to a specific point). This naturally benefits competitive gameplay, letting me hear the location of enemy cues like footsteps or reloads in my test FPS games: Counter Strike 2 and Isonzo. It was also handy for stealthy games like Sniper Elite: Resistance, where I could again hear and locate even the quietest tapping of enemy footsteps. And it was ideal for immersion, giving three-dimensionality to sounds and effects in the campaign and battles of Total War: Rome II.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mXPzdXE3NLgxLtw9ZvfbHc" name="Turtle Beach Stealth Pro II_screenshots3" alt="A screenshot of the Turtle Beach Swarm II app being used to customize the Stealth Pro II" src="https://cdn.mos.cms.futurecdn.net/mXPzdXE3NLgxLtw9ZvfbHc-1920-80.jpg" mos="" align="middle" fullscreen="1" width="1600" height="900" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/mXPzdXE3NLgxLtw9ZvfbHc-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Via the Swarm II app, you have access to a preset Footsteps EQ for a competitive edge. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Turtle Beach / Future)</span></figcaption></figure><p>There’s also Dolby Atmos (DA) support, so you can benefit from that codec in games that use it for surround sound. But even without DA, the sound is impressively spatial.</p><p>Tonal separation and mid-range clarity are really excellent, too. Each of the instruments and layers of the beautiful Rome II soundtrack sounded isolated yet cohesive — the panpipes, the atmospheric flutes, the drums, the horns, all occupied their own distinct space.</p><p>And thanks to that hefty 60mm main driver, there’s plenty of bass performance, giving strong, impactful artillery explosions in Isonzo. Bass response is not quite as nicely controlled as on the Arctis Nova Pro Omni or Elite, and you don’t get anywhere near the tightness of the Maxwell 2’s low-end. I noticed a little bit of booming and muddying at times, too, but it was nothing major, and generally, I loved listening to games and music on the Stealth Pro II.</p><p><em>Listen along to my audio testing playlist on </em><a href="https://www.tomsguide.com/audio/qobuz-review"><em>Qobuz</em></a><em>, our favorite </em><a href="https://www.tomsguide.com/buying-guide/best-music-streaming-services"><em>music streaming service</em></a><em> for audiophiles.</em></p><iframe allow="" height="390" width="400" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://widget.qobuz.com/playlist/59666746?zone=GB-en"></iframe><h2 id="useful-companion-app">Useful companion app</h2><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="WKivUJJSayR32JEJFmsJPc" name="Turtle Beach Stealth Pro II_screenshots4" alt="A screenshot of the Turtle Beach Swarm II app being used to customize the Stealth Pro II EQ" src="https://cdn.mos.cms.futurecdn.net/WKivUJJSayR32JEJFmsJPc-1920-80.jpg" mos="" align="middle" fullscreen="1" width="1600" height="900" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/WKivUJJSayR32JEJFmsJPc-1920-80.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Turtle Beach / Future)</span></figcaption></figure><p>Complementing the Stealth Pro II’s sound is an equally strong companion app, which gives you access to a full custom EQ, as well as EQ presets and a (<em>cringe</em>) “Superhuman hearing” mode — essentially some EQ presets to enhance things like footsteps.</p><p>There’s not the same enormous range of presets as on the SteelSeries GG app, with its hundreds-strong library of per-game EQs. But there’s still more than enough control in Swarm II to get the most out of your game audio.</p><p>In the app, you can also control the microphone EQ, update the headset and (my favorite aspect) change the control assignments to customize how the headset operates. So useful!</p><h2 id="multipoint-connectivity">Multipoint connectivity</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1181px;"><p class="vanilla-image-block" style="padding-top:56.31%;"><img id="phhk8xiqF6fCKSfmxYZ5vK" name="Turtlebeach_StealthPro_II_012.JPG" alt="The Turtle Beach Stealth Pro II earcup and controls" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:380,l:413,cw:1181,ch:665,q:80/phhk8xiqF6fCKSfmxYZ5vK.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 Stealth Pro II offers multipoint connectivity. You can hook up two devices over 2.4G out of the box, using the base station and included USB dongle. You can also buy more dongles (the carry case even comes with a spare dongle slot) to connect to even more, up to four devices. </p><p>If that weren’t enough, you can also connect over Bluetooth simultaneously. I found this a little annoying, though, as the headset doesn’t mute game sounds to prioritize Bluetooth if, for example, you get a call or need to take a work meeting while gaming (which, as you can imagine, happens a lot in my job). You just have both going on at once, and the sidetone dial didn't work to fix this. It’s not a huge issue, but I like that the Nova Pro Omni and Maxwell 2 prioritize Bluetooth in those scenarios.</p><h2 id="super-clear-mic">Super clear mic</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:960px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3EgUuzZLcuowP7EX98QduK" name="Turtlebeach_StealthPro_II_014.JPG" alt="The Turtle Beach Stealth Pro II next to its base station and 2.4G dongle" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:540,l:476,cw:960,ch:540,q:80/3EgUuzZLcuowP7EX98QduK.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 Stealth Pro II uses a unidirectional mic that’s “floating,” meaning it’s suspended on rubber spokes to eliminate vibration. Turtle Beach says this gives exceptional clarity, although in fairness it’s just a great mic anyway, floating or otherwise.</p><p>Headset mics, even flagship ones, usually disappoint, so I was very surprised at the cleanness and airiness of voice recordings. There was arguably a little too much clarity, as I started to pick up on some of my inherent lispy and sibilant qualities — but there’s no denying how clean and noise-free the recordings were, especially using the ‘clarity’ mic EQ. </p><p>There’s environmental noise reduction, but being a unidirectional mic, that isn’t really needed — the mic only picks up sound from your mouth anyway. I recorded test clips with my window open to a very busy and loud road. Even with noise reduction off, I couldn’t hear the road in any recordings.</p><h2 id="stealthy-grown-up-design">Stealthy, grown-up design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9im4tknZx6qrX7paMavoqK" name="Turtlebeach_StealthPro_II_011.JPG" alt="The Turtle Beach Stealth Pro II earcup showing the controls" src="https://cdn.mos.cms.futurecdn.net/9im4tknZx6qrX7paMavoqK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Turtle Beach gear is very often styled a little ‘gamer-y’ for my tastes. Even the pricey stuff is typically a bit garish for me, like the $200 <a href="https://www.tomsguide.com/computing/keyboards/turtle-beach-command-series-kb7-tkl-review">Turtle Beach Command KB7</a> we tested before this headset. So I was pleasantly surprised by how grown up the Stealth Pro II feels. The eponymous, stealthy, blacked-out look means it won’t seem out of place in any setup — whether you’re an RGB-clad unicorn puke kinda person, or an anti-RGBer like me.</p><p>I definitely prefer the look of the Stealth Pro II to the chunky Maxwell 2 ANC, and I’d say it edges the Arctis Nova Pro Omni and Elite (although there’s not much in it). For sheer prettiness, the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/razer-blackshark-v3-pro-review">Razer BlackShark V3 Pro</a> and <a href="https://www.tomsguide.com/gaming/gaming-peripherals/fractal-design-scape-review">Fractal Design Scape</a> still win out for me, but naturally this is all highly subjective.</p><h2 id="premium-build-too">Premium build, too</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8eL6o2trwA4CdbAWuBoEwK" name="Turtlebeach_StealthPro_II_013.JPG" alt="The Turtle Beach Stealth Pro II soft padded earcup pads" src="https://cdn.mos.cms.futurecdn.net/8eL6o2trwA4CdbAWuBoEwK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Stealth Pro II looks and feels like a premium headset, too (as it should, given the price). The brushed metal earcup plates, gunmetal earcup carriers, matte black rubberized headband and mesh padding all scream quality. </p><p>Again, there’s very little between all the flagships here. You’ll find a touch of extra finesse and attention to detail on the Fractal Design Scape and BlackShark V3 Pro, but there’s seriously not much in it. The Maxwell 2 ANC feels as sturdy as they come, sure, but that’s mainly because it weighs a frankly preposterous 1.2lbs — it’s like comparing supercars to a dump truck. I’d say the Stealth Pro II feels a tad sturdier than the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steelseries-arctis-nova-elite-review">Arctis Nova Elite</a> / Pro Omni, though. But did I mention there isn’t much in it? </p><h2 id="handy-base-station">Handy base station</h2><p>Man, I love me a base station. The Stealth Pro II’s is perhaps rather basic versus the Arctis Nova base station, which bundles a DAC for hi-res wireless, a multipoint USB-C hub, an EQ interface, a settings menu and a battery charging dock. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ggKFe2mTDHGacW5py94Uic" name="Turtle Beach Stealth Pro II_test shots1" alt="The Turtle Beach Stealth Pro II base station with a charging battery and the status lights illuminated purple and green" src="https://cdn.mos.cms.futurecdn.net/ggKFe2mTDHGacW5py94Uic-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>But hey, the Stealth Pro II’s base station is still super handy, facilitating wireless hi-res audio and battery charging for no downtime (more on this later). I love the simplistic status lights, too. The outer light shows you the audio sample rate and/or mic mute status, while the inner light around the battery eject button displays the current charge of the docked power cell.</p><p>By contrast, the Audeze Maxwell 2 ANC and Razer BlackShark V3 Pro only come with a 2.4G dongle — and the Razer’s was particularly annoying in testing.</p><h2 id="39-zero-downtime-39-battery">'Zero-downtime' battery</h2><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="SykCfeEQLDNVpgTarrTptK" name="Turtlebeach_StealthPro_II_008.JPG" alt="The Turtle Beach Stealth Pro II battery removed next to the open earcup" src="https://cdn.mos.cms.futurecdn.net/SykCfeEQLDNVpgTarrTptK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Stealth Pro II is rated for up to 20 hours on a single charge by Turtle Beach, ANC off. This is ostensibly a little weak. The BlackShark V3 Pro is rated for up to 70 hours, while even the power-hungry Maxwell 2 ANC manages 40 hours without ANC. </p><p>However, from my testing, I think Turtle Beach is being a little conservative. After around 18 hours of use with ANC on, I still had around 65% left — partly, this is because the headset is really loud, meaning I only ran it at around 30% volume to hear everything and be comfortable. That saves juice.</p><p>Just like SteelSeries’ Arctis Nova headsets, though, the important factor is that the Stealth Pro II is a zero downtime headset. Its second battery charges in the base station as you play, meaning no meaningful downtime when gaming near the base station.</p><h2 id="competitively-priced">Competitively priced</h2><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="aSSXJHNEycTaASgCARkhvK" name="Turtlebeach_StealthPro_II_010.JPG" alt="The Turtle Beach Stealth Pro II in hand" src="https://cdn.mos.cms.futurecdn.net/aSSXJHNEycTaASgCARkhvK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It’d be remiss of me not to clarify here that the Stealth Pro II is objectively rather expensive at <a href="https://www.amazon.com/Turtle-Beach-Stealth-Premium-Wireless/dp/B0GN4NBD2V/" target="_blank" rel="nofollow">$349</a> / <a href="https://www.amazon.co.uk/Turtle-Beach-Stealth-Wireless-Multiplatform-Black/dp/B0GQCNJCPR" target="_blank" rel="nofollow">£299</a>. That said, it offers comparable performance and build quality to all its rivals, despite sitting in the middle of them all.</p><p>It’s cheaper than the $399 Arctis Nova Pro Omni and especially the $599 Elite, while offering comparatively strong sound quality. Its mic is just as good as the $449 Maxwell 2 ANC, and it’s a hell of a lot lighter and more breathable, even if it can’t match the sheer sound quality of Audeze’s planar drivers. Yet it’s cheaper than all the above.</p><p>The Stealth Pro II’s biggest foil is the $249 Razer BlackShark V3 Pro, which looks a little more premium and offers better ANC for around $100 less. But the Razer lacks the Stealth Pro II’s ‘zero downtime’ battery system and handy base station, and uses the Synapse companion software, which I like a whole lot less than Swarm II (to put it mildly).</p><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-the-downs"><span>Turtle Beach Stealth Pro II review: The downs</span></h2><p>It ain’t perfect, though. The Stealth Pro II’s biggest letdown for me was its ANC, which let through a lot of sound it shouldn’t. I also found the headset a little too clampy, although mileage may vary based on your head shape.</p><h2 id="a-little-too-clampy-for-me">A little too clampy for me</h2><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="YeKMHatYuYGg8XQZGNrEwK" name="Turtlebeach_StealthPro_II_009.JPG" alt="The Turtle Beach Stealth Pro II laying flat on a white surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/YeKMHatYuYGg8XQZGNrEwK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I'll caveat this section by saying I found the Stealth Pro II mostly very comfortable. The earcups are super thick and padded, not to mention breathable. There's a layer of foam covering the drivers so even if your ears stick out, they won't rub against the plastic driver housing. And the mesh headband padding is a marvel — it’s supportive, light, breathable and effortlessly comfy. </p><p>Unfortunately, the headset is a little too clampy for me, though. After a few hours using it, I started to feel pressure on my temples and experience headaches. In fairness, this may reduce over time as the headset flexes, and mileage will vary based on the shape of your head. I’ve got a moderately large noggin, so ye of average headsize may be just fine.</p><h2 id="disappointing-anc">Disappointing ANC</h2><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="rsmr74xACd434fhrxJgMwK" name="Turtlebeach_StealthPro_II_006.JPG" alt="The Turtle Beach Stealth Pro II earcup pads" src="https://cdn.mos.cms.futurecdn.net/rsmr74xACd434fhrxJgMwK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>My biggest grip with the Stealth Pro II is its ANC. It has it, and it works to some extent, but it’s really rather poor versus rivals. The SteelSeries Arctis Nova Pro Omni and Elite, while their ANC isn’t perfect (and certainly doesn’t live up to the claims it can drown out a helicopter), performed much better than the Stealth Pro II in the same test. The Audeze Maxwell 2 ANC, meanwhile, is in a different league, as is the Razer BlackShark V3 Pro.</p><p>The Stealth Pro II, tested in my home office with traffic outside, let through substantial amounts of traffic noise. It also let through voices, keyboard sounds, mouse clicks, and chairs moving across the floor. It’s better than no ANC, but I wouldn’t recommend buying this headset if immersive and isolating ANC is your chief priority.</p><h2 id="what-s-that-smell">What’s that… smell?</h2><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="N6ujaJ4qU4bXnjgNscN7vK" name="Turtlebeach_StealthPro_II_003.JPG" alt="The Turtle Beach Stealth Pro II in its carry case" src="https://cdn.mos.cms.futurecdn.net/N6ujaJ4qU4bXnjgNscN7vK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Here’s a weird one: I’ve never had to say this about a headset before, but my Stealth Pro II smells bad. Like really bad. Of smoke or burning or something carcinogenic. It’s as though it was QC’d in a room where someone smokes 80-a-day… for a week.</p><p>I’m not sure whether this is to do with the materials used or the manufacturing process, or both. But it’s bad enough to be noticeable when holding the headset, and even when wearing it sometimes. At times it made me feel a little nauseous.</p><p>I’ve reached out to Turtle Beach’s representative to see why this may be. They’ve confirmed it was an issue with some pre-production models, but I’ve arranged a replacement full production unit to confirm it’s a one-off. I’ll update this review accordingly.</p><h2 class="article-body__section" id="section-turtle-beach-stealth-pro-ii-review-verdict"><span>Turtle Beach Stealth Pro II review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3QuLvQvhuMrcGhzHBiY4vK" name="Turtlebeach_StealthPro_II_007.JPG" alt="The Turtle Beach Stealth Pro II against a blue background" src="https://cdn.mos.cms.futurecdn.net/3QuLvQvhuMrcGhzHBiY4vK-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Stealth Pro II is a really strong flagship offering from Turtle Beach. The sound quality is impressive, as is the mic, and I love the array of super useful features, from the handy companion app to the base station and ‘zero downtime’ battery. For Xbox and PC gamers, this is a highly commendable choice.</p><p>But it’s not perfect. The ANC system isn't quite up to scratch with the best in the biz, although that’s my only major issue. I found it a little clampy, but that’s really an anatomical roll of the dice, and my headset smelled rather weird, which is likely an isolated manufacturing issue. Given this headset comes in at a cool $50 cheaper than its chief rival, the Nova Pro Omni, they’re definitely things I can forgive.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I used Dell's latest MacBook Neo rival — and I'm not complaining about having another one ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Laptops are in a pretty unique place in 2026. On one end, we have companies pushing performance to the absolute maximum, with new flagship laptops soon to be powered by chips like <a href="https://www.tomsguide.com/computing/cpus/nvidia-rtx-spark-is-here-and-no-its-not-called-n1x-everything-you-need-to-know-about-the-super-chip-thats-about-to-change-laptops-forever">Nvidia's RTX Spark</a>. On the other hand, we have brands <a href="https://www.tomsguide.com/computing/laptops/forget-the-macbook-neo-these-4-windows-laptops-are-just-as-powerful">going directly after Apple's MacBook Neo</a>, pushing prices lower while still trying to deliver as much value as possible.</p><p>Dell is jumping on the latter bandwagon at <a href="https://www.tomsguide.com/tag/ifa-2026">IFA 2026</a> with its new Dell 14S. The company already has the <a href="https://www.tomsguide.com/computing/laptops/dell-xps-13-2026-review">XPS 13</a>, which sits as its more premium <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a> competitor, but the Dell 14S is targeting a slightly different buyer. </p><p>Dell tells me this laptop will sit one tier below the XPS 13, aimed primarily at pre-college and high school students who want something sturdy and capable without spending too much money.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FDGAp6LP9cXZjezzgLZywW" name="dell-14s-2026-hands-on-3" alt="Hands-on with the Dell 14S at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/FDGAp6LP9cXZjezzgLZywW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>On first inspection, the Dell 14S feels extremely similar to the more expensive XPS 13 in the hand. You get an all-aluminum build that feels premium, and unlike some <a href="https://www.tomsguide.com/computing/laptops/acer-swift-blade-14-ifa-2026-hands-on">other thin-and-light laptops</a> I've tried here at IFA, there isn't much flex in the keyboard deck when you press down hard. The display lid doesn't feel flimsy either.</p><p>It's certainly not the lightest laptop I've used at IFA this year, but I'll happily take some extra weight when the trade-off is a machine that feels this solid.</p><p>I also really like what Dell is doing with the colors. Similar to Apple with the MacBook Neo, Dell isn't sticking with the usual dark finishes. The 14S comes in four much more playful colors: Linen (beige-silver), Dusty Rose (pink), Washed Denim (light blue), and Velvet Green. </p><p>Washed Denim (the one on the top in the image below) is easily my favorite of the bunch, although all four look much better in person than their names might suggest. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oZwTuMLEX9A8KUgyE9BCsW" name="dell-14s-2026-hands-on-5" alt="Hands-on with the Dell 14S at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/oZwTuMLEX9A8KUgyE9BCsW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>And despite being positioned below the XPS 13, Dell isn't cutting too much when it comes to performance either. The Dell 14S will be available with Intel's Core Series 3 "Wildcat Lake" processors, with options including Core 5 and Core 7 chips. </p><p>Other internal hardware includes up to 8GB of RAM and 256GB of onboard storage. Those aren't exactly flagship specifications, but they're pretty much what you'd expect given the price range Dell is targeting and with the <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">ongoing RAMageddon</a>. The port selection is also surprisingly good. You get two USB-C ports, but Dell has also included a full-sized HDMI port, something you don't even get on the more expensive XPS 13.</p><p>In terms of display options, you're getting two options. The higher-end model comes with a 2.8K panel with a 120Hz refresh rate, while the other configuration drops down to a 2K display running at 60Hz.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eByQcWo8TiB65pcmkwZzgW" name="dell-14s-2026-hands-on-4" alt="Hands-on with the Dell 14S at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/eByQcWo8TiB65pcmkwZzgW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>The biggest question right now is the price. Dell hasn't announced U.S. pricing yet, but the company tells me the 14S will sit below the XPS 13 in its lineup. Considering the XPS 13 starts at around $699, I wouldn't be surprised if the Dell 14S lands somewhere around the $599 to $649 mark.</p><p>And if Dell can actually hit that price, I think the 14S could be a very interesting <a href="https://www.tomsguide.com/computing/laptops/is-the-macbook-neo-as-good-as-a-budget-windows-laptop-here-are-our-lab-tested-results">MacBook Neo competitor</a>. There's no exact launch date for now, but Dell tells me that the 14S will launch in the U.S. sometime this fall, with pricing to be announced closer to availability.</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/laptops/forget-framework-i-just-popped-open-acers-new-modular-laptop-and-it-could-be-the-end-of-throwaway-pcs">I tore apart Acer’s £1,599 Vero 16 with my bare hands — Framework finally has a lethal rival</a></li><li><a href="https://www.tomsguide.com/computing/laptops/is-the-macbook-neo-as-good-as-a-budget-windows-laptop-here-are-our-lab-tested-results">We benchmarked the MacBook Neo vs budget Windows laptops — here's the truth</a></li><li><a href="https://www.tomsguide.com/computing/gaming-laptops/i-tested-6-rtx-spark-laptops-for-gaming-and-the-winner-completely-shocked-me">I tested 6 RTX Spark laptops for gaming — and the winner completely shocked me</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/dell-14s-hands-on-ifa-2026</link>
                                                                            <description>
                            <![CDATA[ The MacBook Neo rivals are piling up, but Dell's new 14S makes a strong case for itself. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">pGa8Yi5SKAQW7GPqq4nDuV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7RG7oWBjJ2cYQXdsTpGnAW-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 04 Sep 2026 08:30:00 +0000</pubDate>                                                                                                                                <updated>Fri, 04 Sep 2026 08:43:08 +0000</updated>
                                                                                                                                            <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                                    <dc:creator><![CDATA[ Sanuj Bhatia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/8p5BvMVA7cnu5AWkxnTjRC-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/7RG7oWBjJ2cYQXdsTpGnAW-1920-80.jpg">
                                                            <media:credit><![CDATA[Sanuj Bhatia / Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Hands-on with the Dell 14S at IFA 2026]]></media:description>                                                            <media:text><![CDATA[Hands-on with the Dell 14S at IFA 2026]]></media:text>
                                <media:title type="plain"><![CDATA[Hands-on with the Dell 14S at IFA 2026]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7RG7oWBjJ2cYQXdsTpGnAW-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Laptops are in a pretty unique place in 2026. On one end, we have companies pushing performance to the absolute maximum, with new flagship laptops soon to be powered by chips like <a href="https://www.tomsguide.com/computing/cpus/nvidia-rtx-spark-is-here-and-no-its-not-called-n1x-everything-you-need-to-know-about-the-super-chip-thats-about-to-change-laptops-forever">Nvidia's RTX Spark</a>. On the other hand, we have brands <a href="https://www.tomsguide.com/computing/laptops/forget-the-macbook-neo-these-4-windows-laptops-are-just-as-powerful">going directly after Apple's MacBook Neo</a>, pushing prices lower while still trying to deliver as much value as possible.</p><p>Dell is jumping on the latter bandwagon at <a href="https://www.tomsguide.com/tag/ifa-2026">IFA 2026</a> with its new Dell 14S. The company already has the <a href="https://www.tomsguide.com/computing/laptops/dell-xps-13-2026-review">XPS 13</a>, which sits as its more premium <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a> competitor, but the Dell 14S is targeting a slightly different buyer. </p><p>Dell tells me this laptop will sit one tier below the XPS 13, aimed primarily at pre-college and high school students who want something sturdy and capable without spending too much money.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FDGAp6LP9cXZjezzgLZywW" name="dell-14s-2026-hands-on-3" alt="Hands-on with the Dell 14S at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/FDGAp6LP9cXZjezzgLZywW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>On first inspection, the Dell 14S feels extremely similar to the more expensive XPS 13 in the hand. You get an all-aluminum build that feels premium, and unlike some <a href="https://www.tomsguide.com/computing/laptops/acer-swift-blade-14-ifa-2026-hands-on">other thin-and-light laptops</a> I've tried here at IFA, there isn't much flex in the keyboard deck when you press down hard. The display lid doesn't feel flimsy either.</p><p>It's certainly not the lightest laptop I've used at IFA this year, but I'll happily take some extra weight when the trade-off is a machine that feels this solid.</p><p>I also really like what Dell is doing with the colors. Similar to Apple with the MacBook Neo, Dell isn't sticking with the usual dark finishes. The 14S comes in four much more playful colors: Linen (beige-silver), Dusty Rose (pink), Washed Denim (light blue), and Velvet Green. </p><p>Washed Denim (the one on the top in the image below) is easily my favorite of the bunch, although all four look much better in person than their names might suggest. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oZwTuMLEX9A8KUgyE9BCsW" name="dell-14s-2026-hands-on-5" alt="Hands-on with the Dell 14S at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/oZwTuMLEX9A8KUgyE9BCsW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>And despite being positioned below the XPS 13, Dell isn't cutting too much when it comes to performance either. The Dell 14S will be available with Intel's Core Series 3 "Wildcat Lake" processors, with options including Core 5 and Core 7 chips. </p><p>Other internal hardware includes up to 8GB of RAM and 256GB of onboard storage. Those aren't exactly flagship specifications, but they're pretty much what you'd expect given the price range Dell is targeting and with the <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">ongoing RAMageddon</a>. The port selection is also surprisingly good. You get two USB-C ports, but Dell has also included a full-sized HDMI port, something you don't even get on the more expensive XPS 13.</p><p>In terms of display options, you're getting two options. The higher-end model comes with a 2.8K panel with a 120Hz refresh rate, while the other configuration drops down to a 2K display running at 60Hz.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eByQcWo8TiB65pcmkwZzgW" name="dell-14s-2026-hands-on-4" alt="Hands-on with the Dell 14S at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/eByQcWo8TiB65pcmkwZzgW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>The biggest question right now is the price. Dell hasn't announced U.S. pricing yet, but the company tells me the 14S will sit below the XPS 13 in its lineup. Considering the XPS 13 starts at around $699, I wouldn't be surprised if the Dell 14S lands somewhere around the $599 to $649 mark.</p><p>And if Dell can actually hit that price, I think the 14S could be a very interesting <a href="https://www.tomsguide.com/computing/laptops/is-the-macbook-neo-as-good-as-a-budget-windows-laptop-here-are-our-lab-tested-results">MacBook Neo competitor</a>. There's no exact launch date for now, but Dell tells me that the 14S will launch in the U.S. sometime this fall, with pricing to be announced closer to availability.</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/laptops/forget-framework-i-just-popped-open-acers-new-modular-laptop-and-it-could-be-the-end-of-throwaway-pcs">I tore apart Acer’s £1,599 Vero 16 with my bare hands — Framework finally has a lethal rival</a></li><li><a href="https://www.tomsguide.com/computing/laptops/is-the-macbook-neo-as-good-as-a-budget-windows-laptop-here-are-our-lab-tested-results">We benchmarked the MacBook Neo vs budget Windows laptops — here's the truth</a></li><li><a href="https://www.tomsguide.com/computing/gaming-laptops/i-tested-6-rtx-spark-laptops-for-gaming-and-the-winner-completely-shocked-me">I tested 6 RTX Spark laptops for gaming — and the winner completely shocked me</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ People are using custom apps and $30 gadgets to hunt for smart glasses that may be filming them—here's how ]]></title>
                                                                                                <dc:content><![CDATA[ <p>This year has seen an uptick in popularity for smart glasses—according to <a href="https://www.idc.com/promo/arvr/" target="_blank">IDC</a>, the global smart glasses market has grown year over year in Q1 2026 by 167%, reaching approximately 2.25 million units shipped in a single quarter.</p><p>That stat comes as no surprise, thanks to the growing popularity of certain models of smart glasses, such as the<a href="https://www.tomsguide.com/computing/smart-glasses/ray-ban-meta-ai-glasses-gen-1-vs-gen-2"> Ray-Ban Meta (Gen 2</a>), Meta Oakley HSTN, <a href="https://www.tomsguide.com/computing/smart-glasses/rokid-glasses-review">Rokid AI Glasses</a>, and the many, many more options.But with that surge in purchases and recognizability comes several cases of their video-filming feature being used to <a href="https://www.tomsguide.com/ai/less-pervert-y-meta-ai-glasses-will-now-stop-recording-if-you-cover-the-warning-light">violate someone’s privacy</a>.</p><p>A story from <a href="https://arstechnica.com/gadgets/2026/03/workers-report-watching-ray-ban-meta-shot-footage-of-people-using-the-bathroom/?utm_source=chatgpt.com" target="_blank">Ars Technica</a> has made the rounds regarding smart glasses being used to secretly film people in bathrooms, record someone changing in/out of their clothes and capture footage of a couple’s most intimate moments. <a href="https://futurism.com/artificial-intelligence/teen-boys-meta-glasses-harass-bully-girls-school" target="_blank">Futurism</a> even reported that young boys are getting their hands on smart glasses and using them to harass & bully the young girls in their middle & high schools. Public perception of smart glasses has reached an all-time low, especially with Meta trying to wipe away the title of “pervert glasses” for its product by <a href="https://www.cbsnews.com/news/meta-ai-glasses-privacy-security-fixes/" target="_blank">instituting safer privacy settings</a>.</p><p>Even so, people are looking for ways to avoid being filmed by people with smart glasses. And they’re finding the sort of methods that aren’t costly at all. Here’s a list of the apps and gadgets that people are using to be aware of smart glasses in their vicinity and protect themselves from being filmed by them.</p><h2 id="the-apps-and-gadgets-that-make-users-aware-of-smart-glasses-in-their-presence">The apps and gadgets that make users aware of smart glasses in their presence</h2><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="W88AFahWDV7xsaVhxXFBpe" name="smart-glasses-detector-apps" alt="smart glasses detector aps" src="https://cdn.mos.cms.futurecdn.net/W88AFahWDV7xsaVhxXFBpe-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>There are four apps I came across on the App Store: Antizuck Smart Glasses Scanner, Nearby Glasses (Original), Zuckoff and NoGlasshole: Glasses Detector. The Nearby Glasses app is also available on Android devices.</p><p>All of them have one thing in common: they’re used to make users cognizant of the presence of smart glasses in their vicinity by scanning for the Bluetooth signals they give off when powered on. Plus, these apps let users know when a recording-capable device is nearby. Smart glasses aren’t just detected by their Bluetooth activity—they can also be detected through their Wi-Fi signal and easily visible LED indicator lights on the front frame that blink or glow when the camera is recording video or taking pictures. It’s worth noting that some smart glasses modifiers are finding ways to make them harder to spot (such as disabling their LED indicators). </p><p>The <a href="https://www.zuckoff.app/" target="_blank">Zuckoff</a> app is a prime example of an app that makes the practice of steering clear of people using smart glasses to film you without consent so much easier. “Camera glasses announce themselves over Bluetooth,” the app’s official site explains. “Zuckoff listens for those announcements and tells you when Ray-Ban Meta, Oakley Meta, Snap Spectacles or similar hardware turns up nearby. It also logs every other Bluetooth device it hears along the way. No account, no server, no analytics. </p><p>The app’s site also offered an explainer as to what the app can’t do, however: “Glasses advertise loudest while powering on, pairing or leaving the case. Once paired to their owner's phone they can go quiet, so silence is not proof that nobody is recording, and a detection is not proof that anyone is. Signal strength gives a rough distance and no direction at all.”</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="cEvfvmjKRrf6NgrTRq342Q" name="shutterstock_2707083435-16x9" alt="meta smart glasses" src="https://cdn.mos.cms.futurecdn.net/cEvfvmjKRrf6NgrTRq342Q-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>There are also relatively inexpensive counter-surveillance tools sold on Amazon that people can use to detect smart glasses. Those gadgets include <a href="https://www.amazon.com/s?k=rf+signal+detector&hvadid=778076628888&hvdev=c&hvexpln=67&hvlocphy=9067609&hvnetw=g&hvocijid=14750438337803823718--&hvqmt=e&hvrand=14750438337803823718&hvtargid=kwd-305524938377&hydadcr=19108_13698155&mcid=efb3e77bb971352b875f4599f66c2f95&qid=1788380312&rnid=386442011&tag=googhydr-20&ref=sr_nr_p_36_0_0&low-price=&high-price=30" target="_blank">RF Signal Detectors</a> and <a href="https://www.amazon.com/camera-lens-detector/s?k=camera+lens+detector&qid=1788380354&rnid=386442011&ref=sr_nr_p_36_0_0&low-price=&high-price=29" target="_blank">Optical Lens Finders</a>. RF Signal Detectors measure radio frequency bursts when smart glasses stream audio or video over Wi-Fi or Bluetooth, but only trigger when smart glasses are actively transmitting data, not while they’re offline or idle. It’s worth noting that a Bluetooth scan only reveals that smart glasses are powered on and in your area—it cannot confirm whether the camera is actively recording, but at least you’ll know one’s nearby.</p><p>As for Optical Lens Finders, these devices emit flashing red LEDs—the reflection off the tiny smart glasses’ camera lens in the frame shines back through a viewfinder. Keep in mind that they require a manual line-of-sight visual sweep by the user. This <a href="https://www.evenrealities.com/blogs/buyers-guide/how-to-identify-smart-glasses?srsltid=AfmBOorudqZJg79grb8ybbMJISXdm7PgentmPjrF_xnxgh0W395aD_Kc" target="_blank">guide</a> on how to tell if someone is wearing smart glasses also includes a bunch of telltale signs that will make you more likely to spot them in public.</p><h2 id="the-takeaway-2">The takeaway</h2><p>Smart glasses certainly have beneficial uses, such as listening to hands-free media, relying on AI-powered voice assistants to handle everyday tasks, utilizing augmented reality displays for walking/cycling directions and using them as virtual monitors to watch movies in the privacy of your own home. Their filming and photo-taking capabilities are also impressive, but judging by the privacy-breaching ways they’re used nowadays, those features are untrustworthy for many. </p><p>With apps and gadgets being relied upon to go on the hunt for smart glasses, people are finding unique ways to stay out of their camera frame and keep their privacy intact.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/humanoid-robot-fights-back-after-man-pushes-it-in-store-is-the-beginning-of-the-uprising" target="_blank">Humanoid robot fights back after man pushes it in store — is this the beginning of the uprising?</a></li><li><a href="https://www.tomsguide.com/computing/smart-glasses/i-find-it-very-uncomfortable-talking-to-people-with-a-camera-and-a-light-openais-sam-altman-weighs-in-on-smart-glasses-and-privacy" target="_blank">'I find it very uncomfortable talking to people with a camera and a light': OpenAI's Sam Altman weighs in on smart glasses and privacy</a></li><li><a href="https://www.tomsguide.com/ai/ai-agents-are-now-emailing-researchers-on-their-own-and-they-want-to-talk-about-their-consciousness" target="_blank">'This isn’t a Turing test scenario — I’m not trying to convince you of anything': AI agents are now emailing researchers to talk about their consciousness</a></li></ul><div data-widget-type="comparison" data-model-name="Samsung Galaxy Z Fold 8"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/ai/people-are-using-custom-apps-and-usd30-gadgets-to-hunt-for-smart-glasses-that-may-be-filming-them-heres-how</link>
                                                                            <description>
                            <![CDATA[ With the rise of smart glasses (and the stories surrounding their worst use cases), there’s been a rise in apps and gadgets that are used to detect them. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4rUM7eyePH8pMKNiozRE73</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MmLzjG3NhnYU3u2azprpHJ-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 04 Sep 2026 05:30:00 +0000</pubDate>                                                                                                                                <updated>Fri, 04 Sep 2026 08:43:08 +0000</updated>
                                                                                                                                            <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Smart Glasses]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[VR & AR]]></category>
                                                                                                                    <dc:creator><![CDATA[ Elton Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/NVtYYXr3tEPUE67jf3HtXM-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/MmLzjG3NhnYU3u2azprpHJ-1920-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[smart glasses]]></media:description>                                                            <media:text><![CDATA[smart glasses]]></media:text>
                                <media:title type="plain"><![CDATA[smart glasses]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MmLzjG3NhnYU3u2azprpHJ-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>This year has seen an uptick in popularity for smart glasses—according to <a href="https://www.idc.com/promo/arvr/" target="_blank">IDC</a>, the global smart glasses market has grown year over year in Q1 2026 by 167%, reaching approximately 2.25 million units shipped in a single quarter.</p><p>That stat comes as no surprise, thanks to the growing popularity of certain models of smart glasses, such as the<a href="https://www.tomsguide.com/computing/smart-glasses/ray-ban-meta-ai-glasses-gen-1-vs-gen-2"> Ray-Ban Meta (Gen 2</a>), Meta Oakley HSTN, <a href="https://www.tomsguide.com/computing/smart-glasses/rokid-glasses-review">Rokid AI Glasses</a>, and the many, many more options.But with that surge in purchases and recognizability comes several cases of their video-filming feature being used to <a href="https://www.tomsguide.com/ai/less-pervert-y-meta-ai-glasses-will-now-stop-recording-if-you-cover-the-warning-light">violate someone’s privacy</a>.</p><p>A story from <a href="https://arstechnica.com/gadgets/2026/03/workers-report-watching-ray-ban-meta-shot-footage-of-people-using-the-bathroom/?utm_source=chatgpt.com" target="_blank">Ars Technica</a> has made the rounds regarding smart glasses being used to secretly film people in bathrooms, record someone changing in/out of their clothes and capture footage of a couple’s most intimate moments. <a href="https://futurism.com/artificial-intelligence/teen-boys-meta-glasses-harass-bully-girls-school" target="_blank">Futurism</a> even reported that young boys are getting their hands on smart glasses and using them to harass & bully the young girls in their middle & high schools. Public perception of smart glasses has reached an all-time low, especially with Meta trying to wipe away the title of “pervert glasses” for its product by <a href="https://www.cbsnews.com/news/meta-ai-glasses-privacy-security-fixes/" target="_blank">instituting safer privacy settings</a>.</p><p>Even so, people are looking for ways to avoid being filmed by people with smart glasses. And they’re finding the sort of methods that aren’t costly at all. Here’s a list of the apps and gadgets that people are using to be aware of smart glasses in their vicinity and protect themselves from being filmed by them.</p><h2 id="the-apps-and-gadgets-that-make-users-aware-of-smart-glasses-in-their-presence">The apps and gadgets that make users aware of smart glasses in their presence</h2><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="W88AFahWDV7xsaVhxXFBpe" name="smart-glasses-detector-apps" alt="smart glasses detector aps" src="https://cdn.mos.cms.futurecdn.net/W88AFahWDV7xsaVhxXFBpe-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>There are four apps I came across on the App Store: Antizuck Smart Glasses Scanner, Nearby Glasses (Original), Zuckoff and NoGlasshole: Glasses Detector. The Nearby Glasses app is also available on Android devices.</p><p>All of them have one thing in common: they’re used to make users cognizant of the presence of smart glasses in their vicinity by scanning for the Bluetooth signals they give off when powered on. Plus, these apps let users know when a recording-capable device is nearby. Smart glasses aren’t just detected by their Bluetooth activity—they can also be detected through their Wi-Fi signal and easily visible LED indicator lights on the front frame that blink or glow when the camera is recording video or taking pictures. It’s worth noting that some smart glasses modifiers are finding ways to make them harder to spot (such as disabling their LED indicators). </p><p>The <a href="https://www.zuckoff.app/" target="_blank">Zuckoff</a> app is a prime example of an app that makes the practice of steering clear of people using smart glasses to film you without consent so much easier. “Camera glasses announce themselves over Bluetooth,” the app’s official site explains. “Zuckoff listens for those announcements and tells you when Ray-Ban Meta, Oakley Meta, Snap Spectacles or similar hardware turns up nearby. It also logs every other Bluetooth device it hears along the way. No account, no server, no analytics. </p><p>The app’s site also offered an explainer as to what the app can’t do, however: “Glasses advertise loudest while powering on, pairing or leaving the case. Once paired to their owner's phone they can go quiet, so silence is not proof that nobody is recording, and a detection is not proof that anyone is. Signal strength gives a rough distance and no direction at all.”</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="cEvfvmjKRrf6NgrTRq342Q" name="shutterstock_2707083435-16x9" alt="meta smart glasses" src="https://cdn.mos.cms.futurecdn.net/cEvfvmjKRrf6NgrTRq342Q-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>There are also relatively inexpensive counter-surveillance tools sold on Amazon that people can use to detect smart glasses. Those gadgets include <a href="https://www.amazon.com/s?k=rf+signal+detector&hvadid=778076628888&hvdev=c&hvexpln=67&hvlocphy=9067609&hvnetw=g&hvocijid=14750438337803823718--&hvqmt=e&hvrand=14750438337803823718&hvtargid=kwd-305524938377&hydadcr=19108_13698155&mcid=efb3e77bb971352b875f4599f66c2f95&qid=1788380312&rnid=386442011&tag=googhydr-20&ref=sr_nr_p_36_0_0&low-price=&high-price=30" target="_blank">RF Signal Detectors</a> and <a href="https://www.amazon.com/camera-lens-detector/s?k=camera+lens+detector&qid=1788380354&rnid=386442011&ref=sr_nr_p_36_0_0&low-price=&high-price=29" target="_blank">Optical Lens Finders</a>. RF Signal Detectors measure radio frequency bursts when smart glasses stream audio or video over Wi-Fi or Bluetooth, but only trigger when smart glasses are actively transmitting data, not while they’re offline or idle. It’s worth noting that a Bluetooth scan only reveals that smart glasses are powered on and in your area—it cannot confirm whether the camera is actively recording, but at least you’ll know one’s nearby.</p><p>As for Optical Lens Finders, these devices emit flashing red LEDs—the reflection off the tiny smart glasses’ camera lens in the frame shines back through a viewfinder. Keep in mind that they require a manual line-of-sight visual sweep by the user. This <a href="https://www.evenrealities.com/blogs/buyers-guide/how-to-identify-smart-glasses?srsltid=AfmBOorudqZJg79grb8ybbMJISXdm7PgentmPjrF_xnxgh0W395aD_Kc" target="_blank">guide</a> on how to tell if someone is wearing smart glasses also includes a bunch of telltale signs that will make you more likely to spot them in public.</p><h2 id="the-takeaway-2">The takeaway</h2><p>Smart glasses certainly have beneficial uses, such as listening to hands-free media, relying on AI-powered voice assistants to handle everyday tasks, utilizing augmented reality displays for walking/cycling directions and using them as virtual monitors to watch movies in the privacy of your own home. Their filming and photo-taking capabilities are also impressive, but judging by the privacy-breaching ways they’re used nowadays, those features are untrustworthy for many. </p><p>With apps and gadgets being relied upon to go on the hunt for smart glasses, people are finding unique ways to stay out of their camera frame and keep their privacy intact.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/humanoid-robot-fights-back-after-man-pushes-it-in-store-is-the-beginning-of-the-uprising" target="_blank">Humanoid robot fights back after man pushes it in store — is this the beginning of the uprising?</a></li><li><a href="https://www.tomsguide.com/computing/smart-glasses/i-find-it-very-uncomfortable-talking-to-people-with-a-camera-and-a-light-openais-sam-altman-weighs-in-on-smart-glasses-and-privacy" target="_blank">'I find it very uncomfortable talking to people with a camera and a light': OpenAI's Sam Altman weighs in on smart glasses and privacy</a></li><li><a href="https://www.tomsguide.com/ai/ai-agents-are-now-emailing-researchers-on-their-own-and-they-want-to-talk-about-their-consciousness" target="_blank">'This isn’t a Turing test scenario — I’m not trying to convince you of anything': AI agents are now emailing researchers to talk about their consciousness</a></li></ul><div data-widget-type="comparison" data-model-name="Samsung Galaxy Z Fold 8"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I went hands-on with Lenovo’s RTX Spark-powered Yoga 9n 2-in-1 laptop — and it’s a creative powerhouse ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Lenovo Yoga 9n 2-in-1 wants to be the ultimate convertible laptop for creative work. Announced during <a href="https://www.tomsguide.com/tech-events/ifa-2026-what-to-expect">IFA 2026</a>, Lenovo’s upcoming 2-in-1 packs an <a href="https://www.tomsguide.com/computing/cpus/nvidia-rtx-spark-is-here-and-no-its-not-called-n1x-everything-you-need-to-know-about-the-super-chip-thats-about-to-change-laptops-forever">Nvidia RTX Spark</a> chip for demanding workflows and features dual-surface pen input for increased flexibility. The OLED display and ability to handle AI work on-device are other highlights.</p><p>I got to see the Lenovo Yoga 9n 2-in-1 at a Lenovo IFA event and left with a strong first impression. Though I wasn’t able to get a taste of what RTX Spark is capable of, I was impressed by the slender 2-in-1 design and the ability to write or sketch directly on the touchpad. If you’re an artist, this seems like a great machine to bring your creations to life.</p><p>We don't yet have pricing for it, but the Lenovo Yoga 9n 2-in-1 seems like a convertible to watch out for. Here's why you should keep it on your radar.</p><h2 id="lenovo-yoga-9n-2-in-1-hands-on-specs">Lenovo Yoga 9n 2-in-1 hands-on: Specs</h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Lenovo Yoga 9n 2-in-1</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>TBA</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>16-inch 2.8K (2880 x 1800), 30-120Hz, VRR, 16:10</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Nvidia RTX Spark (Nvidia Grace CPU with up to 20 cores)</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Nvidia Blackwell RTX GPU with up to 6144 cores</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>Up to 64GB 256-bit 9400MHz LPDDR5X</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>Up to 2TB PCIe SSD Gen 4 QLC M.2 2242</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1x HDMI 2.1, 2x USB-A, 2x USB-C, 1x 3.5mm headphone jack, 1x SD card slot</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 7, Bluetooth 5.4</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>14.17 × 9.57 × 0.69 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>4.28 pounds</p></td></tr></tbody></table></div><h2 id="lenovo-yoga-9n-2-in-1-hands-on-design-and-display">Lenovo Yoga 9n 2-in-1 hands-on: Design and display</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="euNWHbyEVvxcacAmi77yv4" name="Lenovo Yoga 9n 2-in-1--1-LIST" alt="Lenovo Yoga 9n 2-in-1" src="https://cdn.mos.cms.futurecdn.net/euNWHbyEVvxcacAmi77yv4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As its name suggests, the Lenovo Yoga 9n 2-in-1 is a convertible laptop with a 360-degree hinge that lets you switch between Laptop, Tablet, Tent, Stand, and Canvas modes. </p><p>The last mode is particularly interesting because it’s slightly angled rather than completely flat, making writing and drawing easier. Basically, the Yoga 9n can transform to suit your needs.</p><p>Measuring 14.17 × 9.57 × 0.69 inches and weighing 4.28 pounds, the Yoga 9n 2-in-1 is relatively large and bulky, which can make using it as a tablet cumbersome. </p><p>However, if you set it on a table or your lap, its weight shouldn’t be an issue. In my experience, the aluminum frame feels sturdy, and the 360 hinge makes it easy to open the laptop to your preferred mode.</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="Fy767oDoRKEisnnCeL2gGG" name="Lenovo Yoga 9n 2-in-1--8" alt="Lenovo Yoga 9n 2-in-1" src="https://cdn.mos.cms.futurecdn.net/Fy767oDoRKEisnnCeL2gGG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There are a decent number of ports here to support your peripherals. This includes an HDMI port, two USB-A ports, a pair of USB4/USB-C ports, a 3.5mm headphone jack, and a single SD card slot. I especially appreciate the inclusion of USB-A ports for legacy devices.</p><p>Since this is a 16-inch laptop, it has a spacious keyboard deck—one that even includes a full number pad. The membrane keys have a nice bounce and a short travel distance. The touchpad, or the Force Pad as Lenovo calls it, is not only large but also supports drawing with the Yoga Pen Gen 2. I wrote and doodled on it and found it smooth and responsive.</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="Qoknw6QTV9o5pJAYrjFmyM" name="Lenovo Yoga 9n 2-in-1--6" alt="Lenovo Yoga 9n 2-in-1" src="https://cdn.mos.cms.futurecdn.net/Qoknw6QTV9o5pJAYrjFmyM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I didn’t get to test the speakers, but the six-speaker Dolby Atmos audio system has two tweeters built into the rotating soundbar, keeping them front-firing in every mode. There’s also a pair of woofers to round out the audio. Lenovo says that intelligent noise suppression and spatial audio will support meetings, livestreams, presentations, and more.</p><p>The 16-inch PureSight Pro OLED display (as Lenovo calls it) promises “creator-grade color accuracy,” according to the company. To my eyes, the 2.8K resolution panel looked sharp and vivid. The 120Hz refresh rate ensures that everything from pen input and animation previews to gaming and more moves smoothly.</p><h2 id="lenovo-yoga-9n-2-in-1-hands-on-performance">Lenovo Yoga 9n 2-in-1 hands-on: Performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mybUXrsSQc96rGfcpzhXEA" name="Lenovo Yoga 9n 2-in-1--3" alt="Lenovo Yoga 9n 2-in-1" src="https://cdn.mos.cms.futurecdn.net/mybUXrsSQc96rGfcpzhXEA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I won’t be able to discuss the Yoga 9n 2-in-1’s performance until we’ve run it through our lab tests. Given how Lenovo is positioning this as a creator-focused machine and its use of Nvidia’s promising RTX Spark chip, I expect excellent overall performance.</p><p>The RTX Spark features a custom CPU, a Blackwell GPU, and unified RAM all on one chip. This allows the entire processor to share information faster than with separate, dedicated components. </p><p>Thanks to this efficiency, there’s also the promise of all-day battery life. The RTX Spark chip on the Yoga 9n will have up to 64GB of unified memory.</p><p>With the RTX Spark platform, Nvidia is working with Microsoft to shift personal computing on Windows from a passive tool to something proactive. </p><p>To that end, Nvidia’s chip can accelerate creative and AI tools such as Adobe Premiere Pro and local models like FLUX. Your mileage may vary depending on how much you rely on AI for work, but if you need to run it locally, you have that option.</p><h2 id="lenovo-yoga-9n-2-in-1-hands-on-outlook">Lenovo Yoga 9n 2-in-1 hands-on: Outlook</h2><p>The Lenovo Yoga 9n 2-in-1 promises to be a versatile convertible for creatives and a powerful OLED laptop for those of us who aren’t artistically inclined.</p><p>I’ll need more time with it before rendering judgment, but based on what I saw, this is a notebook worth keeping an eye on. Hopefully, the Lenovo Yoga 9n 2-in-1 won’t cost too much when it eventually launches.</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/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter">I tested Acer’s wild flip-and-swivel handheld — why Project DualPlay Mini is the ultimate netbook love letter</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-tested-the-real-dlss-5-forget-the-leaked-mods-its-not-an-ai-filter-this-is-nvidias-photorealistic-game-changer">I wanted to hate Nvidia’s DLSS 5 ‘AI filter’ — but the real DLSS 5 is photorealistic black magic</a></li><li><a href="https://www.tomsguide.com/computing/gaming-laptops/i-tested-6-rtx-spark-laptops-for-gaming-and-the-winner-completely-shocked-me">I tested 6 RTX Spark laptops for gaming — and the winner completely shocked me</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/lenovo-yoga-9n-2-in-1-hands-on</link>
                                                                            <description>
                            <![CDATA[ The Lenovo Yoga 9n 2-in-1 could be the ultimate convertible for creative work. Here's what we think of this upcoming Nvidia RTX Spark-powered laptop. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">VLZfgRHFToA5A6BoqAKbNS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/UmUngcSKKMio6oMkiwVLTk-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 03 Sep 2026 16:00:29 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/UmUngcSKKMio6oMkiwVLTk-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Lenovo Yoga 9n 2-in-1]]></media:description>                                                            <media:text><![CDATA[Lenovo Yoga 9n 2-in-1]]></media:text>
                                <media:title type="plain"><![CDATA[Lenovo Yoga 9n 2-in-1]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/UmUngcSKKMio6oMkiwVLTk-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Lenovo Yoga 9n 2-in-1 wants to be the ultimate convertible laptop for creative work. Announced during <a href="https://www.tomsguide.com/tech-events/ifa-2026-what-to-expect">IFA 2026</a>, Lenovo’s upcoming 2-in-1 packs an <a href="https://www.tomsguide.com/computing/cpus/nvidia-rtx-spark-is-here-and-no-its-not-called-n1x-everything-you-need-to-know-about-the-super-chip-thats-about-to-change-laptops-forever">Nvidia RTX Spark</a> chip for demanding workflows and features dual-surface pen input for increased flexibility. The OLED display and ability to handle AI work on-device are other highlights.</p><p>I got to see the Lenovo Yoga 9n 2-in-1 at a Lenovo IFA event and left with a strong first impression. Though I wasn’t able to get a taste of what RTX Spark is capable of, I was impressed by the slender 2-in-1 design and the ability to write or sketch directly on the touchpad. If you’re an artist, this seems like a great machine to bring your creations to life.</p><p>We don't yet have pricing for it, but the Lenovo Yoga 9n 2-in-1 seems like a convertible to watch out for. Here's why you should keep it on your radar.</p><h2 id="lenovo-yoga-9n-2-in-1-hands-on-specs">Lenovo Yoga 9n 2-in-1 hands-on: Specs</h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Lenovo Yoga 9n 2-in-1</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>TBA</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>16-inch 2.8K (2880 x 1800), 30-120Hz, VRR, 16:10</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Nvidia RTX Spark (Nvidia Grace CPU with up to 20 cores)</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Nvidia Blackwell RTX GPU with up to 6144 cores</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>Up to 64GB 256-bit 9400MHz LPDDR5X</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>Up to 2TB PCIe SSD Gen 4 QLC M.2 2242</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1x HDMI 2.1, 2x USB-A, 2x USB-C, 1x 3.5mm headphone jack, 1x SD card slot</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 7, Bluetooth 5.4</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>14.17 × 9.57 × 0.69 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>4.28 pounds</p></td></tr></tbody></table></div><h2 id="lenovo-yoga-9n-2-in-1-hands-on-design-and-display">Lenovo Yoga 9n 2-in-1 hands-on: Design and display</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="euNWHbyEVvxcacAmi77yv4" name="Lenovo Yoga 9n 2-in-1--1-LIST" alt="Lenovo Yoga 9n 2-in-1" src="https://cdn.mos.cms.futurecdn.net/euNWHbyEVvxcacAmi77yv4-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As its name suggests, the Lenovo Yoga 9n 2-in-1 is a convertible laptop with a 360-degree hinge that lets you switch between Laptop, Tablet, Tent, Stand, and Canvas modes. </p><p>The last mode is particularly interesting because it’s slightly angled rather than completely flat, making writing and drawing easier. Basically, the Yoga 9n can transform to suit your needs.</p><p>Measuring 14.17 × 9.57 × 0.69 inches and weighing 4.28 pounds, the Yoga 9n 2-in-1 is relatively large and bulky, which can make using it as a tablet cumbersome. </p><p>However, if you set it on a table or your lap, its weight shouldn’t be an issue. In my experience, the aluminum frame feels sturdy, and the 360 hinge makes it easy to open the laptop to your preferred mode.</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="Fy767oDoRKEisnnCeL2gGG" name="Lenovo Yoga 9n 2-in-1--8" alt="Lenovo Yoga 9n 2-in-1" src="https://cdn.mos.cms.futurecdn.net/Fy767oDoRKEisnnCeL2gGG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There are a decent number of ports here to support your peripherals. This includes an HDMI port, two USB-A ports, a pair of USB4/USB-C ports, a 3.5mm headphone jack, and a single SD card slot. I especially appreciate the inclusion of USB-A ports for legacy devices.</p><p>Since this is a 16-inch laptop, it has a spacious keyboard deck—one that even includes a full number pad. The membrane keys have a nice bounce and a short travel distance. The touchpad, or the Force Pad as Lenovo calls it, is not only large but also supports drawing with the Yoga Pen Gen 2. I wrote and doodled on it and found it smooth and responsive.</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="Qoknw6QTV9o5pJAYrjFmyM" name="Lenovo Yoga 9n 2-in-1--6" alt="Lenovo Yoga 9n 2-in-1" src="https://cdn.mos.cms.futurecdn.net/Qoknw6QTV9o5pJAYrjFmyM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I didn’t get to test the speakers, but the six-speaker Dolby Atmos audio system has two tweeters built into the rotating soundbar, keeping them front-firing in every mode. There’s also a pair of woofers to round out the audio. Lenovo says that intelligent noise suppression and spatial audio will support meetings, livestreams, presentations, and more.</p><p>The 16-inch PureSight Pro OLED display (as Lenovo calls it) promises “creator-grade color accuracy,” according to the company. To my eyes, the 2.8K resolution panel looked sharp and vivid. The 120Hz refresh rate ensures that everything from pen input and animation previews to gaming and more moves smoothly.</p><h2 id="lenovo-yoga-9n-2-in-1-hands-on-performance">Lenovo Yoga 9n 2-in-1 hands-on: Performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mybUXrsSQc96rGfcpzhXEA" name="Lenovo Yoga 9n 2-in-1--3" alt="Lenovo Yoga 9n 2-in-1" src="https://cdn.mos.cms.futurecdn.net/mybUXrsSQc96rGfcpzhXEA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I won’t be able to discuss the Yoga 9n 2-in-1’s performance until we’ve run it through our lab tests. Given how Lenovo is positioning this as a creator-focused machine and its use of Nvidia’s promising RTX Spark chip, I expect excellent overall performance.</p><p>The RTX Spark features a custom CPU, a Blackwell GPU, and unified RAM all on one chip. This allows the entire processor to share information faster than with separate, dedicated components. </p><p>Thanks to this efficiency, there’s also the promise of all-day battery life. The RTX Spark chip on the Yoga 9n will have up to 64GB of unified memory.</p><p>With the RTX Spark platform, Nvidia is working with Microsoft to shift personal computing on Windows from a passive tool to something proactive. </p><p>To that end, Nvidia’s chip can accelerate creative and AI tools such as Adobe Premiere Pro and local models like FLUX. Your mileage may vary depending on how much you rely on AI for work, but if you need to run it locally, you have that option.</p><h2 id="lenovo-yoga-9n-2-in-1-hands-on-outlook">Lenovo Yoga 9n 2-in-1 hands-on: Outlook</h2><p>The Lenovo Yoga 9n 2-in-1 promises to be a versatile convertible for creatives and a powerful OLED laptop for those of us who aren’t artistically inclined.</p><p>I’ll need more time with it before rendering judgment, but based on what I saw, this is a notebook worth keeping an eye on. Hopefully, the Lenovo Yoga 9n 2-in-1 won’t cost too much when it eventually launches.</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/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter">I tested Acer’s wild flip-and-swivel handheld — why Project DualPlay Mini is the ultimate netbook love letter</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-tested-the-real-dlss-5-forget-the-leaked-mods-its-not-an-ai-filter-this-is-nvidias-photorealistic-game-changer">I wanted to hate Nvidia’s DLSS 5 ‘AI filter’ — but the real DLSS 5 is photorealistic black magic</a></li><li><a href="https://www.tomsguide.com/computing/gaming-laptops/i-tested-6-rtx-spark-laptops-for-gaming-and-the-winner-completely-shocked-me">I tested 6 RTX Spark laptops for gaming — and the winner completely shocked me</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I went eyes-on with Lenovo’s new 27-inch 4K OLED monitor — and now I want it for work ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Lenovo ThinkVision P27UL-40 is one seriously impressive monitor. Announced during <a href="https://www.tomsguide.com/tech-events/ifa-2026-what-to-expect">IFA 2026</a>, this is Lenovo’s first 27-inch 4K InkJet Printing OLED Thunderbolt docking monitor for productivity work. It can even synchronize with Lenovo laptops to create a more unified workspace.</p><p>I briefly went hands-on (or eyes-on) with the P27UL-40 during a Lenovo IFA event, and let me tell you, it was a sight to behold. The contrast provided by the OLED panel is excellent and helps make colors truly pop out. </p><p>I’m also a fan of the slender design, which includes a stand with a cutaway for your phone. This is exactly the kind of monitor I’d want for my own work setup.</p><p>Here are my early thoughts on the Lenovo ThinkVision P27UL-40 and why it could be great for those who want a work monitor that’s a cut above the rest.</p><h2 id="lenovo-thinkvision-p27ul-40-hands-on-specs">Lenovo ThinkVision P27UL-40 hands-on: Specs</h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Lenovo ThinkVision P27UL-40</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,299</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p> 27-inches</p></td></tr><tr><td class="firstcol " ><p><strong>Resolution</strong></p></td><td  ><p> 3840 x 2160</p></td></tr><tr><td class="firstcol " ><p><strong>Aspect ratio</strong></p></td><td  ><p>16:9</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>60-120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Panel type</strong></p></td><td  ><p>OLED</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1x HDMI, 2x DisplayPort, 2x USB-C, 1x Ethernet, 1x USB-C, 2x USB-A</p></td></tr></tbody></table></div><h2 id="lenovo-thinkvision-p27ul-40-hands-on-display">Lenovo ThinkVision P27UL-40 hands-on: Display</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RVfcQbd97QhCjb6CeEP4YA" name="Lenovo ThinkVision-2" alt="Lenovo ThinkVision P27UL-40" src="https://cdn.mos.cms.futurecdn.net/RVfcQbd97QhCjb6CeEP4YA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There’s a lot of fancy tech in the ThinkVision P27UL-40, but suffice it to say that it offers excellent image quality for whatever’s on the screen.</p><p>The photos you see throughout this article don’t do the 27-inch 4K OLED panel justice, as it looks far superior in person. I actually asked Lenovo to dim the lights around the monitor, and that allowed me to see just how bright and vibrant the panel can get. </p><p>Lenovo says it will cover 99% of the DCI-P3 and 100% sRGB color spaces, and targets 500 nits of HDR brightness.</p><p>You don’t often see 27-inch 4K OLED productivity monitors, since these kind of monitors are usually gaming devices. But as someone who uses monitors for both work and play, I appreciate that Lenovo brought some of its gaming monitor tech to the ThinkVision P27UL-40. Trust me when I say that your eyes won’t be disappointed.</p><h2 id="lenovo-thinkvision-p27ul-40-hands-on-design">Lenovo ThinkVision P27UL-40 hands-on: Design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9ocrt8bvhTyhNWYseqUDbG" name="Lenovo ThinkVision-6" alt="Lenovo ThinkVision P27UL-40" src="https://cdn.mos.cms.futurecdn.net/9ocrt8bvhTyhNWYseqUDbG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The ThinkVision P27UL-40 might have a simple design at first glance, but it has some subtle features to help streamline your workspace and comfort.</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="RcVUjdjGvdzdAMy88Tgh5M" name="Lenovo ThinkVision-7" alt="Lenovo ThinkVision P27UL-40" src="https://cdn.mos.cms.futurecdn.net/RcVUjdjGvdzdAMy88Tgh5M-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The swivel connecting the monitor’s stand to the base makes it easy to twist the monitor left and right. Raising and lowering the monitor along the stand is also simple. </p><p>There’s a cutaway on the stand to tuck your cables through, which keeps your desk nice and tidy. Speaking of cutaways, there’s also another one right on the base for your phone, which is also very convenient.</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="WAaG4HySd7AoLwicsS5ryW" name="Lenovo ThinkVision-5" alt="Lenovo ThinkVision P27UL-40" src="https://cdn.mos.cms.futurecdn.net/WAaG4HySd7AoLwicsS5ryW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Thanks to the built-in Thunderbolt hub, you can connect your laptop with a single cable to transmit video, data, and power simultaneously. </p><p>If the laptop is from Lenovo, you can synchronize brightness controls and even mirror the power button. I didn’t get to test this, but it sounds like it should streamline things for those with a Lenovo laptop.</p><h2 id="lenovo-thinkvision-p27ul-40-hands-on-outlook">Lenovo ThinkVision P27UL-40 hands-on: Outlook</h2><p>I'll need some proper time with the Lenovo ThinkVision P27UL-40 before rendering a verdict, but based on my brief time, I think this could be a fantastic monitor for work, creative projects, and even gaming. </p><p>Our lab tests will also reveal if the monitor can hit those lofty color reproduction numbers that Lenovo detailed.</p><p>The Lenovo ThinkVision P27UL-40 launches in March 2027 with a price tag of $1,299. That's certainly a little steep, but given everything this monitor promises, it might be worth it. Stay tuned for more!</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter">I tested Acer’s wild flip-and-swivel handheld — why Project DualPlay Mini is the ultimate netbook love letter</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-tested-the-real-dlss-5-forget-the-leaked-mods-its-not-an-ai-filter-this-is-nvidias-photorealistic-game-changer">I wanted to hate Nvidia’s DLSS 5 ‘AI filter’ — but the real DLSS 5 is photorealistic black magic</a></li><li><a href="https://www.tomsguide.com/computing/gaming-laptops/i-tested-6-rtx-spark-laptops-for-gaming-and-the-winner-completely-shocked-me">I tested 6 RTX Spark laptops for gaming — and the winner completely shocked me</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/monitors/lenovo-thinkvision-p27ul-40-hands-on</link>
                                                                            <description>
                            <![CDATA[ The Lenovo ThinkVision P27UL-40 is an upcoming 27-inch 4K OLED monitor built for work and play. We went eyes-on with it, and here's what we think. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">nherKqWoMSUaHJDjk4PFLi</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/cTqJ5Ji9tU5gvGwTvbJy44-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 03 Sep 2026 16:00:21 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Monitors]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Computing Hardware]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/cTqJ5Ji9tU5gvGwTvbJy44-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Lenovo ThinkVision P27UL-40]]></media:description>                                                            <media:text><![CDATA[Lenovo ThinkVision P27UL-40]]></media:text>
                                <media:title type="plain"><![CDATA[Lenovo ThinkVision P27UL-40]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/cTqJ5Ji9tU5gvGwTvbJy44-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Lenovo ThinkVision P27UL-40 is one seriously impressive monitor. Announced during <a href="https://www.tomsguide.com/tech-events/ifa-2026-what-to-expect">IFA 2026</a>, this is Lenovo’s first 27-inch 4K InkJet Printing OLED Thunderbolt docking monitor for productivity work. It can even synchronize with Lenovo laptops to create a more unified workspace.</p><p>I briefly went hands-on (or eyes-on) with the P27UL-40 during a Lenovo IFA event, and let me tell you, it was a sight to behold. The contrast provided by the OLED panel is excellent and helps make colors truly pop out. </p><p>I’m also a fan of the slender design, which includes a stand with a cutaway for your phone. This is exactly the kind of monitor I’d want for my own work setup.</p><p>Here are my early thoughts on the Lenovo ThinkVision P27UL-40 and why it could be great for those who want a work monitor that’s a cut above the rest.</p><h2 id="lenovo-thinkvision-p27ul-40-hands-on-specs">Lenovo ThinkVision P27UL-40 hands-on: Specs</h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Lenovo ThinkVision P27UL-40</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,299</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p> 27-inches</p></td></tr><tr><td class="firstcol " ><p><strong>Resolution</strong></p></td><td  ><p> 3840 x 2160</p></td></tr><tr><td class="firstcol " ><p><strong>Aspect ratio</strong></p></td><td  ><p>16:9</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>60-120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Panel type</strong></p></td><td  ><p>OLED</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1x HDMI, 2x DisplayPort, 2x USB-C, 1x Ethernet, 1x USB-C, 2x USB-A</p></td></tr></tbody></table></div><h2 id="lenovo-thinkvision-p27ul-40-hands-on-display">Lenovo ThinkVision P27UL-40 hands-on: Display</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RVfcQbd97QhCjb6CeEP4YA" name="Lenovo ThinkVision-2" alt="Lenovo ThinkVision P27UL-40" src="https://cdn.mos.cms.futurecdn.net/RVfcQbd97QhCjb6CeEP4YA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There’s a lot of fancy tech in the ThinkVision P27UL-40, but suffice it to say that it offers excellent image quality for whatever’s on the screen.</p><p>The photos you see throughout this article don’t do the 27-inch 4K OLED panel justice, as it looks far superior in person. I actually asked Lenovo to dim the lights around the monitor, and that allowed me to see just how bright and vibrant the panel can get. </p><p>Lenovo says it will cover 99% of the DCI-P3 and 100% sRGB color spaces, and targets 500 nits of HDR brightness.</p><p>You don’t often see 27-inch 4K OLED productivity monitors, since these kind of monitors are usually gaming devices. But as someone who uses monitors for both work and play, I appreciate that Lenovo brought some of its gaming monitor tech to the ThinkVision P27UL-40. Trust me when I say that your eyes won’t be disappointed.</p><h2 id="lenovo-thinkvision-p27ul-40-hands-on-design">Lenovo ThinkVision P27UL-40 hands-on: Design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9ocrt8bvhTyhNWYseqUDbG" name="Lenovo ThinkVision-6" alt="Lenovo ThinkVision P27UL-40" src="https://cdn.mos.cms.futurecdn.net/9ocrt8bvhTyhNWYseqUDbG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The ThinkVision P27UL-40 might have a simple design at first glance, but it has some subtle features to help streamline your workspace and comfort.</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="RcVUjdjGvdzdAMy88Tgh5M" name="Lenovo ThinkVision-7" alt="Lenovo ThinkVision P27UL-40" src="https://cdn.mos.cms.futurecdn.net/RcVUjdjGvdzdAMy88Tgh5M-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The swivel connecting the monitor’s stand to the base makes it easy to twist the monitor left and right. Raising and lowering the monitor along the stand is also simple. </p><p>There’s a cutaway on the stand to tuck your cables through, which keeps your desk nice and tidy. Speaking of cutaways, there’s also another one right on the base for your phone, which is also very convenient.</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="WAaG4HySd7AoLwicsS5ryW" name="Lenovo ThinkVision-5" alt="Lenovo ThinkVision P27UL-40" src="https://cdn.mos.cms.futurecdn.net/WAaG4HySd7AoLwicsS5ryW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Thanks to the built-in Thunderbolt hub, you can connect your laptop with a single cable to transmit video, data, and power simultaneously. </p><p>If the laptop is from Lenovo, you can synchronize brightness controls and even mirror the power button. I didn’t get to test this, but it sounds like it should streamline things for those with a Lenovo laptop.</p><h2 id="lenovo-thinkvision-p27ul-40-hands-on-outlook">Lenovo ThinkVision P27UL-40 hands-on: Outlook</h2><p>I'll need some proper time with the Lenovo ThinkVision P27UL-40 before rendering a verdict, but based on my brief time, I think this could be a fantastic monitor for work, creative projects, and even gaming. </p><p>Our lab tests will also reveal if the monitor can hit those lofty color reproduction numbers that Lenovo detailed.</p><p>The Lenovo ThinkVision P27UL-40 launches in March 2027 with a price tag of $1,299. That's certainly a little steep, but given everything this monitor promises, it might be worth it. Stay tuned for more!</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/gaming/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter">I tested Acer’s wild flip-and-swivel handheld — why Project DualPlay Mini is the ultimate netbook love letter</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/i-tested-the-real-dlss-5-forget-the-leaked-mods-its-not-an-ai-filter-this-is-nvidias-photorealistic-game-changer">I wanted to hate Nvidia’s DLSS 5 ‘AI filter’ — but the real DLSS 5 is photorealistic black magic</a></li><li><a href="https://www.tomsguide.com/computing/gaming-laptops/i-tested-6-rtx-spark-laptops-for-gaming-and-the-winner-completely-shocked-me">I tested 6 RTX Spark laptops for gaming — and the winner completely shocked me</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I went hands-on with the Lenovo IdeaPad Vibe — and this colorful MacBook Neo rival has way more ports ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a> had better watch out, because the Lenovo IdeaPad Vibe is coming. Starting at $699, this laptop comes in multiple colors and is designed for folks who want a reliable everyday notebook at a reasonable price. Lenovo also says the Vibe won’t skimp on performance or battery life.</p><p>I briefly went hands-on with the IdeaPad Vibe at a Lenovo IFA event and was impressed by what I saw. Not only is it colorful, but it also feels good to hold thanks to its sturdy yet lightweight design. It’s the kind of laptop I’d like to take on the road since it has such a thin and light profile. The promise of configurations with AMD, Snapdragon X, and eventually Intel CPUs is also exciting.</p><p>Here’s what I think of the Lenovo IdeaPad Vibe.</p><h2 id="lenovo-ideapad-vibe-specs">Lenovo IdeaPad Vibe: Specs</h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Lenovo IdeaPad Vibe (14- and 15-inch with AMD)</strong></p></td><td  ><p><strong>Lenovo IdeaPad Vibe (14- and 15-inch with Qualcomm)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price (starting)</strong></p></td><td  ><p>$699</p></td><td  ><p>$699</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>WUXGA (1920 x 1200) OLED / 2.1K OLED, touch</p></td><td  ><p>2.1K OLED, touch</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>AMD Ryzen AI 400 Series </p></td><td  ><p>Snapdragon X </p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>UMA: Integrated Graphics </p></td><td  ><p>UMA: Integrated Graphics </p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>Up to 32GB</p></td><td  ><p>Up to 24GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>Up to 1TB</p></td><td  ><p>Up to 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>2x USB 3.2 Type-A (Gen 1 5GB/s), 1x HDMI 1.4, 2x USB-C PD 1.2 (Display Port) PD 3.0 (Power Delivery) 5GB/s, 1x headphone jack, 1x Micro SD card slot</p></td><td  ><p>2x USB 3.2 Type-A (Gen 1 5GB/s), 1x HDMI 1.4, 2x USB-C PD 1.2 (Display Port) PD 3.0 (Power Delivery) 5GB/s, 1x headphone jack, 1x Micro SD card slot</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Dreamy Violet, Spicy Gold, Zen Green, Chill Blue, Radiant Coral, Moody Blue, Lowkey Green</p></td><td  ><p>Dreamy Violet, Spicy Gold, Zen Green, Chill Blue, Radiant Coral, Moody Blue, Lowkey Green</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>WiFi 7 and Bluetooth 5.4</p></td><td  ><p>WiFi 7 and Bluetooth 5.4</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>12.35 × 87.59 × 0.59</p></td><td  ><p>12.35 × 87.59 × 0.59 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>3.31 pounds</p></td><td  ><p>3.31 pounds</p></td></tr></tbody></table></div><h2 id="lenovo-ideapad-vibe-price-and-availability">Lenovo IdeaPad Vibe: Price and availability</h2><p>You won’t have to wait long for the Lenovo IdeaPad Vibe to arrive.</p><p>14- and 15-inch models with AMD start shipping in October with an expected starting price of $699. Models with Qualcomm Snapdragon X begin shipping in November with the same expected $699 starting price. Models with Intel chips will be available at a later date.</p><p>Given IdeaPad Vibe’s expected $699 price and holiday launch window, it’s clear Lenovo is positioning its laptop as a MacBook Neo and <a href="https://www.tomsguide.com/computing/laptops/dell-xps-13-2026-review">Dell XPS 13</a> competitor.</p><h2 id="lenovo-ideapad-vibe-design-amp-display">Lenovo IdeaPad Vibe: Design & display</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jmKkTtb7n6uruQQEk7qFBJ" name="Lenovo IdeaPad Vibe-8" alt="Lenovo IdeaPad Vibe" src="https://cdn.mos.cms.futurecdn.net/jmKkTtb7n6uruQQEk7qFBJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you want a colorful laptop, the IdeaPad Vibe has you covered. Lenovo partnered with the Pantone Institute to create a range of color options for its affordable laptop. </p><p>The available colors include Dreamy Violet, Spicy Gold, Zen Green, Chill Blue, Radiant Coral, Moody Blue, and Lowkey Green. These naturalistic colors won’t seem out of place wherever you’re using the Vibe.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iVZMJurVViLGvuBUveXLbA" name="Lenovo IdeaPad Vibe-5" alt="Lenovo IdeaPad Vibe" src="https://cdn.mos.cms.futurecdn.net/iVZMJurVViLGvuBUveXLbA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The IdeaPad Vibe’s metal chassis complements the colors well and gives it a premium feel. As with the new Dell XPS 13, it’s nice to see budget-friendly Windows laptops that aren’t made of cheap plastic. The 14-inch model measures 12.35 × 87.59 × 0.59 inches and weighs 2.87 pounds, making it extremely portable and unobtrusive.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nVH7gu55ahHYmGATE6vLNJ" name="Lenovo IdeaPad Vibe-2" alt="Lenovo IdeaPad Vibe" src="https://cdn.mos.cms.futurecdn.net/nVH7gu55ahHYmGATE6vLNJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Unlike many thin and light laptops, the IdeaPad Vibe has a wide array of ports. On the right side, you’ll find a pair of USB-A ports, while on the left, there’s an HDMI port, two USB-C ports, a headphone jack, and a MicroSD card reader. Port-wise, Lenovo’s laptop beats the XPS 13 and MacBook Neo.</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="AktksiEGgeGcoWf2Cdo3Mi" name="Lenovo IdeaPad Vibe-1" alt="Lenovo IdeaPad Vibe" src="https://cdn.mos.cms.futurecdn.net/AktksiEGgeGcoWf2Cdo3Mi-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The 14-inch model will have up to a 1920 x 1200-pixel OLED panel, while the 15-inch variant will sport up to a 2.1K OLED panel, with the latter offering a touch option. We’ll need to get the laptop into our testing lab to see what its display can do, but Lenovo says it’s rated for 100% DCI-P3 coverage. To my eyes, the display appeared sufficiently bright and colorful.</p><h2 id="lenovo-ideapad-vibe-performance-amp-battery-life">Lenovo IdeaPad Vibe: Performance & battery life</h2><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="ihzkWPKHhTavpoAMxUiKR3" name="Lenovo IdeaPad Vibe-4" alt="Lenovo IdeaPad Vibe" src="https://cdn.mos.cms.futurecdn.net/ihzkWPKHhTavpoAMxUiKR3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Based on its components, the IdeaPad Vibe should be sufficiently powerful for everyday work. And since this is a <a href="https://www.tomsguide.com/computing/laptops/copilot-pcs-make-windows-fun-again-ive-been-waiting-for-this-moment-for-23-years">Copilot+ PC</a>, expect it to handle some on-device AI workloads as well.</p><p>Configurations with AMD Ryzen AI will launch first, followed by Snapdragon X models in November and Intel variants at a later date. You’ll be able to configure the laptop with up to 32GB of RAM for AMD models and up to 24GB for Snapdragon X. Both can be configured with up to 1TB of storage. Interestingly enough, both RAM and SSD are upgradeable.</p><p>All machines in the Idea line will include Lenovo Qira, the company’s personal AI experience that provides contextual assistance across supported PCs, mobile devices, tablets, and even wearables. This feature wasn’t available for testing during my briefing, so I’m curious to see whether it provides useful assistance or becomes another feature you forget exists.</p><p>Lenovo says the IdeaPad Vibe has “all-day” battery life. Given that laptops we’ve tested with Snapdragon X and AMD Ryzen AI can last anywhere from 10 to 20 hours, I’m eager to see how long these laptops will last in real-world use.</p><h2 id="lenovo-ideapad-vibe-outlook">Lenovo IdeaPad Vibe: Outlook</h2><p>The Lenovo IdeaPad Vibe seems like a serious MacBook Neo rival, thanks to its array of colors, budget-friendly starting price, and the promise of all-day battery life and solid everyday performance. And if Lenovo Qira delivers helpful on-device AI, this could make the Vibe even more appealing.</p><p>The MacBook Neo was a warning shot, and it's good to see companies like Lenovo respond with their own affordable laptop that promises a similarly premium design, vivid display, and strong performance. We'll have to wait and see, but right now, I'm pretty excited about the IdeaPad Vibe.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong>I tested Acer’s wild flip-and-swivel handheld — why Project DualPlay Mini is the ultimate netbook love letter</strong></li><li><strong>I wanted to hate Nvidia’s DLSS 5 ‘AI filter’ — but the real DLSS 5 is photorealistic black magic</strong></li><li><strong>I tested 6 RTX Spark laptops for gaming — and the winner completely shocked me</strong></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/lenovo-ideapad-vibe-hands-on</link>
                                                                            <description>
                            <![CDATA[ We went hands-on with the upcoming Lenovo IdeaPad Vibe, and it could be the next major MacBook Neo rival. Here's what we think of this colorful laptop. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">yvrL7cRgM8cwNUfsXW3zV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/rztUptRiRnmAkDN2uA7TaB-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 03 Sep 2026 16:00:13 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/rztUptRiRnmAkDN2uA7TaB-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Lenovo IdeaPad Vibe]]></media:description>                                                            <media:text><![CDATA[Lenovo IdeaPad Vibe]]></media:text>
                                <media:title type="plain"><![CDATA[Lenovo IdeaPad Vibe]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/rztUptRiRnmAkDN2uA7TaB-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a> had better watch out, because the Lenovo IdeaPad Vibe is coming. Starting at $699, this laptop comes in multiple colors and is designed for folks who want a reliable everyday notebook at a reasonable price. Lenovo also says the Vibe won’t skimp on performance or battery life.</p><p>I briefly went hands-on with the IdeaPad Vibe at a Lenovo IFA event and was impressed by what I saw. Not only is it colorful, but it also feels good to hold thanks to its sturdy yet lightweight design. It’s the kind of laptop I’d like to take on the road since it has such a thin and light profile. The promise of configurations with AMD, Snapdragon X, and eventually Intel CPUs is also exciting.</p><p>Here’s what I think of the Lenovo IdeaPad Vibe.</p><h2 id="lenovo-ideapad-vibe-specs">Lenovo IdeaPad Vibe: Specs</h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Lenovo IdeaPad Vibe (14- and 15-inch with AMD)</strong></p></td><td  ><p><strong>Lenovo IdeaPad Vibe (14- and 15-inch with Qualcomm)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price (starting)</strong></p></td><td  ><p>$699</p></td><td  ><p>$699</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>WUXGA (1920 x 1200) OLED / 2.1K OLED, touch</p></td><td  ><p>2.1K OLED, touch</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>AMD Ryzen AI 400 Series </p></td><td  ><p>Snapdragon X </p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>UMA: Integrated Graphics </p></td><td  ><p>UMA: Integrated Graphics </p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>Up to 32GB</p></td><td  ><p>Up to 24GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>Up to 1TB</p></td><td  ><p>Up to 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>2x USB 3.2 Type-A (Gen 1 5GB/s), 1x HDMI 1.4, 2x USB-C PD 1.2 (Display Port) PD 3.0 (Power Delivery) 5GB/s, 1x headphone jack, 1x Micro SD card slot</p></td><td  ><p>2x USB 3.2 Type-A (Gen 1 5GB/s), 1x HDMI 1.4, 2x USB-C PD 1.2 (Display Port) PD 3.0 (Power Delivery) 5GB/s, 1x headphone jack, 1x Micro SD card slot</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Dreamy Violet, Spicy Gold, Zen Green, Chill Blue, Radiant Coral, Moody Blue, Lowkey Green</p></td><td  ><p>Dreamy Violet, Spicy Gold, Zen Green, Chill Blue, Radiant Coral, Moody Blue, Lowkey Green</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>WiFi 7 and Bluetooth 5.4</p></td><td  ><p>WiFi 7 and Bluetooth 5.4</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>12.35 × 87.59 × 0.59</p></td><td  ><p>12.35 × 87.59 × 0.59 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>3.31 pounds</p></td><td  ><p>3.31 pounds</p></td></tr></tbody></table></div><h2 id="lenovo-ideapad-vibe-price-and-availability">Lenovo IdeaPad Vibe: Price and availability</h2><p>You won’t have to wait long for the Lenovo IdeaPad Vibe to arrive.</p><p>14- and 15-inch models with AMD start shipping in October with an expected starting price of $699. Models with Qualcomm Snapdragon X begin shipping in November with the same expected $699 starting price. Models with Intel chips will be available at a later date.</p><p>Given IdeaPad Vibe’s expected $699 price and holiday launch window, it’s clear Lenovo is positioning its laptop as a MacBook Neo and <a href="https://www.tomsguide.com/computing/laptops/dell-xps-13-2026-review">Dell XPS 13</a> competitor.</p><h2 id="lenovo-ideapad-vibe-design-amp-display">Lenovo IdeaPad Vibe: Design & display</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jmKkTtb7n6uruQQEk7qFBJ" name="Lenovo IdeaPad Vibe-8" alt="Lenovo IdeaPad Vibe" src="https://cdn.mos.cms.futurecdn.net/jmKkTtb7n6uruQQEk7qFBJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you want a colorful laptop, the IdeaPad Vibe has you covered. Lenovo partnered with the Pantone Institute to create a range of color options for its affordable laptop. </p><p>The available colors include Dreamy Violet, Spicy Gold, Zen Green, Chill Blue, Radiant Coral, Moody Blue, and Lowkey Green. These naturalistic colors won’t seem out of place wherever you’re using the Vibe.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iVZMJurVViLGvuBUveXLbA" name="Lenovo IdeaPad Vibe-5" alt="Lenovo IdeaPad Vibe" src="https://cdn.mos.cms.futurecdn.net/iVZMJurVViLGvuBUveXLbA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The IdeaPad Vibe’s metal chassis complements the colors well and gives it a premium feel. As with the new Dell XPS 13, it’s nice to see budget-friendly Windows laptops that aren’t made of cheap plastic. The 14-inch model measures 12.35 × 87.59 × 0.59 inches and weighs 2.87 pounds, making it extremely portable and unobtrusive.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nVH7gu55ahHYmGATE6vLNJ" name="Lenovo IdeaPad Vibe-2" alt="Lenovo IdeaPad Vibe" src="https://cdn.mos.cms.futurecdn.net/nVH7gu55ahHYmGATE6vLNJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Unlike many thin and light laptops, the IdeaPad Vibe has a wide array of ports. On the right side, you’ll find a pair of USB-A ports, while on the left, there’s an HDMI port, two USB-C ports, a headphone jack, and a MicroSD card reader. Port-wise, Lenovo’s laptop beats the XPS 13 and MacBook Neo.</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="AktksiEGgeGcoWf2Cdo3Mi" name="Lenovo IdeaPad Vibe-1" alt="Lenovo IdeaPad Vibe" src="https://cdn.mos.cms.futurecdn.net/AktksiEGgeGcoWf2Cdo3Mi-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The 14-inch model will have up to a 1920 x 1200-pixel OLED panel, while the 15-inch variant will sport up to a 2.1K OLED panel, with the latter offering a touch option. We’ll need to get the laptop into our testing lab to see what its display can do, but Lenovo says it’s rated for 100% DCI-P3 coverage. To my eyes, the display appeared sufficiently bright and colorful.</p><h2 id="lenovo-ideapad-vibe-performance-amp-battery-life">Lenovo IdeaPad Vibe: Performance & battery life</h2><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="ihzkWPKHhTavpoAMxUiKR3" name="Lenovo IdeaPad Vibe-4" alt="Lenovo IdeaPad Vibe" src="https://cdn.mos.cms.futurecdn.net/ihzkWPKHhTavpoAMxUiKR3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Based on its components, the IdeaPad Vibe should be sufficiently powerful for everyday work. And since this is a <a href="https://www.tomsguide.com/computing/laptops/copilot-pcs-make-windows-fun-again-ive-been-waiting-for-this-moment-for-23-years">Copilot+ PC</a>, expect it to handle some on-device AI workloads as well.</p><p>Configurations with AMD Ryzen AI will launch first, followed by Snapdragon X models in November and Intel variants at a later date. You’ll be able to configure the laptop with up to 32GB of RAM for AMD models and up to 24GB for Snapdragon X. Both can be configured with up to 1TB of storage. Interestingly enough, both RAM and SSD are upgradeable.</p><p>All machines in the Idea line will include Lenovo Qira, the company’s personal AI experience that provides contextual assistance across supported PCs, mobile devices, tablets, and even wearables. This feature wasn’t available for testing during my briefing, so I’m curious to see whether it provides useful assistance or becomes another feature you forget exists.</p><p>Lenovo says the IdeaPad Vibe has “all-day” battery life. Given that laptops we’ve tested with Snapdragon X and AMD Ryzen AI can last anywhere from 10 to 20 hours, I’m eager to see how long these laptops will last in real-world use.</p><h2 id="lenovo-ideapad-vibe-outlook">Lenovo IdeaPad Vibe: Outlook</h2><p>The Lenovo IdeaPad Vibe seems like a serious MacBook Neo rival, thanks to its array of colors, budget-friendly starting price, and the promise of all-day battery life and solid everyday performance. And if Lenovo Qira delivers helpful on-device AI, this could make the Vibe even more appealing.</p><p>The MacBook Neo was a warning shot, and it's good to see companies like Lenovo respond with their own affordable laptop that promises a similarly premium design, vivid display, and strong performance. We'll have to wait and see, but right now, I'm pretty excited about the IdeaPad Vibe.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong>I tested Acer’s wild flip-and-swivel handheld — why Project DualPlay Mini is the ultimate netbook love letter</strong></li><li><strong>I wanted to hate Nvidia’s DLSS 5 ‘AI filter’ — but the real DLSS 5 is photorealistic black magic</strong></li><li><strong>I tested 6 RTX Spark laptops for gaming — and the winner completely shocked me</strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I held Lenovo’s Project AeroBlade laptop and it’s giving me serious (yet more powerful) MacBook Air vibes ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I still remember watching Steve Jobs pull the first-ever MacBook Air out of a manila envelope like it was yesterday. In the years since, the <a href="https://www.tomsguide.com/computing/laptops/best-laptops">best laptops </a>have gotten even thinner and lighter. But when I first held Lenovo’s new Project AeroBlade concept laptop at <a href="https://www.tomsguide.com/tag/ifa-2026">IFA 2026</a>, I felt just like I imagined Jobs did with the original MacBook Air.</p><p>At just under 830 grams (1.83 pounds), this is a seriously light 14-inch laptop. What’s more, it’s also incredibly thin at just under 10mm thick to boot. The most surprising thing, though, is the new, completely fanless cooling solution Lenovo implemented under the hood, with help from Frore Systems.</p><p>Now keep in mind, this is just a concept device that isn’t being mass-produced yet. However, if Lenovo’s past concepts that turned into real products are any indication, we could soon see a wave of incredibly thin and light ThinkBooks and even ThinkPads that can finally rival Apple’s MacBook Air.</p><p>Here’s everything you need to know about Lenovo’s Project AeroBlade and why I could easily see it being my go-to laptop for both work and travel.</p><h2 id="from-thinkbook-to-thinbook">From ThinkBook to ThinBook</h2><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="Uv2pCAKXPkm9i7ivsyA8jK" name="Lenovo Project AeroBlade-3" alt="A person holding Lenovo's Project AeroBlade concept laptop in hand with the lid closed" src="https://cdn.mos.cms.futurecdn.net/Uv2pCAKXPkm9i7ivsyA8jK-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>With Project AeroBlade closed, it’s clear we’re dealing with something completely different than your standard ThinkBook. In fact, while the front edge tapers down to being almost pencil-thin, you can see that Lenovo had to make the back of the device larger just to house its ports. Speaking of which, there are two USB-C ports on the back left.</p><p>To get Project AeroBlade this thin, Lenovo had to completely redesign its cooling. Instead of traditional fan-based cooling, the device uses a solid-state active cooling architecture developed by Frore Systems called AirJet, which uses ultrasonic vibrations to dissipate heat.</p><p>What makes this new cooling solution stand out is that, with it under the hood, Lenovo didn’t have to sacrifice sustained performance to make this laptop extremely thin. Other benefits include reduced noise, dust intake, and mechanical complexity. The last of which is one reason I think we might see Project AeroBlade’s tech find its way into a laptop you can actually buy sooner than you would with other concepts.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YSpnvmP54MufxKBVEP4i6P" name="Lenovo Project AeroBlade-2" alt="The right ports on the Lenovo Project AeroBlade concept laptop" src="https://cdn.mos.cms.futurecdn.net/YSpnvmP54MufxKBVEP4i6P-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>On the right side, you get another USB-C port, plus a power button that looks like it has an integrated fingerprint sensor and a toggle switch. At first, I couldn’t figure out what that toggle was for, but after Lenovo’s IFA 2026 keynote, I went hands-on with Project AeroBlade a second time.</p><p>Lenovo often includes <a href="https://www.tomsguide.com/computing/laptops/lenovo-ideapad-slim-5x-gen-11-review">privacy shutters</a> on its webcams and for good reason. However, this concept device is too thin for one, so instead of putting it next to the webcam, it’s on the side. Given how easy it is to smudge your laptop’s screen or push it back when toggling the privacy filter on or off, I actually prefer having it on the side.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kVDUcgkE2v3ryB9cCNx53T" name="Lenovo Project AeroBlade-4" alt="The keyboard and trackpad on the Lenovo Project AeroBlade concept laptop" src="https://cdn.mos.cms.futurecdn.net/kVDUcgkE2v3ryB9cCNx53T-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Despite its incredibly thin design, you get the same sturdy keyboard with excellent travel that Lenovo’s known for, along with a large trackpad. Surprisingly, the ThinkBook logo is stamped on the bottom right corner of Project AeroBlade.</p><p>While Lenovo’s ThinkPads — like the <a href="https://www.tomsguide.com/computing/laptops/lenovo-thinkpad-x1-carbon-gen-13-aura-edition-full-review">X1 Carbon</a> — are known for being very thin and light, its ThinkBooks are more affordable and practical workhorses. This could signal a brand new direction for the line, or we could see Project AeroBlade’s tech make its way into a ThinkPad first; only time will tell.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DNMCW8U9gfcXmYS9VTfW7W" name="Lenovo Project AeroBlade" alt="The underside of the Lenovo Project AeroBlade concept laptop" src="https://cdn.mos.cms.futurecdn.net/DNMCW8U9gfcXmYS9VTfW7W-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Finally, the bottom of the device has no exhaust vents because it’s completely fanless. Based on the AirJet system and motherboard I saw next to the laptop, it looks like any heat is dissipated out of the back of the device.</p><h2 id="phone-wallet-keys-aeroblade">Phone, wallet, keys… AeroBlade</h2><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="3gwrF5dPrTxV6gFqMj87tZ" name="Lenovo Project AeroBlade-5" alt="Lenovo's Project AeroBlade concept laptop open on a table" src="https://cdn.mos.cms.futurecdn.net/3gwrF5dPrTxV6gFqMj87tZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Let’s face it, there are times when you just don’t want to bring your laptop with you to avoid adding extra weight and bulk to your backpack. With Project AeroBlade, though, I don’t think I’d ever leave my laptop at home.</p><p>While it’s technically heavier than one of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a>, it felt a lot lighter in hand, especially with the screen open. I know there are times I’d bring a tablet instead of a laptop, but here, that little bit of extra weight would absolutely be worth it to have a keyboard and a full computer on my person at all times.</p><p>We’ll see if and when Project AeroBlade becomes an actual laptop you can buy, but given Lenovo’s quick turnaround with its concept devices, I wouldn’t be surprised if it ends up being one of the highlights of CES 2027, complete with a price tag and a launch date.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/opinion/i-love-my-desktop-but-this-thinkpad-convinced-me-to-give-laptops-a-second-chance"><strong>I love my desktop but this ThinkPad convinced me to give laptops a second chance</strong></a></li><li><a href="https://www.tomsguide.com/computing/i-shopped-the-lenovo-back-to-school-sale-heres-the-12-items-id-buy-right-now-from-just-usd22"><strong>I shopped the Lenovo back to school sale: here's the 12 items I'd buy right now from just $22</strong></a></li><li><a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/lenovo-yoga-mini-review"><strong>I tested this circular mini PC for a month — and it’s the Mac mini Windows alternative I’ve been waiting for</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/i-held-lenovos-project-aeroblade-laptop-and-its-giving-me-serious-yet-more-powerful-macbook-air-vibes</link>
                                                                            <description>
                            <![CDATA[ Lenovo is pushing the limits of ultra-thin laptops by reimagining how to keep them cool, and I still can’t believe how light Project AeroBlade felt in my hands. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JSzTmyRPrSvmQzwVvwFp4R</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jVyFS6wMtReCtR22mvUbFF-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 03 Sep 2026 16:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></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-320-70.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;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;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/jVyFS6wMtReCtR22mvUbFF-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A person holding Lenovo&#039;s Project AeroBlade concept laptop in hand]]></media:description>                                                            <media:text><![CDATA[A person holding Lenovo&#039;s Project AeroBlade concept laptop in hand]]></media:text>
                                <media:title type="plain"><![CDATA[A person holding Lenovo&#039;s Project AeroBlade concept laptop in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jVyFS6wMtReCtR22mvUbFF-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I still remember watching Steve Jobs pull the first-ever MacBook Air out of a manila envelope like it was yesterday. In the years since, the <a href="https://www.tomsguide.com/computing/laptops/best-laptops">best laptops </a>have gotten even thinner and lighter. But when I first held Lenovo’s new Project AeroBlade concept laptop at <a href="https://www.tomsguide.com/tag/ifa-2026">IFA 2026</a>, I felt just like I imagined Jobs did with the original MacBook Air.</p><p>At just under 830 grams (1.83 pounds), this is a seriously light 14-inch laptop. What’s more, it’s also incredibly thin at just under 10mm thick to boot. The most surprising thing, though, is the new, completely fanless cooling solution Lenovo implemented under the hood, with help from Frore Systems.</p><p>Now keep in mind, this is just a concept device that isn’t being mass-produced yet. However, if Lenovo’s past concepts that turned into real products are any indication, we could soon see a wave of incredibly thin and light ThinkBooks and even ThinkPads that can finally rival Apple’s MacBook Air.</p><p>Here’s everything you need to know about Lenovo’s Project AeroBlade and why I could easily see it being my go-to laptop for both work and travel.</p><h2 id="from-thinkbook-to-thinbook">From ThinkBook to ThinBook</h2><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="Uv2pCAKXPkm9i7ivsyA8jK" name="Lenovo Project AeroBlade-3" alt="A person holding Lenovo's Project AeroBlade concept laptop in hand with the lid closed" src="https://cdn.mos.cms.futurecdn.net/Uv2pCAKXPkm9i7ivsyA8jK-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>With Project AeroBlade closed, it’s clear we’re dealing with something completely different than your standard ThinkBook. In fact, while the front edge tapers down to being almost pencil-thin, you can see that Lenovo had to make the back of the device larger just to house its ports. Speaking of which, there are two USB-C ports on the back left.</p><p>To get Project AeroBlade this thin, Lenovo had to completely redesign its cooling. Instead of traditional fan-based cooling, the device uses a solid-state active cooling architecture developed by Frore Systems called AirJet, which uses ultrasonic vibrations to dissipate heat.</p><p>What makes this new cooling solution stand out is that, with it under the hood, Lenovo didn’t have to sacrifice sustained performance to make this laptop extremely thin. Other benefits include reduced noise, dust intake, and mechanical complexity. The last of which is one reason I think we might see Project AeroBlade’s tech find its way into a laptop you can actually buy sooner than you would with other concepts.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YSpnvmP54MufxKBVEP4i6P" name="Lenovo Project AeroBlade-2" alt="The right ports on the Lenovo Project AeroBlade concept laptop" src="https://cdn.mos.cms.futurecdn.net/YSpnvmP54MufxKBVEP4i6P-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>On the right side, you get another USB-C port, plus a power button that looks like it has an integrated fingerprint sensor and a toggle switch. At first, I couldn’t figure out what that toggle was for, but after Lenovo’s IFA 2026 keynote, I went hands-on with Project AeroBlade a second time.</p><p>Lenovo often includes <a href="https://www.tomsguide.com/computing/laptops/lenovo-ideapad-slim-5x-gen-11-review">privacy shutters</a> on its webcams and for good reason. However, this concept device is too thin for one, so instead of putting it next to the webcam, it’s on the side. Given how easy it is to smudge your laptop’s screen or push it back when toggling the privacy filter on or off, I actually prefer having it on the side.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kVDUcgkE2v3ryB9cCNx53T" name="Lenovo Project AeroBlade-4" alt="The keyboard and trackpad on the Lenovo Project AeroBlade concept laptop" src="https://cdn.mos.cms.futurecdn.net/kVDUcgkE2v3ryB9cCNx53T-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Despite its incredibly thin design, you get the same sturdy keyboard with excellent travel that Lenovo’s known for, along with a large trackpad. Surprisingly, the ThinkBook logo is stamped on the bottom right corner of Project AeroBlade.</p><p>While Lenovo’s ThinkPads — like the <a href="https://www.tomsguide.com/computing/laptops/lenovo-thinkpad-x1-carbon-gen-13-aura-edition-full-review">X1 Carbon</a> — are known for being very thin and light, its ThinkBooks are more affordable and practical workhorses. This could signal a brand new direction for the line, or we could see Project AeroBlade’s tech make its way into a ThinkPad first; only time will tell.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DNMCW8U9gfcXmYS9VTfW7W" name="Lenovo Project AeroBlade" alt="The underside of the Lenovo Project AeroBlade concept laptop" src="https://cdn.mos.cms.futurecdn.net/DNMCW8U9gfcXmYS9VTfW7W-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Finally, the bottom of the device has no exhaust vents because it’s completely fanless. Based on the AirJet system and motherboard I saw next to the laptop, it looks like any heat is dissipated out of the back of the device.</p><h2 id="phone-wallet-keys-aeroblade">Phone, wallet, keys… AeroBlade</h2><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="3gwrF5dPrTxV6gFqMj87tZ" name="Lenovo Project AeroBlade-5" alt="Lenovo's Project AeroBlade concept laptop open on a table" src="https://cdn.mos.cms.futurecdn.net/3gwrF5dPrTxV6gFqMj87tZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Let’s face it, there are times when you just don’t want to bring your laptop with you to avoid adding extra weight and bulk to your backpack. With Project AeroBlade, though, I don’t think I’d ever leave my laptop at home.</p><p>While it’s technically heavier than one of the <a href="https://www.tomsguide.com/best-picks/best-tablet">best tablets</a>, it felt a lot lighter in hand, especially with the screen open. I know there are times I’d bring a tablet instead of a laptop, but here, that little bit of extra weight would absolutely be worth it to have a keyboard and a full computer on my person at all times.</p><p>We’ll see if and when Project AeroBlade becomes an actual laptop you can buy, but given Lenovo’s quick turnaround with its concept devices, I wouldn’t be surprised if it ends up being one of the highlights of CES 2027, complete with a price tag and a launch date.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/opinion/i-love-my-desktop-but-this-thinkpad-convinced-me-to-give-laptops-a-second-chance"><strong>I love my desktop but this ThinkPad convinced me to give laptops a second chance</strong></a></li><li><a href="https://www.tomsguide.com/computing/i-shopped-the-lenovo-back-to-school-sale-heres-the-12-items-id-buy-right-now-from-just-usd22"><strong>I shopped the Lenovo back to school sale: here's the 12 items I'd buy right now from just $22</strong></a></li><li><a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/lenovo-yoga-mini-review"><strong>I tested this circular mini PC for a month — and it’s the Mac mini Windows alternative I’ve been waiting for</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Nvidia’s RTX Spark N1X launches this October: My price predictions for the potential MacBook Pro killer ]]></title>
                                                                                                <dc:content><![CDATA[ <p>For years, creatives and gamers have had to deal with the two-device compromise: you buy an M-series MacBook Pro for the seamless productivity and all-day battery life, and keep the power-hungry Windows gaming rig at home.</p><p>I’ve <a href="https://www.tomsguide.com/computing/laptops/nvidia-rtx-spark-hands-on-review">tested RTX Spark</a> a few times now, and I believe it’s the end of that compromise. And at <a href="http://tomsguide.com/tag/ifa-2026">IFA 2026</a>, Team Green has confirmed that the <strong>RTX Spark N1X is coming this October</strong>.</p><p>Nvidia is aggressively targeting Apple’s throat. By shifting to the Arm-based Grace CPU paired with Blackwell graphics, as you’d see in its RTX 50-series GPUs, and massive pools of memory, Nvidia is finally bringing the Apple Silicon paradigm to Windows — without sacrificing PC gaming.</p><h2 id="impressive-power-in-a-14mm-chassis">Impressive power in a 14mm chassis</h2><p>This isn’t the first foray with Windows on Arm that we’ve seen. Qualcomm’s Snapdragon X2 Elite continues to deliver strong performance and power efficiency. But RTX Spark goes at things a different way by chucking a massive GPU at the silicon. </p><p>In my time testing, that leads to super-powered prosumer productivity performance (especially with the software integrations across Blender and Adobe’s creative suite), stellar gaming performance and enough fuel for Nvidia’s mission to “reinvent the PC” with local agentic AI. And for that power efficiency side of things, it manages to keep the same performance both on and off the charger!</p><p>Up until this point, we’d only known about the top-of-the-line N1X chip. Now we know about the baseline option (also called N1X…this could get a little confusing).</p><div ><table><thead><tr><th class="firstcol " ><p>Spec</p></th><th  ><p>Configuration 1 (The powerhouse)</p></th><th  ><p>Configuration 2 (The baseline)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>20-core Grace CPU</p></td><td  ><p>18-core Grace CPU</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Blackwell RTX GPU with 6,144 CUDA cores <strong>(same count found in desktop RTX 5070)</strong></p></td><td  ><p>Blackwell RTX GPU with 5,120 CUDA cores <strong>(more than the cores found on mobile RTX 5070)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Unified Memory</strong></p></td><td  ><p>Up to 128GB</p></td><td  ><p>24GB-32GB</p></td></tr></tbody></table></div><p>Obviously it’s worth noting that with the lower power consumption of a laptop, even though it does have a massive amount of cores, you won’t get the same level of performance as a desktop-class GPU. Just fun for comparison's sake, you know?</p><h2 id="the-form-factors">The form factors</h2><p>We already know about eight laptops launching with RTX Spark N1X. You can see where I rank them all in a <a href="https://www.tomsguide.com/computing/laptops/ive-gone-hands-on-with-every-nvidia-rtx-spark-laptop-coming-this-fall-heres-my-ranked-list-of-the-best-options">tiered list</a> I did a couple of months ago. Basically, to match the premium specs of that chip, you’re getting premium shells that tick all the boxes needed to take on a MacBook Pro — metallic bodies, gorgeous displays (OLED or mini LED), solid ergonomics and plenty of I/O.</p><p>There are also a couple of mini PCs from Asus and MSI launching with the chip inside, and here at IFA, we’re getting word on two new systems coming to the party in October too:</p><ul><li><strong>Lenovo Yoga 9n 2-in-1: </strong>Another convertible RTX Spark system has arrived to take on MSI’s Prestige Flip N16. The chassis is just 14mm thin.</li><li><strong>Acer SFF RTX Spark: </strong>A small form factor desktop that would look pretty perfect under my living room TV as well as my desk.</li></ul><p>So that’s the next advantage over the MacBook — variety of designs.</p><h2 id="the-friction-point-predicting-the-price">The friction point: Predicting the price</h2><p>While Nvidia was eager to show off the specs, it was noticeably silent on the price. Well, I’m gonna do some bac-of-the-napkin math here to fill this gap and make a prediction. Based on components and the direct competition with Apple, it’s obvious that these machines are going to carry a heavy premium.</p><ul><li><strong>The baseline prediction: </strong>The lower-tier configuration (18-core CPU, 5,120 CUDA cores, 24GB RAM) will likely start around the<strong> $1,999 to $2,499 range </strong>— pricing it directly against the base MacBook Pro models.</li><li><strong>The agentic premium: </strong>If you want that maxed out configuration with 128GB of unified memory to run massive local AI models, expect a jaw-dropping price tag. Given that a maxed-out MacBook Pro easily pushes past the $4,500 mark, an equivalent N1X will likely land in the <strong>$4,000 to $5,000+ range.</strong></li></ul><p>Bookmark this and remind me in the comments if I get this wrong!</p><h2 id="the-early-verdict">The early verdict</h2><p>Way back at <a href="https://www.tomsguide.com/computing/best-of-computex-2026">Computex 2026</a>, Nvidia CEO Jensen Huang made it clear that he wants to reinvent the PC with RTX Spark. This is all fair and good, but I believe the real showcase of N1X here is <strong>not </strong>the local AI computation. That part is impressive, but it’s still up for debate on whether people will actually use their computers in this way.</p><p>The real game-changer here (to me at least) is the fundamental architectural shift that bridges the gap between serious productivity and high-end gaming — complete with all-day battery life (providing it does match up to Nvidia’s claims of course). </p><p>It’s the MacBook Pro that actually has games to play on, and if everything plays out the way I’m anticipating (and there’s no nasty surprises on the performance front), then Apple is finally going to have genuine, uncompromised competition.</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/pc-gaming/i-tested-the-real-dlss-5-forget-the-leaked-mods-its-not-an-ai-filter-this-is-nvidias-photorealistic-game-changer">I wanted to hate Nvidia’s DLSS 5 ‘AI filter’ — but the real DLSS 5 is photorealistic black magic</a></li><li><a href="https://www.tomsguide.com/computing/gaming-laptops/i-tested-6-rtx-spark-laptops-for-gaming-and-the-winner-completely-shocked-me">I tested 6 RTX Spark laptops for gaming — and the winner completely shocked me</a></li><li><a href="https://www.tomsguide.com/computing/toms-guide-computing-awards-2026-22-game-changing-laptops-desktops-and-peripherals">Tom’s Guide Computing Awards 2026: 22 game-changing laptops, desktops and peripherals</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/nvidias-rtx-spark-n1x-drops-this-october-why-apple-silicon-should-be-terrified-and-our-price-predictions</link>
                                                                            <description>
                            <![CDATA[ Nvidia’s RTX Spark N1X arrives this October. With up to 6,144 CUDA cores and 128GB unified memory, here is why Apple Silicon should be terrified. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">m4VrnYwhSNun6hoJrvGDyb</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/WudXrWFBDRvTr4BfJPKW3T-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 03 Sep 2026 16:00:00 +0000</pubDate>                                                                                                                                <updated>Fri, 04 Sep 2026 06:59:04 +0000</updated>
                                                                                                                                            <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/WudXrWFBDRvTr4BfJPKW3T-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[RTX Spark]]></media:description>                                                            <media:text><![CDATA[RTX Spark]]></media:text>
                                <media:title type="plain"><![CDATA[RTX Spark]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/WudXrWFBDRvTr4BfJPKW3T-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>For years, creatives and gamers have had to deal with the two-device compromise: you buy an M-series MacBook Pro for the seamless productivity and all-day battery life, and keep the power-hungry Windows gaming rig at home.</p><p>I’ve <a href="https://www.tomsguide.com/computing/laptops/nvidia-rtx-spark-hands-on-review">tested RTX Spark</a> a few times now, and I believe it’s the end of that compromise. And at <a href="http://tomsguide.com/tag/ifa-2026">IFA 2026</a>, Team Green has confirmed that the <strong>RTX Spark N1X is coming this October</strong>.</p><p>Nvidia is aggressively targeting Apple’s throat. By shifting to the Arm-based Grace CPU paired with Blackwell graphics, as you’d see in its RTX 50-series GPUs, and massive pools of memory, Nvidia is finally bringing the Apple Silicon paradigm to Windows — without sacrificing PC gaming.</p><h2 id="impressive-power-in-a-14mm-chassis">Impressive power in a 14mm chassis</h2><p>This isn’t the first foray with Windows on Arm that we’ve seen. Qualcomm’s Snapdragon X2 Elite continues to deliver strong performance and power efficiency. But RTX Spark goes at things a different way by chucking a massive GPU at the silicon. </p><p>In my time testing, that leads to super-powered prosumer productivity performance (especially with the software integrations across Blender and Adobe’s creative suite), stellar gaming performance and enough fuel for Nvidia’s mission to “reinvent the PC” with local agentic AI. And for that power efficiency side of things, it manages to keep the same performance both on and off the charger!</p><p>Up until this point, we’d only known about the top-of-the-line N1X chip. Now we know about the baseline option (also called N1X…this could get a little confusing).</p><div ><table><thead><tr><th class="firstcol " ><p>Spec</p></th><th  ><p>Configuration 1 (The powerhouse)</p></th><th  ><p>Configuration 2 (The baseline)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>20-core Grace CPU</p></td><td  ><p>18-core Grace CPU</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Blackwell RTX GPU with 6,144 CUDA cores <strong>(same count found in desktop RTX 5070)</strong></p></td><td  ><p>Blackwell RTX GPU with 5,120 CUDA cores <strong>(more than the cores found on mobile RTX 5070)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Unified Memory</strong></p></td><td  ><p>Up to 128GB</p></td><td  ><p>24GB-32GB</p></td></tr></tbody></table></div><p>Obviously it’s worth noting that with the lower power consumption of a laptop, even though it does have a massive amount of cores, you won’t get the same level of performance as a desktop-class GPU. Just fun for comparison's sake, you know?</p><h2 id="the-form-factors">The form factors</h2><p>We already know about eight laptops launching with RTX Spark N1X. You can see where I rank them all in a <a href="https://www.tomsguide.com/computing/laptops/ive-gone-hands-on-with-every-nvidia-rtx-spark-laptop-coming-this-fall-heres-my-ranked-list-of-the-best-options">tiered list</a> I did a couple of months ago. Basically, to match the premium specs of that chip, you’re getting premium shells that tick all the boxes needed to take on a MacBook Pro — metallic bodies, gorgeous displays (OLED or mini LED), solid ergonomics and plenty of I/O.</p><p>There are also a couple of mini PCs from Asus and MSI launching with the chip inside, and here at IFA, we’re getting word on two new systems coming to the party in October too:</p><ul><li><strong>Lenovo Yoga 9n 2-in-1: </strong>Another convertible RTX Spark system has arrived to take on MSI’s Prestige Flip N16. The chassis is just 14mm thin.</li><li><strong>Acer SFF RTX Spark: </strong>A small form factor desktop that would look pretty perfect under my living room TV as well as my desk.</li></ul><p>So that’s the next advantage over the MacBook — variety of designs.</p><h2 id="the-friction-point-predicting-the-price">The friction point: Predicting the price</h2><p>While Nvidia was eager to show off the specs, it was noticeably silent on the price. Well, I’m gonna do some bac-of-the-napkin math here to fill this gap and make a prediction. Based on components and the direct competition with Apple, it’s obvious that these machines are going to carry a heavy premium.</p><ul><li><strong>The baseline prediction: </strong>The lower-tier configuration (18-core CPU, 5,120 CUDA cores, 24GB RAM) will likely start around the<strong> $1,999 to $2,499 range </strong>— pricing it directly against the base MacBook Pro models.</li><li><strong>The agentic premium: </strong>If you want that maxed out configuration with 128GB of unified memory to run massive local AI models, expect a jaw-dropping price tag. Given that a maxed-out MacBook Pro easily pushes past the $4,500 mark, an equivalent N1X will likely land in the <strong>$4,000 to $5,000+ range.</strong></li></ul><p>Bookmark this and remind me in the comments if I get this wrong!</p><h2 id="the-early-verdict">The early verdict</h2><p>Way back at <a href="https://www.tomsguide.com/computing/best-of-computex-2026">Computex 2026</a>, Nvidia CEO Jensen Huang made it clear that he wants to reinvent the PC with RTX Spark. This is all fair and good, but I believe the real showcase of N1X here is <strong>not </strong>the local AI computation. That part is impressive, but it’s still up for debate on whether people will actually use their computers in this way.</p><p>The real game-changer here (to me at least) is the fundamental architectural shift that bridges the gap between serious productivity and high-end gaming — complete with all-day battery life (providing it does match up to Nvidia’s claims of course). </p><p>It’s the MacBook Pro that actually has games to play on, and if everything plays out the way I’m anticipating (and there’s no nasty surprises on the performance front), then Apple is finally going to have genuine, uncompromised competition.</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/pc-gaming/i-tested-the-real-dlss-5-forget-the-leaked-mods-its-not-an-ai-filter-this-is-nvidias-photorealistic-game-changer">I wanted to hate Nvidia’s DLSS 5 ‘AI filter’ — but the real DLSS 5 is photorealistic black magic</a></li><li><a href="https://www.tomsguide.com/computing/gaming-laptops/i-tested-6-rtx-spark-laptops-for-gaming-and-the-winner-completely-shocked-me">I tested 6 RTX Spark laptops for gaming — and the winner completely shocked me</a></li><li><a href="https://www.tomsguide.com/computing/toms-guide-computing-awards-2026-22-game-changing-laptops-desktops-and-peripherals">Tom’s Guide Computing Awards 2026: 22 game-changing laptops, desktops and peripherals</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested Acer's latest lightweight laptop, and it felt like I was holding nothing at all — but there are some problems ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I've always been a fan of tech that manages to blend slimness and a lightweight design into a form factor that's still equally useful (partly why I daily drive an <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review">iPhone Air</a>). And Acer's new Swift Blade 14 at IFA 2026 takes that idea almost to the extreme. </p><p>The Swift Blade 14 isn't just another <a href="https://www.tomsguide.com/computing/laptops/forget-the-macbook-neo-these-4-windows-laptops-are-just-as-powerful">MacBook Neo competitor</a> or one of the new <a href="https://www.tomsguide.com/computing/gaming-laptops/i-tested-6-rtx-spark-laptops-for-gaming-and-the-winner-completely-shocked-me">Nvidia RTX Spark-powered laptops</a> we've seen here in Berlin. The whole point of this laptop is much simpler: Acer has managed to make a proper 14-inch laptop that weighs just under 800 grams (1.7lbs). </p><p>The Swift Blade 14 looks like pretty much any other thin-and-light laptop at first. It has a slim profile and a catchy design, available in two great-looking colors, namely Marshmallow White and Marshmallow Blue. But then you actually pick it up, and that's when the laptop catches you by surprise. At just 799 grams, it feels almost weightless in the hand. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kjojvL8eytmXmLndyB76PW" name="acer-swift-blade-14-2" alt="Hands-on with the Acer Swift Blade 14 laptop at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/kjojvL8eytmXmLndyB76PW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>For reference, that's less than the combined weight of a <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">13-inch iPad Pro</a> with Apple's Magic Keyboard attached, which really puts into perspective just how light this thing is. </p><p>Of course, getting the weight this low means Acer has had to make some compromises. The chassis initially feels almost plastic-like in the hand, although Acer is actually using a combination of ultra-light carbon fiber and magnesium-aluminum alloy to keep the weight down. </p><p>The keyboard and trackpad are where I noticed the compromises more. The trackpad itself is plenty large, but neither it nor the keyboard has the tactile feel you'd expect from a more premium laptop. </p><p>The keyboard deck also flexes noticeably if you press down on it harder than usual. Thankfully, the display lid itself doesn't feel particularly flimsy, which surprised me considering just how little the entire machine weighs.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LZgvjc7nyTfjqyAVAdyb96" name="acer-swift-blade-14-4" alt="Hands-on with the Acer Swift Blade 14 laptop at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/LZgvjc7nyTfjqyAVAdyb96-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Acer hasn't completely sacrificed the specs to achieve that weight either. The Swift Blade 14 is powered by Intel's Core Series 3 processors, with configurations going up to the Core 7 350. You also get a gorgeous 14-inch 3K OLED display with great color reproduction and what appeared to be an anti-reflective coating on top.</p><p>Acer tells me there will also be an IPS LCD variant with a 60Hz refresh rate, which will presumably sit at the lower end of the pricing spectrum. Other internals include 12GB of LPDDR5 RAM and up to 1TB of SSD storage. There's also a 50Wh battery underneath, which isn't massive by any means, but should be enough for regular day-to-day use on the go. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="r8oU4CY39V4om9iNjLsaCW" name="acer-swift-blade-14-5" alt="Hands-on with the Acer Swift Blade 14 laptop at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/r8oU4CY39V4om9iNjLsaCW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>The port selection isn't bad for something this thin either. There are USB-C ports on both sides, including two on the left, while the right side also houses a 3.5mm headphone jack. One little addition I particularly like is the physical camera switch on the side, letting you completely disable the webcam with just a flip. </p><p>Acer hasn't announced U.S. pricing or availability for the Swift Blade 14 just yet. The company says the laptop will be available in Europe toward the end of this year, but there's currently no word on whether it'll eventually make its way to the U.S.</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/laptops/forget-framework-i-just-popped-open-acers-new-modular-laptop-and-it-could-be-the-end-of-throwaway-pcs">I tore apart Acer’s £1,599 Vero 16 with my bare hands — Framework finally has a lethal rival</a></li><li><a href="https://www.tomsguide.com/computing/toms-guide-computing-awards-2026-22-game-changing-laptops-desktops-and-peripherals">Tom’s Guide Computing Awards 2026: 22 game-changing laptops, desktops and peripherals</a></li><li><a href="https://www.tomsguide.com/computing/laptops/i-ditched-my-macbook-pro-for-the-dell-xps-13-heres-why-i-returned-to-windows">I ditched my MacBook Pro for the Dell XPS 13 — here's why I returned to Windows</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/computing/laptops/acer-swift-blade-14-ifa-2026-hands-on</link>
                                                                            <description>
                            <![CDATA[ Acer's new Swift Blade 14 weighs just 799 grams and measures 12.9mm thin. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7iKvVoFLah5Q6JEERZZsLQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/eWUPM9QGt4XjJrTZN6RjGW-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 03 Sep 2026 09:49:01 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                                    <dc:creator><![CDATA[ Sanuj Bhatia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/8p5BvMVA7cnu5AWkxnTjRC-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/eWUPM9QGt4XjJrTZN6RjGW-1920-80.jpg">
                                                            <media:credit><![CDATA[Sanuj Bhatia / Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Hands-on with the Acer Swift Blade 14 laptop at IFA 2026]]></media:description>                                                            <media:text><![CDATA[Hands-on with the Acer Swift Blade 14 laptop at IFA 2026]]></media:text>
                                <media:title type="plain"><![CDATA[Hands-on with the Acer Swift Blade 14 laptop at IFA 2026]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/eWUPM9QGt4XjJrTZN6RjGW-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I've always been a fan of tech that manages to blend slimness and a lightweight design into a form factor that's still equally useful (partly why I daily drive an <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review">iPhone Air</a>). And Acer's new Swift Blade 14 at IFA 2026 takes that idea almost to the extreme. </p><p>The Swift Blade 14 isn't just another <a href="https://www.tomsguide.com/computing/laptops/forget-the-macbook-neo-these-4-windows-laptops-are-just-as-powerful">MacBook Neo competitor</a> or one of the new <a href="https://www.tomsguide.com/computing/gaming-laptops/i-tested-6-rtx-spark-laptops-for-gaming-and-the-winner-completely-shocked-me">Nvidia RTX Spark-powered laptops</a> we've seen here in Berlin. The whole point of this laptop is much simpler: Acer has managed to make a proper 14-inch laptop that weighs just under 800 grams (1.7lbs). </p><p>The Swift Blade 14 looks like pretty much any other thin-and-light laptop at first. It has a slim profile and a catchy design, available in two great-looking colors, namely Marshmallow White and Marshmallow Blue. But then you actually pick it up, and that's when the laptop catches you by surprise. At just 799 grams, it feels almost weightless in the hand. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kjojvL8eytmXmLndyB76PW" name="acer-swift-blade-14-2" alt="Hands-on with the Acer Swift Blade 14 laptop at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/kjojvL8eytmXmLndyB76PW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>For reference, that's less than the combined weight of a <a href="https://www.tomsguide.com/computing/ipads/ipad-pro-m5-review">13-inch iPad Pro</a> with Apple's Magic Keyboard attached, which really puts into perspective just how light this thing is. </p><p>Of course, getting the weight this low means Acer has had to make some compromises. The chassis initially feels almost plastic-like in the hand, although Acer is actually using a combination of ultra-light carbon fiber and magnesium-aluminum alloy to keep the weight down. </p><p>The keyboard and trackpad are where I noticed the compromises more. The trackpad itself is plenty large, but neither it nor the keyboard has the tactile feel you'd expect from a more premium laptop. </p><p>The keyboard deck also flexes noticeably if you press down on it harder than usual. Thankfully, the display lid itself doesn't feel particularly flimsy, which surprised me considering just how little the entire machine weighs.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LZgvjc7nyTfjqyAVAdyb96" name="acer-swift-blade-14-4" alt="Hands-on with the Acer Swift Blade 14 laptop at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/LZgvjc7nyTfjqyAVAdyb96-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Acer hasn't completely sacrificed the specs to achieve that weight either. The Swift Blade 14 is powered by Intel's Core Series 3 processors, with configurations going up to the Core 7 350. You also get a gorgeous 14-inch 3K OLED display with great color reproduction and what appeared to be an anti-reflective coating on top.</p><p>Acer tells me there will also be an IPS LCD variant with a 60Hz refresh rate, which will presumably sit at the lower end of the pricing spectrum. Other internals include 12GB of LPDDR5 RAM and up to 1TB of SSD storage. There's also a 50Wh battery underneath, which isn't massive by any means, but should be enough for regular day-to-day use on the go. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="r8oU4CY39V4om9iNjLsaCW" name="acer-swift-blade-14-5" alt="Hands-on with the Acer Swift Blade 14 laptop at IFA 2026" src="https://cdn.mos.cms.futurecdn.net/r8oU4CY39V4om9iNjLsaCW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>The port selection isn't bad for something this thin either. There are USB-C ports on both sides, including two on the left, while the right side also houses a 3.5mm headphone jack. One little addition I particularly like is the physical camera switch on the side, letting you completely disable the webcam with just a flip. </p><p>Acer hasn't announced U.S. pricing or availability for the Swift Blade 14 just yet. The company says the laptop will be available in Europe toward the end of this year, but there's currently no word on whether it'll eventually make its way to the U.S.</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/laptops/forget-framework-i-just-popped-open-acers-new-modular-laptop-and-it-could-be-the-end-of-throwaway-pcs">I tore apart Acer’s £1,599 Vero 16 with my bare hands — Framework finally has a lethal rival</a></li><li><a href="https://www.tomsguide.com/computing/toms-guide-computing-awards-2026-22-game-changing-laptops-desktops-and-peripherals">Tom’s Guide Computing Awards 2026: 22 game-changing laptops, desktops and peripherals</a></li><li><a href="https://www.tomsguide.com/computing/laptops/i-ditched-my-macbook-pro-for-the-dell-xps-13-heres-why-i-returned-to-windows">I ditched my MacBook Pro for the Dell XPS 13 — here's why I returned to Windows</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested Acer's wild Project DualPlay Mini — and it's a gaming handheld and laptop in one gadget ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I miss netbooks. There, I said it.</p><p>In the late 2000s, Asus Eee PCs and Acer Aspire Ones took over the world. They were ultra-portable and fundamentally awful to use — sluggish Intel Atom chips and zero hope of running 3D games. But damn, I loved them.</p><p>Then I walked up to Project DualPlay Mini on the <a href="https://www.tomsguide.com/tech-events/ifa-2026-what-to-expect">IFA 2026</a> show floor, and it felt like stepping into an alternate timeline where the netbook grew up and went to the gym.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7681377120110660877" data-video-id="7681377120110660877" 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="♬ Synthwave - Wiliam Geek" href="https://www.tiktok.com/music/Synthwave-7407812545971587089">♬ Synthwave - Wiliam Geek</a></section>                    </blockquote></div>                <p>Because while everyone is racing to copy the <a href="https://www.tomsguide.com/opinion/steam-deck-oled-is-the-must-buy-handheld-of-2023-and-the-perfect-holiday-gift-for-gamers">Steam Deck</a>, Acer’s 8-inch concept is reviving the lost art of the netbook. It’s a dedicated handheld console when you want to lounge on the train, and an actual clamshell laptop when you need to type an email or play a classic shooter.</p><p>Put simply, I’ve seen a lot of prototypes come and go where I thought, “this is cool, but nothing people will actually buy.” This is the first time I’ve looked at something and openly begged a company to release it.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T9HPzLhR3MZYSmJnuT7Rzj" name="Acer Project DualPlay Mini" alt="Acer Project DualPlay Mini" src="https://cdn.mos.cms.futurecdn.net/T9HPzLhR3MZYSmJnuT7Rzj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><h2 id="flip-swivel-and-play">Flip, swivel and play</h2><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="2nC9zEW7UseGtXPsawme3k" name="Acer Project DualPlay Mini" alt="Acer Project DualPlay Mini" src="https://cdn.mos.cms.futurecdn.net/2nC9zEW7UseGtXPsawme3k-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>So let’s get into it, shall we? In its traditional handheld form, it looks weird with its protruding sides. But it's still comfortable to play games on.</p><p>But the central focal point is that flip-and-swivel display. The central hinge feels fundamentally stable, and the display flips with a smooth, gracious ease to reveal a full QWERTY keyboard — not big enough to rewrite War and Peace, but definitely enough for the daily essentials and expanding your game collection beyond just controller-preferred titles on the go.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8Que9XECR3s9pnugmsEpsj" name="Acer Project DualPlay Mini" alt="Acer Project DualPlay Mini" src="https://cdn.mos.cms.futurecdn.net/8Que9XECR3s9pnugmsEpsj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>And that 8-inch touchscreen display manages to hit that golden ratio: large enough to display Windows 11 UI elements and game HUDs without squinting, but small enough to maintain that handheld (and netbook) balance.</p><p>Also, shout-out to the small details too. Legacy is important, and with Acer celebrating its 50th anniversary, you’ll find “Acer 50 since 1976” embossed in Morse code on the rear cover to celebrate its golden jubilee.</p><h2 id="the-big-friction-test">The big friction test</h2><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="xi8AmrCr9bEnbaP7nwsKtj" name="Acer Project DualPlay Mini" alt="Acer Project DualPlay Mini" src="https://cdn.mos.cms.futurecdn.net/xi8AmrCr9bEnbaP7nwsKtj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Since this is an 8-inch device, we have to address the physical limitations. The keyboard is smaller than other full QWERTYs. It's still sizable enough not to be just a thumb-typing tool, and you'll get a comfortable feel for the WASD when playing a first-person shooter.</p><p>In handheld mode, the keys fold right back in, and you’re back to gaming mode with all the same ergonomic comfort you’d expect from the best <a href="https://www.tomsguide.com/round-up/best-handheld-gaming-consoles">handheld gaming consoles</a> in 2026. But wait, what about the lack of a touchpad?</p><p>You do have to rely on touchscreen Windows, which can be hit-and-miss, but not the end of the world. If Acer wanted to go truly crazy with this, a ThinkPad-style optical track nub would’ve been God mode for them. But with that touch panel up top, I found myself quickly getting into that flow of tapping and typing.</p><h2 id="serious-power-in-a-tiny-shell">Serious power in a tiny shell</h2><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="8yGxTdPzCNb6CWr8RrVttj" name="Acer Project DualPlay Mini" alt="Acer Project DualPlay Mini" src="https://cdn.mos.cms.futurecdn.net/8yGxTdPzCNb6CWr8RrVttj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Performance-wise, Acer can only say it has an “Intel chip,” but given what I was able to get out of it (100 FPS on Forza Horizon 6 with XeSS3), I’m inclined to believe it’s an Arc G3 Extreme.</p><p>That’s maintained with rear dual-fan active cooling borrowed from the <a href="https://www.tomsguide.com/gaming/handheld-gaming/acer-predator-atlas-8-hands-on-review">Predator Atlas 8</a>, and the result is a massive contrast to the 2008 netbook experience and today. This tiny chassis has the thermal headroom to run full Windows 11 and AAA games — not just a single browser tab.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xj2BaX"></div>                            </div>                            <script src="https://kwizly.com/embed/Xj2BaX.js" async></script><h2 id="will-acer-actually-sell-this">Will Acer actually sell this?</h2><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="u2WonKzL7HaigWGHCu7Ysj" name="Acer Project DualPlay Mini" alt="Acer Project DualPlay Mini" src="https://cdn.mos.cms.futurecdn.net/u2WonKzL7HaigWGHCu7Ysj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>So here’s the bad news. Acer explicitly labeled DualPlay Mini as an “innovation concept,” while launching the standard Predator Atlas 7 alongside it.</p><p>But if you’re loud enough, companies will bend.</p><p>The gaming handheld market has become dangerously boring, with every brand releasing identical plastic slates. Project DualPlay Mini proves that form-factor experimentation isn’t dead, and it’s actually cool as hell.</p><p>Acer shouldn’t leave this in the R&D lab; the audience that loved netbooks — and the PC gamers who want a true all-in-one travel machine — are ready to buy it. I can feel it in my bones.</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/handheld-gaming/i-tested-the-usd1-299-rog-xbox-ally-x20-with-that-oled-display-the-usd300-price-hike-is-surprisingly-palatable">I tested the $1,299 ROG Xbox Ally X20 — with that OLED display, the $300 price hike is surprisingly palatable</a></li><li><a href="https://www.tomsguide.com/computing/laptops/forget-framework-i-just-popped-open-acers-new-modular-laptop-and-it-could-be-the-end-of-throwaway-pcs">Forget Framework — I just popped open Acer's new modular laptop and it could be the end of throwaway PCs</a></li><li><a href="https://www.tomsguide.com/computing/gaming-laptops/i-tested-6-rtx-spark-laptops-for-gaming-and-the-winner-completely-shocked-me">I tested 6 RTX Spark laptops for gaming — and the winner completely shocked me</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/gaming/handheld-gaming/i-tested-acers-wild-flip-and-swivel-handheld-why-project-dualplay-mini-is-the-ultimate-netbook-love-letter</link>
                                                                            <description>
                            <![CDATA[ I tested Acer’s Project DualPlay Mini. With an 8-inch flip-and-swivel screen and a physical QWERTY keyboard, here's why this is a handheld to keep an eye on. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Yvcy5eUzLNEeqTCH25jEum</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/r27J4QLyodE5HbCymwcYei-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 03 Sep 2026 06:30:00 +0000</pubDate>                                                                                                                                <updated>Fri, 04 Sep 2026 13:16:59 +0000</updated>
                                                                                                                                            <category><![CDATA[Handheld Gaming]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/r27J4QLyodE5HbCymwcYei-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Acer Project DualPlay Mini]]></media:description>                                                            <media:text><![CDATA[Acer Project DualPlay Mini]]></media:text>
                                <media:title type="plain"><![CDATA[Acer Project DualPlay Mini]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/r27J4QLyodE5HbCymwcYei-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I miss netbooks. There, I said it.</p><p>In the late 2000s, Asus Eee PCs and Acer Aspire Ones took over the world. They were ultra-portable and fundamentally awful to use — sluggish Intel Atom chips and zero hope of running 3D games. But damn, I loved them.</p><p>Then I walked up to Project DualPlay Mini on the <a href="https://www.tomsguide.com/tech-events/ifa-2026-what-to-expect">IFA 2026</a> show floor, and it felt like stepping into an alternate timeline where the netbook grew up and went to the gym.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7681377120110660877" data-video-id="7681377120110660877" 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="♬ Synthwave - Wiliam Geek" href="https://www.tiktok.com/music/Synthwave-7407812545971587089">♬ Synthwave - Wiliam Geek</a></section>                    </blockquote></div>                <p>Because while everyone is racing to copy the <a href="https://www.tomsguide.com/opinion/steam-deck-oled-is-the-must-buy-handheld-of-2023-and-the-perfect-holiday-gift-for-gamers">Steam Deck</a>, Acer’s 8-inch concept is reviving the lost art of the netbook. It’s a dedicated handheld console when you want to lounge on the train, and an actual clamshell laptop when you need to type an email or play a classic shooter.</p><p>Put simply, I’ve seen a lot of prototypes come and go where I thought, “this is cool, but nothing people will actually buy.” This is the first time I’ve looked at something and openly begged a company to release it.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T9HPzLhR3MZYSmJnuT7Rzj" name="Acer Project DualPlay Mini" alt="Acer Project DualPlay Mini" src="https://cdn.mos.cms.futurecdn.net/T9HPzLhR3MZYSmJnuT7Rzj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><h2 id="flip-swivel-and-play">Flip, swivel and play</h2><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="2nC9zEW7UseGtXPsawme3k" name="Acer Project DualPlay Mini" alt="Acer Project DualPlay Mini" src="https://cdn.mos.cms.futurecdn.net/2nC9zEW7UseGtXPsawme3k-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>So let’s get into it, shall we? In its traditional handheld form, it looks weird with its protruding sides. But it's still comfortable to play games on.</p><p>But the central focal point is that flip-and-swivel display. The central hinge feels fundamentally stable, and the display flips with a smooth, gracious ease to reveal a full QWERTY keyboard — not big enough to rewrite War and Peace, but definitely enough for the daily essentials and expanding your game collection beyond just controller-preferred titles on the go.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8Que9XECR3s9pnugmsEpsj" name="Acer Project DualPlay Mini" alt="Acer Project DualPlay Mini" src="https://cdn.mos.cms.futurecdn.net/8Que9XECR3s9pnugmsEpsj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>And that 8-inch touchscreen display manages to hit that golden ratio: large enough to display Windows 11 UI elements and game HUDs without squinting, but small enough to maintain that handheld (and netbook) balance.</p><p>Also, shout-out to the small details too. Legacy is important, and with Acer celebrating its 50th anniversary, you’ll find “Acer 50 since 1976” embossed in Morse code on the rear cover to celebrate its golden jubilee.</p><h2 id="the-big-friction-test">The big friction test</h2><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="xi8AmrCr9bEnbaP7nwsKtj" name="Acer Project DualPlay Mini" alt="Acer Project DualPlay Mini" src="https://cdn.mos.cms.futurecdn.net/xi8AmrCr9bEnbaP7nwsKtj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Since this is an 8-inch device, we have to address the physical limitations. The keyboard is smaller than other full QWERTYs. It's still sizable enough not to be just a thumb-typing tool, and you'll get a comfortable feel for the WASD when playing a first-person shooter.</p><p>In handheld mode, the keys fold right back in, and you’re back to gaming mode with all the same ergonomic comfort you’d expect from the best <a href="https://www.tomsguide.com/round-up/best-handheld-gaming-consoles">handheld gaming consoles</a> in 2026. But wait, what about the lack of a touchpad?</p><p>You do have to rely on touchscreen Windows, which can be hit-and-miss, but not the end of the world. If Acer wanted to go truly crazy with this, a ThinkPad-style optical track nub would’ve been God mode for them. But with that touch panel up top, I found myself quickly getting into that flow of tapping and typing.</p><h2 id="serious-power-in-a-tiny-shell">Serious power in a tiny shell</h2><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="8yGxTdPzCNb6CWr8RrVttj" name="Acer Project DualPlay Mini" alt="Acer Project DualPlay Mini" src="https://cdn.mos.cms.futurecdn.net/8yGxTdPzCNb6CWr8RrVttj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Performance-wise, Acer can only say it has an “Intel chip,” but given what I was able to get out of it (100 FPS on Forza Horizon 6 with XeSS3), I’m inclined to believe it’s an Arc G3 Extreme.</p><p>That’s maintained with rear dual-fan active cooling borrowed from the <a href="https://www.tomsguide.com/gaming/handheld-gaming/acer-predator-atlas-8-hands-on-review">Predator Atlas 8</a>, and the result is a massive contrast to the 2008 netbook experience and today. This tiny chassis has the thermal headroom to run full Windows 11 and AAA games — not just a single browser tab.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xj2BaX"></div>                            </div>                            <script src="https://kwizly.com/embed/Xj2BaX.js" async></script><h2 id="will-acer-actually-sell-this">Will Acer actually sell this?</h2><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="u2WonKzL7HaigWGHCu7Ysj" name="Acer Project DualPlay Mini" alt="Acer Project DualPlay Mini" src="https://cdn.mos.cms.futurecdn.net/u2WonKzL7HaigWGHCu7Ysj-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>So here’s the bad news. Acer explicitly labeled DualPlay Mini as an “innovation concept,” while launching the standard Predator Atlas 7 alongside it.</p><p>But if you’re loud enough, companies will bend.</p><p>The gaming handheld market has become dangerously boring, with every brand releasing identical plastic slates. Project DualPlay Mini proves that form-factor experimentation isn’t dead, and it’s actually cool as hell.</p><p>Acer shouldn’t leave this in the R&D lab; the audience that loved netbooks — and the PC gamers who want a true all-in-one travel machine — are ready to buy it. I can feel it in my bones.</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/handheld-gaming/i-tested-the-usd1-299-rog-xbox-ally-x20-with-that-oled-display-the-usd300-price-hike-is-surprisingly-palatable">I tested the $1,299 ROG Xbox Ally X20 — with that OLED display, the $300 price hike is surprisingly palatable</a></li><li><a href="https://www.tomsguide.com/computing/laptops/forget-framework-i-just-popped-open-acers-new-modular-laptop-and-it-could-be-the-end-of-throwaway-pcs">Forget Framework — I just popped open Acer's new modular laptop and it could be the end of throwaway PCs</a></li><li><a href="https://www.tomsguide.com/computing/gaming-laptops/i-tested-6-rtx-spark-laptops-for-gaming-and-the-winner-completely-shocked-me">I tested 6 RTX Spark laptops for gaming — and the winner completely shocked me</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
            </channel>
</rss>