<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="https://purl.org/dc/elements/1.1/"
     xmlns:dcterms="http://purl.org/dc/terms/"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:cf="https://www.futureplc.com/rss/content-flags"
>
    <channel>
                    <atom:link href="https://www.tomsguide.com/feeds/tag/desktop-computers" rel="self" type="application/rss+xml" />
                            <title><![CDATA[ Latest from Tom's Guide in Desktop-computers ]]></title>
                <link>https://www.tomsguide.com/computing/desktop-computers</link>
        <description><![CDATA[ All the latest desktop-computers content from the Tom's Guide team ]]></description>
                                    <lastBuildDate>Mon, 27 Jul 2026 10:00:00 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ I've been an Apple user for 30 years and these are my golden rules to never pay full price ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/apple-desktops/ive-been-an-apple-user-for-30-years-and-these-are-my-golden-rules-to-never-pay-full-price</link>
                                                                            <description>
                            <![CDATA[ From iPhones to MacBooks, I've used Apple devices all my life. Here's how I've managed to never pay full price and avoid paying the Apple tax. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">jUoGcyzjRugJVBebFP7bAE</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/yq6C23CRZR3VsDxd67YkLe-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 27 Jul 2026 10:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ louis.ramirez@futurenet.com (Louis Ramirez) ]]></author>                    <dc:creator><![CDATA[ Louis Ramirez ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oYF2xVwCb4pTGhAJi8Yqr5.jpeg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;As deals editor-in-chief at Tom’s Guide, Louis refuses to pay full price for anything. He has over 10 years of experience finding the best deals and coupons to bring readers. Louis price checks&amp;nbsp;against multiple retailers and searches high and low for sales on 4K TVs, Apple devices, streaming services, mattresses, kitchen appliances, and more.&amp;nbsp;He&#039;s also always looking for the the best coupon codes to turn good deals into stellar buys.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;He has covered major retail events like Amazon Prime Day, Black Friday, and Cyber Monday for more than a decade and knows how to spot an epic deal from a fake discount. He&#039;s also great at helping people negotiate better prices on everything from gym memberships to their home internet service. Louis&#039; work has also helped readers find PS5 restock, baby formula, Clorox wipes, and everything in between. For his next major purchase, Louis is hoping to find a killer deal on an M3-based Mac.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;A born-and-bred New Yorker, Louis is always in search of the perfect cup of coffee. On his free time, he enjoys swimming, running, and any workout that pushes his Apple Watch to the max. He&#039;s also a big fan of international films, horror movies, and K-dramas. His work has appeared on Gizmodo, CNET, Digital Trends, Dealnews, and Time Out New York.&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/yq6C23CRZR3VsDxd67YkLe-1280-80.jpg">
                                                            <media:credit><![CDATA[Amazon edited with Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Collage of Apple devices against yellow background]]></media:description>                                                            <media:text><![CDATA[Collage of Apple devices against yellow background]]></media:text>
                                <media:title type="plain"><![CDATA[Collage of Apple devices against yellow background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/yq6C23CRZR3VsDxd67YkLe-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>My obsession with Apple started in high school when my mom bought me a Performa 637 CD. It was my first personal computer and I was immediately hooked on the icon-driven System 7, which was the name Apple used before making the switch to Mac OS. </p><p>Sure, there were more powerful PCs at the time — and most of my friends were using Windows — but my Mac never crashed and it was powerful enough to run my favorite first-person shooter: the Apple exclusive Bungie Marathon (1994). So I took pride in being part of the Apple minority.</p><p>Fast forward to 2026 and I'm still a loyal Mac user primarily working on an M4 Pro-based Mac mini. Throughout the years I've also owned iPhones, iPads, Apple Watches, and iMacs. Yes, I've dabbled with Windows machines and Android smartphones, but there's something about Apple's closed ecosystem that just makes my life easier and well worth the price of admission. </p><p>My wallet, however, may disagree. Apple devices are renown for being pricier than their Windows and Android based counterparts. Fortunately, there are many ways to save on Apple gear. In fact, I always make it a point to avoid paying full price for my Apple kit and below I'm sharing my favorite tips and tricks.</p><h3 class="article-body__section" id="section-trade-in-that-old-mac"><span>Trade-in that old Mac</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="C3B3avxZEqqeDTz86xozCL" name="MacBook Air M1 review Performance Graphics alt 2.jpg" alt="Apple MacBook Air M1 (late 2020) review" src="https://cdn.mos.cms.futurecdn.net/C3B3avxZEqqeDTz86xozCL.jpg" mos="" align="middle" fullscreen="" width="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>Trading in old devices is hands-down my favorite way to save on new Apple purchases. Whether it's an old iPhone or a gently-used MacBook, if you're willing to part with it —the Apple Store will give you an instant store credit for your device. You can trade-in iPhones, Apple Watches, iPads, Macs, and even Android smartphones. You can trade-in your device in person at your local Apple Store or online. </p><p>Just head over to the <a href="https://www.apple.com/shop/trade-in" target="_blank" rel="nofollow">Apple Trade-In website</a> to start the process. I also recommend the <a href="https://www.bestbuy.com/trade-in" target="_blank" rel="nofollow">Best Buy Trade-In</a> program, which is pretty straightforward and provides quotes on the spot. My only advice is that you shop around for the best offer. For example, sometimes you might get a juicier offer from an Authorized Apple reseller than the Apple Store. </p><h3 class="article-body__section" id="section-don-t-buy-current-gen"><span>Don't buy current-gen</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8dacpVN2gJ33KymM67zxAB" name="TG_apple-watch-8_LIST4.jpg" alt="Apple Watch Series 8 shown on wrist" src="https://cdn.mos.cms.futurecdn.net/8dacpVN2gJ33KymM67zxAB.jpg" mos="" align="middle" fullscreen="" width="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 get it. Nothing beats owning a flagship device. The speedier performance, the thinner design, the brighter display — it's enough to make you want to upgrade each time. However, these days you don't need to. My four-year old Apple Watch 8 still runs like new and if my iMac 5K supported the latest macOS updates, I'd still be using it. </p><p>One of the easiest ways to save on Mac purchases is by opting for a previous-generation device. It can easily save you $100 if not more. It's worth noting that the Apple Store doesn't always carry previous-gen tech, so when shopping for older generations I tend to rely on retailers like Amazon and Best Buy. They won't always have stock, but with a little digging around you'll be able to find a cheaper version of Apple's current flagship. </p><h3 class="article-body__section" id="section-go-big-on-your-purchase"><span>Go big on your purchase</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eaiLkhbaJ3LTzQL9PEqtfC" name="Mac mini M4-07-LIST1" alt="The Mac mini M4 upright on a desk showing the Apple logo" src="https://cdn.mos.cms.futurecdn.net/eaiLkhbaJ3LTzQL9PEqtfC.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Apple devices are renown for lasting a long time. (I tend to get at least 5 years from mine). So when it comes time to purchasing a new device, I always recommended spending a little more for the upgraded model. This is more important that ever because today's Macs are no longer user upgradeable. </p><p>So if you want to squeeze the most life out of your device, I recommend buying big. For example, when I purchased my Mac mini, I splurged on the M4 Pro CPU and upgraded both my RAM and SSD. My iMac 5K lasted me nearly a decade before I upgraded, so I'm hoping to get the same or similar lifespan from my current machine. </p><h3 class="article-body__section" id="section-take-advantage-of-student-discounts"><span>Take advantage of student discounts</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bULz3Qsy86ZB7ckrB7j7ES" name="Apple MacBook Air M5" alt="Apple MacBook Air M5." src="https://cdn.mos.cms.futurecdn.net/bULz3Qsy86ZB7ckrB7j7ES.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Apple's Education Store discount is available year-round. Depending on what you're buying, you can save as much as $100 if you can verify your student status. In the past, I've actually recommended people avoid it because you can usually find better dollar-off discounts at authorized retailers like Amazon or Best Buy. However, since <a href="https://www.tomsguide.com/computing/macbooks/apple-price-hikes-are-official-heres-how-much-more-youll-pay-for-macbooks-and-ipads-now">Apple's summer price hike</a>, Apple deals have been a little harder to come by. </p><p>Additionally, the Apple Back to School Sale is underway through August 27, so in addition to that student discount you'll also get from a $100 to $150 Apple gift card on select purchases. That sweetens the deal even more. For example, the <a href="https://www.apple.com/us-edu/shop/buy-mac/macbook-air" target="_blank" rel="nofollow">Apple Education Store has the MacBook Air M5 on sale for $1,199</a>. That's $100 off and you also get a <a href="https://www.apple.com/us-edu/shop/buy-mac/macbook-air" target="_blank" rel="nofollow">free $100 Apple gift card</a>. Sure, <a href="https://www.amazon.com/Apple-2026-MacBook-13-inch-Laptop/dp/B0GR19X8DC" target="_blank" rel="nofollow">Amazon offers the same price</a>, but there's no freebie gift card. Likewise, the <a href="https://www.apple.com/us-edu/shop/buy-mac/macbook-neo" target="_blank" rel="nofollow">Apple Education Store has the MacBook Neo on sale for $599</a>, which is $100 off. There's no gift card included with this offer, but I can guarantee you that no retailer is taking $100 off the MacBook Neo anytime soon. </p><h3 class="article-body__section" id="section-don-t-be-afraid-of-refurbished"><span>Don't be afraid of refurbished</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sneq3FFhxfBE3QJ7AxryJf" name="Apple Gaming (Jul 2024).jpg" alt="iPad Pro M4" src="https://cdn.mos.cms.futurecdn.net/sneq3FFhxfBE3QJ7AxryJf.jpg" mos="" align="middle" fullscreen="" width="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 a germophobe, I used to cringe at the idea of buying used tech. However, buying refurbished Apple gear is a great way to help your bank account and the planet. Apple restores and/or replaces everything during the refurbishing process, so my unfounded fear of getting a device with a random hair or grease stain on it is baseless. </p><p>In fact, the Apple Store is known for the excellent condition of its refurbished products and everything is backed by a 1-year Apple warranty. (That's the same warranty you'd get if you were to purchase a new Apple device). At the time of this writing, you can find <a href="https://www.apple.com/shop/refurbished/mac/macbook-air" target="_blank" rel="nofollow">MacBook Airs from $1,019</a> and <a href="https://www.apple.com/shop/refurbished/mac/macbook-neo" target="_blank" rel="nofollow">MacBook Neos from $599</a>.</p><h3 class="article-body__section" id="section-best-apple-deals-now"><span>Best Apple Deals Now</span></h3><div class="product"><a data-dimension112="1df69ed6-879c-11f1-9c73-8db59ee46abd" data-action="Deal Block" data-label="Apple Watch SE 3 review" data-dimension48="Apple Watch SE 3 review" data-dimension25="$219" href="https://www.amazon.com/dp/B0FQFNRH72" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1250px;"><p class="vanilla-image-block" style="padding-top:120.00%;"><img id="P5u4zYQs5ZvG5TAnrthGhE" name="Apple Watch SE 3 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/P5u4zYQs5ZvG5TAnrthGhE.jpg" mos="" align="middle" fullscreen="" width="1250" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Apple Watch SE 3 sports a lot of new features that redefine Apple's entry-level smartwatch. Among them, you'll find an always-on display, S10 processor, and better health features, such as support for Sleep Score and Workout Buddy. (The latter is powered by Apple Intelligence and requires an iPhone 15 Pro or higher). In our <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-se-3-review" data-dimension112="1df69ed6-879c-11f1-9c73-8db59ee46abd" data-action="Deal Block" data-label="Apple Watch SE 3 review" data-dimension48="Apple Watch SE 3 review" data-dimension25="$219">Apple Watch SE 3 review</a>, we called it the best smartwatch value around. It's available in 40mm and 44mm designs. <a class="view-deal button" href="https://www.amazon.com/dp/B0FQFNRH72" target="_blank" rel="nofollow" data-dimension112="1df69ed6-879c-11f1-9c73-8db59ee46abd" data-action="Deal Block" data-label="Apple Watch SE 3 review" data-dimension48="Apple Watch SE 3 review" data-dimension25="$219">View Deal</a></p></div><div class="product"><a data-dimension112="1df69f44-879c-11f1-8afa-0776af3b4001" data-action="Deal Block" data-label="Apple Watch 11 review" data-dimension48="Apple Watch 11 review" data-dimension25="$299" href="https://www.amazon.com/dp/B0FQF9ZX7P" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1264px;"><p class="vanilla-image-block" style="padding-top:118.67%;"><img id="zpTresKtjPzk37YdCtdZd9" name="Apple Watch 11 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zpTresKtjPzk37YdCtdZd9.jpg" mos="" align="middle" fullscreen="" width="1264" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Apple Watch 11 features an always-on screen that's 2x more scratch resistant than its predecessor. It's powered by Apple's S10 processor and packs an improved 24-hour battery, 5G radio (cellular model only), Sleep Score, and hypertension alerts. In our <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-11-review" data-dimension112="1df69f44-879c-11f1-8afa-0776af3b4001" data-action="Deal Block" data-label="Apple Watch 11 review" data-dimension48="Apple Watch 11 review" data-dimension25="$299">Apple Watch 11 review</a> we said it's the best overall Apple Watch for most people and one of the only smartwatches on the market with hypertension alerts, detecting signs of possible high blood pressure.<a class="view-deal button" href="https://www.amazon.com/dp/B0FQF9ZX7P" target="_blank" rel="nofollow" data-dimension112="1df69f44-879c-11f1-8afa-0776af3b4001" data-action="Deal Block" data-label="Apple Watch 11 review" data-dimension48="Apple Watch 11 review" data-dimension25="$299">View Deal</a></p></div><div class="product"><a data-dimension112="44423074-8791-11f1-8552-71f5c166c217" data-action="Deal Block" data-label="MacBook Neo review" data-dimension48="MacBook Neo review" data-dimension25="$599" href="https://www.apple.com/shop/refurbished/mac/macbook-neo" 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:61.07%;"><img id="Lg4Dvg68j9SbB5CPNrTEpH" name="MacBook Neo deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg" mos="" align="middle" fullscreen="" width="1500" height="916" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With the MacBook Neo currently costing $100 more than its debut price, this deal is even more enticing. The Apple Store has refurbished models on sale from $599. The base model includes a 13-inch Liquid Retina (2408 x 1506) display, an A18 Pro chipset, 8GB of RAM, a 256GB SSD, and a 1080p FaceTime HD camera. In our <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review" data-dimension112="44423074-8791-11f1-8552-71f5c166c217" data-action="Deal Block" data-label="MacBook Neo review" data-dimension48="MacBook Neo review" data-dimension25="$599">MacBook Neo review</a>, we said no other laptop comes close to the Neo in terms of bang for your buck value and performance.<a class="view-deal button" href="https://www.apple.com/shop/refurbished/mac/macbook-neo" target="_blank" rel="nofollow" data-dimension112="44423074-8791-11f1-8552-71f5c166c217" data-action="Deal Block" data-label="MacBook Neo review" data-dimension48="MacBook Neo review" data-dimension25="$599">View Deal</a></p></div><div class="product"><a data-dimension112="44422ef8-8791-11f1-a6e8-6b3c876689da" data-action="Deal Block" data-label="MacBook Air M5 review" data-dimension48="MacBook Air M5 review" data-dimension25="$1199" href="https://www.amazon.com/dp/B0GR19X8DC" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:60.73%;"><img id="R5hxVnj9RteJKiej8tQbLH" name="MacBook Air M5 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/R5hxVnj9RteJKiej8tQbLH.jpg" mos="" align="middle" fullscreen="" width="1500" height="911" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The base 13-inch MacBook Air M5 now costs $1,299, which is a $200 increase from its debut price. It features a 13.6-inch (2560 x 1664) display, Apple M5 chipset, 16GB of RAM, 512GB SSD, and support for WiFi 7 and Bluetooth 6. In our <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-m5-review" data-dimension112="44422ef8-8791-11f1-a6e8-6b3c876689da" data-action="Deal Block" data-label="MacBook Air M5 review" data-dimension48="MacBook Air M5 review" data-dimension25="$1199">MacBook Air M5 review</a> we said it's the laptop to get for most people and users with an M3 or older chipset will notice a major performance boost. <a class="view-deal button" href="https://www.amazon.com/dp/B0GR19X8DC" target="_blank" rel="nofollow" data-dimension112="44422ef8-8791-11f1-a6e8-6b3c876689da" data-action="Deal Block" data-label="MacBook Air M5 review" data-dimension48="MacBook Air M5 review" data-dimension25="$1199">View Deal</a></p></div><div class="product"><a data-dimension112="4442301a-8791-11f1-8c72-77b3e9f1e67d" data-action="Deal Block" data-label="MacBook Pro M5 review" data-dimension48="MacBook Pro M5 review" data-dimension25="$1849" href="https://www.amazon.com/dp/B0FWD623D1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:60.53%;"><img id="GnpQTG2JTWSenJyfrWydnm" name="MacBook Pro M5 deals" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GnpQTG2JTWSenJyfrWydnm.jpg" mos="" align="middle" fullscreen="" width="1500" height="908" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The new MacBook Pro features Apple's latest M5 chipset, with a 10-core CPU and 10-core GPU. It's designed to deliver a huge boost in AI and graphics performance for everyone from students to creatives. In our <a href="https://www.tomsguide.com/computing/macbooks/macbook-pro-m5-review" data-dimension112="4442301a-8791-11f1-8c72-77b3e9f1e67d" data-action="Deal Block" data-label="MacBook Pro M5 review" data-dimension48="MacBook Pro M5 review" data-dimension25="$1849">MacBook Pro M5 review</a> we said the Editor's Choice machine is a fantastic option for power users who demand a powerful and portable notebook with epic (18 hour) battery life. The base model features a 14.2-inch 3024 x 1964 Retina display, Apple M5 CPU, 16GB of RAM, and a 512GB SSD.<br><strong>Price check: </strong><a href="https://www.bestbuy.com/product/apple-macbook-pro-14-inch-laptop-apple-m4-pro-chip-built-for-apple-intelligence-24gb-memory-512gb-ssd-silver/JJGCQ8H5RP" target="_blank" rel="nofollow"><strong>$1,999 @ Best Buy</strong></a><a class="view-deal button" href="https://www.amazon.com/dp/B0FWD623D1" target="_blank" rel="nofollow" data-dimension112="4442301a-8791-11f1-8c72-77b3e9f1e67d" data-action="Deal Block" data-label="MacBook Pro M5 review" data-dimension48="MacBook Pro M5 review" data-dimension25="$1849">View Deal</a></p></div><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&rows=6&view_mode=savings_squad&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 getTimeAgo(dateString) {        if (!dateString) return '';        const date = new Date(dateString);        const now = new Date();        const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);        if (diffInSeconds < 60) return 'Just now';        const diffInMinutes = Math.floor(diffInSeconds / 60);        if (diffInMinutes < 60) return `${diffInMinutes} min${diffInMinutes > 1 ? 's' : ''} ago`;        const diffInHours = Math.floor(diffInMinutes / 60);        if (diffInHours < 24) return `${diffInHours} hr${diffInHours > 1 ? 's' : ''} ago`;        const diffInDays = Math.floor(diffInHours / 24);        if (diffInDays < 30) return `${diffInDays} day${diffInDays > 1 ? 's' : ''} ago`;        const diffInMonths = Math.floor(diffInDays / 30);        if (diffInMonths < 12) return `${diffInMonths} mo${diffInMonths > 1 ? 's' : ''} ago`;        const diffInYears = Math.floor(diffInDays / 365);        return `${diffInYears} yr${diffInYears > 1 ? 's' : ''} ago`;      }      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%;      position: relative;      z-index: 20;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      margin: 0 auto;      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-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {      display: grid;      width: 100%;      grid-template-columns: repeat(4, 1fr);      gap: 12px;      margin: 0 auto;      max-width: 800px;    }                 .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;      width: 100%;    }        .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 {      width: 100%;      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;    }    @container tg-df (max-width: 768px) {      .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {        width: 100%;        margin: 0;        margin-bottom: -320px;        padding: 0 16px 320px 16px;        display: flex;        flex-wrap: nowrap;        gap: 8px;        overflow-x: auto;        overflow-y: hidden;        pointer-events: none;        scrollbar-width: none;        -webkit-overflow-scrolling: touch;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }      .tg-df-sort-wrapper {        pointer-events: auto;        flex: 0 0 auto;        width: 175px;        min-width: 175px;      }    }        .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);    }    .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;    }    /*       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: 120px;      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: 16px 16px 8px;      }            .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-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;        width: auto;      }            .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;      }      /* 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;        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;      width: 100vw;      max-width: 1200px;      position: relative;      left: 50%;      transform: translateX(-50%);    }    .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: 14px;      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; }    .tg-df-grid-wrapper { position: relative; }    @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: rgba(255, 255, 255, 0.6);    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .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;    }    .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;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn {      display: inline-flex;      align-items: center;    }    .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::-webkit-scrollbar {      display: none;    }    .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;      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 {    }    .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.40);        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: #1f69ff; 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: #0056e0; 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; }    .tg-df-savings-squad-header { margin-bottom: 24px; text-align: center; display: none; }    .tg-df-banner-img-desktop { display: block; width: 100%; height: auto; margin-bottom: 32px; }    .tg-df-banner-img-mobile { display: none; width: 100%; height: auto; margin-bottom: 32px; }    @container tg-df (max-width: 600px) {      .tg-df-banner-img-desktop { display: none; }      .tg-df-banner-img-mobile { display: block; }    }    .tg-df-header-title { font-size: 28px; font-weight: 700; color: var(--tg-df-text); margin: 32px 0 12px 0; line-height: 1.3; }    .tg-df-header-subtitle { font-size: 16px; color: var(--tg-df-text-muted); margin: 0 0 32px 0; line-height: 1.5; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3Cdiv class="tg-df-savings-squad-header" id="tg-df-savings-squad-header">      \x3Cpicture>        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/xkh2og7m3d1778189998.png" alt="Deals Banner" class="tg-df-banner-img-desktop" />        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/gmak6rtdf41778245089.png" alt="Deals Banner Mobile" class="tg-df-banner-img-mobile" />      \x3C/picture>      \x3Cdiv class="tg-df-header-text">        \x3Ch2 class="tg-df-header-title" id="tg-df-header-title">Editor's Choice Deals\x3C/h2>        \x3Cp class="tg-df-header-subtitle" id="tg-df-header-subtitle">Discover the best discounts currently available, curated daily by the Tom's Guide Savings Squad.\x3C/p>      \x3C/div>    \x3C/div>    \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-carousel-cat" data-query="Televisions" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/wcMxTsHgqu3roMbAx7RLnT-132-100.png" alt="TVs" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">TVs\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Phones" data-pr="over50">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/G3KGaRGzj24F6PUsw4bWpT-132-100.png" alt="Phones" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Phones\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Computing" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/znNvsLzx8NEgNkD9HSFSnT-132-100.png" alt="Computing" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Computing\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Gaming" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/Pgew8yaRQeZFHqHjTzvBnT-132-100.png" alt="Gaming" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Gaming\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Mattresses" data-pr="over500">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/cW7xsaLyesxkHFVSiC4kmT-132-100.png" alt="Mattresses" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Mattresses\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Audio" data-pr="over30">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/pCvBVHuhaQVjKt3VgCjbqT-132-100.png" alt="Audio" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Audio\x3C/span>            \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>        \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-top-bar" id="tg-df-top-bar" style="position: relative; z-index: 100; margin: 0 auto 20px;">        \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>      \x3C/div>    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">              \x3Cdiv class="tg-df-filters-container" style="position: relative; width: 100%; max-width: 800px; margin: 0 auto;">          \x3Cbutton class="tg-df-scroll-btn left" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: -200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M15 18l-6-6 6-6"/>\x3C/svg>          \x3C/button>          \x3Cbutton class="tg-df-scroll-btn right" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: 200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M9 18l6-6-6-6"/>\x3C/svg>          \x3C/button>          \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 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/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();        }        getViewMode() {          console.log("DEBUG getViewMode -> override:", this.viewModeOverride, "editorMode:", this.editorMode);          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();          console.log("[DEBUG] applyLayoutMode CALLED! mode=", mode);          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    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);          const showHeaderDetails = params.get('show_header_details') !== 'false';          const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          const topBarDiv = this.root.querySelector('#tg-df-top-bar');          const headerElement = this.root.querySelector('#tg-df-savings-squad-header');          if (headerElement) {             headerElement.style.display = (mode === 'savings_squad' && showHeaderDetails) ? 'block' : 'none';          }          if (mode === 'carousel') {             this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (topBarDiv) topBarDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.add('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (topBarDiv) topBarDiv.style.display = 'block';             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 (!this.viewModeOverride && initialViewMode) {            this.viewModeOverride = initialViewMode;          }          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Gaming laptops';          }          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 (this.viewModeSelect && params.has('view_mode')) {            this.viewModeSelect.value = 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') || 'date_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }          const headerTitleEl = this.root.querySelector('#tg-df-header-title');          const headerSubtitleEl = this.root.querySelector('#tg-df-header-subtitle');          if (params.has('widget_title') && headerTitleEl) {             headerTitleEl.textContent = params.get('widget_title');          }          if (params.has('widget_subtitle') && headerSubtitleEl) {             headerSubtitleEl.textContent = params.get('widget_subtitle');          }                    // 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) {            if (this.getViewMode() === 'savings_squad') {              this.searchInput.value = '';            } else {              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 !== 'date_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 handleFiltersScroll = () => {            const filters = this.root.querySelector('.tg-df-filters');            const leftBtn = this.root.querySelector('.tg-df-scroll-btn.left');            const rightBtn = this.root.querySelector('.tg-df-scroll-btn.right');            if (filters && leftBtn && rightBtn) {              const { scrollLeft, scrollWidth, clientWidth } = filters;              leftBtn.style.display = scrollLeft > 0 ? 'flex' : 'none';              rightBtn.style.display = Math.ceil(scrollLeft + clientWidth) < scrollWidth - 5 ? 'flex' : 'none';            }          };          const filters = this.root.querySelector('.tg-df-filters');          if (filters) {            filters.addEventListener('scroll', handleFiltersScroll);            window.addEventListener('resize', handleFiltersScroll);            setTimeout(handleFiltersScroll, 100);                        // Also call after rendering dropdowns            const origRenderCategories = this.renderCategories;            if (origRenderCategories) {               this.renderCategories = (...args) => {                 origRenderCategories.apply(this, args);                 setTimeout(handleFiltersScroll, 50);               };            }          }                const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');          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');              }            });          }          const showAutocomplete = () => {             if (this.getViewMode() !== 'savings_squad' || !this.autocompleteDropdown || !this.airedaleTags) return;                          let terms = this.airedaleTags;             if (this.airedaleBrands) {                terms = terms.concat(this.airedaleBrands.map(b => b.formatted_value));             }             terms = [...new Set(terms)];                          const query = this.searchInput.value.trim();             let matches = [];             if (query.length > 0) {                 matches = terms.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase());             } else {                 matches = terms;             }                          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');             }          };          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('focus', showAutocomplete);            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              showAutocomplete();              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  if (this.getViewMode() === 'savings_squad') {                    this.activeDealTag = null;                    this.currentQuery = '';                    if (this.categoryFilter) this.categoryFilter.value = 'all';                    this.fetchDeals('');                  } else {                    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;                                let isTag = false;                if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;                if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;                this.activeDealTag = isTag ? query : null;                                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   if (query.length === 0 && this.getViewMode() === 'savings_squad') {                       if (this.categoryFilter) this.categoryFilter.value = 'all';                   }                   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;                   if (this.categoryFilter && this.airedaleTags.includes(tag)) {                       this.categoryFilter.value = 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 });                            let isTag = false;              if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;              if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;              this.activeDealTag = isTag ? query : null;                            this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 if (query.length === 0 && this.getViewMode() === 'savings_squad') {                     if (this.categoryFilter) this.categoryFilter.value = 'all';                 }                 this.fetchDeals(query);              }            });          }          if(this.sortSelect && this.sortSelect.querySelector('option[value="date_desc"]') === null) {              const option = document.createElement('option');              option.value = "date_desc";              option.text = "Newest First";              this.sortSelect.insertBefore(option, this.sortSelect.firstChild);          }          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;               if (val) {                 this.currentQuery = val;               } else {                 if (this.searchInput && this.currentQuery === document.querySelector('#tg-df-brand-trigger')?.getAttribute('data-active-brand')) {                     // don't clear current query if a brand is selected                 } else if (this.searchInput) {                     this.currentQuery = '';                     this.searchInput.value = '';                 }               }               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 = 'date_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 fetchDeals(query) {          this.showLoading();          this.deals = [];          this.displayLimit = this.getRowsLimit();                    try {            console.log("getViewMode returns:", this.getViewMode());            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad();            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query);               } else {                 await this.fetchHawkDeals(query);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const siteParam = this.website || 'tomsguide';            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&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=${siteParam}&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 && this.currentQuery) {             const tagMatch = this.airedaleTags.find(t => t.toLowerCase() === this.currentQuery.toLowerCase());             if (tagMatch) {                this.activeDealTag = tagMatch;             }          }          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const siteParam = this.website || 'tomsguide';             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&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 seenUrls = new Set();                    let overallBrandsCounts = {};                    // First pass: extract ALL brands from topArticles so the dropdown has all options          topArticles.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) => {                const data = block.data || {};                if (data.brand) {                   const cleanBrand = data.brand.replace(/^\d+\.\s*/, '').trim();                   overallBrandsCounts[cleanBrand] = (overallBrandsCounts[cleanBrand] || 0) + 1;                }             });          });          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();                }                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;                   }                }                                if (externalUrl) {                   if (seenUrls.has(externalUrl)) return;                  seenUrls.add(externalUrl);                }                                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 || '',                   authorName: article.articleauthortext ? article.articleauthortext[0] : (article.articleauthor ? article.articleauthor[0] : ''),                   authorRole: article.articleauthorrole ? article.articleauthorrole[0] : '',                   authorImage: article.articleauthormedia ? article.articleauthormedia[0] : '',                   documentUrl: article.documenturl ? article.documenturl[0] : '',                   modifiedDate: article.contentmodifieddate || article.modifieddate || ''                });             });          });                    const airedaleBrandsList = Object.keys(overallBrandsCounts).map(b => ({              formatted_value: b,              count: overallBrandsCounts[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) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    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 : 'date_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}                ${_div}              ${_div}              \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin:0; border-radius:0;">${_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)}${_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 = 'View Deal';              if (isSavingsSquadMode) {                priceGroupHtml = ``;              } else {                priceGroupHtml = `                  \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 = isSavingsSquadMode ? `` : `                \x3Cdiv class="tg-df-card-price-group">                  \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 tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                          \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                          \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                            var c = this.parentNode;                            if (this.dataset.expanded === 'true') {                              var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                              if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                              pd.style.display = '-webkit-box';                              pd.style.webkitLineClamp = '3';                              this.textContent = 'READ MORE';                              this.style.position = 'absolute';                              this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                              this.style.paddingLeft = '16px';                              this.dataset.expanded = 'false';                            } else {                              var pd = this.previousElementSibling;                              pd.style.display = 'inline';                              pd.style.webkitLineClamp = 'unset';                              this.textContent = 'READ LESS';                              this.style.position = 'static';                              this.style.background = 'transparent';                              this.style.paddingLeft = '4px';                              this.dataset.expanded = 'true';                              pd.appendChild(this);                            }                          ">READ MORE${_button}                        \x3C/div>` : ''}                      ${_div}                    ${_div}                    ${deal.authorName ? `                      \x3Cdiv class="tg-df-author-line-mobile" style="padding: 0 0 12px 0; background: transparent;">                         \x3Cdiv style="display: flex; align-items: center; gap: 12px;">                            ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="40" height="40" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 40px; min-height: 40px;">` : ''}                            \x3Cdiv style="display: flex; flex-direction: column;">                               \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">\x3Cspan style="color: #FF6600;">${this.escapeHTML(deal.merchant)}${_span} deal recommended by:${_div}                               \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.3;">                                  \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                  ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                  ${deal.modifiedDate ? `\x3Cdiv style="color: var(--tg-df-text-muted); margin-top: 2px;">${getTimeAgo(deal.modifiedDate)}${_div}` : ''}                               ${_div}                            ${_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>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}                  \x3Cdiv class="tg-df-card-merchant-wrapper" style="position: absolute; bottom: 0; right: 0; background: transparent; padding: 8px 12px; z-index: 10;">                     \x3Cspan class="tg-df-card-merchant-pill" style="text-align: right; margin-bottom: 0;" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                ${_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 ? `\x3Cdiv class="tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                    \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                    \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                      var c = this.parentNode;                      if (this.dataset.expanded === 'true') {                        var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                        if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                        pd.style.display = '-webkit-box';                        pd.style.webkitLineClamp = '3';                        this.textContent = 'READ MORE';                        this.style.position = 'absolute';                        this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                        this.style.paddingLeft = '16px';                        this.dataset.expanded = 'false';                      } else {                        var pd = this.previousElementSibling;                        pd.style.display = 'inline';                        pd.style.webkitLineClamp = 'unset';                        this.textContent = 'READ LESS';                        this.style.position = 'static';                        this.style.background = 'transparent';                        this.style.paddingLeft = '4px';                        this.dataset.expanded = 'true';                        pd.appendChild(this);                      }                    ">READ MORE${_button}                  \x3C/div>` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${deal.authorName ? `                    \x3Cdiv class="tg-df-author-line-desktop" style="padding: 0 0 ${isSavingsSquadMode ? 0 : 12}px 0;">                       \x3Cdiv style="display: flex; align-items: center; gap: 10px;">                          ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="36" height="36" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 36px; min-height: 36px;">` : ''}                          \x3Cdiv style="display: flex; flex-direction: column;">                             \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">Recommended by:${_div}                             \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.2;">                                \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                ${deal.modifiedDate ? `\x3Cspan style="color: var(--tg-df-text-muted);"> • ${getTimeAgo(deal.modifiedDate)}${_span}` : ''}                             ${_div}                          ${_div}                       ${_div}                    ${_div}                    ` : ''}                    ${priceGroupHtml}                  ${_div}                ${_div}                \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta" style="text-decoration: none; border-radius: 0;">${ctaText}${_a}              ${_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) {            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;">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); }          setTimeout(() => {            const contents = this.root.querySelectorAll('.tg-df-card-desc-content');            contents.forEach(p => {              if (p.scrollHeight > p.clientHeight || p.scrollHeight > 60) {                if (p.nextElementSibling) {                  p.nextElementSibling.style.display = 'block';                }              }            });                        // 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');            }            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);          const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              this.displayLimit += this.getRowsLimit();              this.render();            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();          } 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[ New report details huge Mac overhaul for MacBooks, iMacs and Mac Studio ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/new-report-details-huge-mac-overhaul-for-macbooks-imacs-and-mac-studio</link>
                                                                            <description>
                            <![CDATA[ A new report claims that Apple is giving its entire line of Mac computers a major overhaul. Here's what to potentially expect and when. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Vsxmt9GHGYTHgDzZyVwK28</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/5jsbAXhogUzmnuzcd5jTCR-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 18:25:28 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Desktop Computers]]></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.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/5jsbAXhogUzmnuzcd5jTCR-1280-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/5jsbAXhogUzmnuzcd5jTCR-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple’s Mac lineup will get a major overhaul starting later this year. That’s according to Bloomberg reporter and Apple tipster <a href="https://www.bloomberg.com/news/articles/2026-07-22/apple-to-launch-new-macbook-air-imac-macbook-pro-neo-mac-mini-mac-studio" target="_blank">Mark Gurman</a>, whose sources gave him a rundown of the upcoming Macs.</p><p>Things will kick off with a refreshed entry-level 14-inch MacBook Pro featuring the new <a href="https://www.tomsguide.com/computing/macbooks/macbook-pro-could-get-two-upgrades-this-year-with-apples-m6-chip-arriving-early">M6 chip</a>, along with a new iMac that will also sport the yet-to-be-announced processor. Development of these Macs is reportedly complete, but they aren’t likely to ship until the fall.</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:3678px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PVynuTDwCUjjRjzbvrwEuU" name="MacBook Neo A18 review-LIST2" alt="MacBook Neo shown on desk" src="https://cdn.mos.cms.futurecdn.net/PVynuTDwCUjjRjzbvrwEuU.jpg" mos="" align="middle" fullscreen="" width="3678" height="2069" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The next biggest release should be higher-end 14-inch and 16-inch <a href="https://www.tomsguide.com/news/macbook-pro-oled">MacBooks with OLED panels</a> and a new design. These brand-new editions to the MacBook line will have M5 Pro and M5 Max chips. Apple will reportedly release these MacBooks in late 2026 or early 2027.</p><p>New MacBook Air models are expected early in 2027. These 13- and 15-inch laptops will apparently resemble the current models, though Apple is reportedly developing an OLED model for 2028. There will be another MacBook Pro with a new design and packing an M7 chip sometime in 2027.</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="bNV9jhCAcApnh37Y5sf5HS" name="TG_Mac-Studio-Display-LIST.jpg" alt="Mac Studio on a desk hooked up to a Studio DIsplay" src="https://cdn.mos.cms.futurecdn.net/bNV9jhCAcApnh37Y5sf5HS.jpg" mos="" align="middle" fullscreen="" width="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>Additionally, Apple is working on a refreshed <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>. This model reportedly runs on the updated A19 Pro chip and more RAM. The report doesn’t say anything about pricing or when this laptop will launch.</p><p>Gurman’s report also says that a new iMac with an OLED screen is in the works, but won’t be released until later. Apple is also planning new Mac mini and Mac Studio models with refreshed chips. This includes the M5 Pro and M6 for the Mac mini, and the M5 Max and M5 Ultra for the Mac Studio.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XmVyPe"></div>                            </div>                            <script src="https://kwizly.com/embed/XmVyPe.js" async></script><h2 id="outlook">Outlook</h2><p>As always, take this report with a grain of salt, as Apple hasn’t made any official announcements about these Mac models. There’s certainly a lot to look forward to if all of this is accurate, though with the ongoing RAM crisis, it’s anyone’s guess when these computers will actually release and how much they’ll cost. As always, stay tuned for more as we hear further reports.</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/should-you-lease-your-next-iphone-what-you-need-to-know-about-the-rumored-apple-upgrade-program">What you need to know about the rumored 'Apple Upgrade' program</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-finally-threw-android-users-a-bone-with-this-new-ios-27-photo-feature-heres-how">Apple finally threw Android users a bone with this new iOS 27 photo feature</a></li><li><a href="https://www.tomsguide.com/ai/the-4-biggest-allegations-in-apples-lawsuit-against-openai">The 4 biggest allegations in Apple's lawsuit against OpenAI</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="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = this.getRowsLimit();          } else {             this.displayLimit += this.getRowsLimit();          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += this.getRowsLimit();                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');               document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to download the macOS Golden Gate public beta right now ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/macos/how-to-download-the-macos-golden-gate-public-beta-right-now</link>
                                                                            <description>
                            <![CDATA[ Apple's macOS Golden Gate public beta is now available. Here's how you can download it and test out all the new Apple Intelligence features for Macs. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Nqh3m4FZxMAgw4pbpXa4vh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/6onBfgc6zZedV7zQBmGFw8-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 14 Jul 2026 23:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[macOS]]></category>
                                                    <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Software]]></category>
                                                    <category><![CDATA[Operating Systems]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/6onBfgc6zZedV7zQBmGFw8-1280-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-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/computing/macos/macos-27">macOS Golden Gate</a> public beta is now live, giving you a chance to check out all the new features coming to the <a href="https://www.tomsguide.com/best-picks/best-macbook">best MacBooks</a>.</p><p>Expected to launch this Fall, macOS Golden Gate primarily focuses on updating Apple Intelligence and Siri, with the latter now officially called <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 don’t get many new features, but improvements to Liquid Glass’s readability, easier customization, and smoother performance make for an overall better experience.</p><p>While Apple’s public betas are generally more stable than the developer builds, it might still be buggy and could cause issues for your Mac. I’ve never experienced serious issues using any of these betas over the years, but it’s worth being cautious. With that said, here’s how to download the macOS Golden Gate public beta.</p><h2 id="how-to-download-the-macos-golden-gate-developer-beta">How to download the macOS Golden Gate developer beta</h2><p>Downloading the macOS Golden Gate public beta is pretty simple. First, enroll your Apple ID in <a href="https://go.redirectingat.com/?id=92X1584493&xcust=tomsguide_us_6501826667653749260&xs=1&url=https%3A%2F%2Fbeta.apple.com%2F&sref=https%3A%2F%2Fwww.tomsguide.com" target="_blank">Apple's Beta Program</a> and make sure your Mac is compatible. 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><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>. Similarly, <strong>you can also click on 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>                </section><section class="howto-block">                    <h3>3. Enable Beta Updates and select macOS Golden Gate</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/Pgd6SzoQMj9LQ3GEeqnBgC.jpg"                                        alt="macOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/Pgd6SzoQMj9LQ3GEeqnBgC.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Apple)</div></figure>                    <p><p>Then, make sure the Beta Updates setting is switched to On. If it's switched Off, turn it on by clicking the corresponding button. <strong>When the Beta Updates menu opens, select macOS Golden Gate public Beta from the drop-down menu</strong>. Double-check that your Apple account is enrolled in Apple’s Beta Program if you don’t see the beta listed.</p></p>                </section><section class="howto-block">                    <h3>4. Install the beta</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/vuXcGtL37LYW58XQFZLKmg.jpg"                                        alt="macOS 27"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/vuXcGtL37LYW58XQFZLKmg.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Apple)</div></figure>                    <p><p>Once that's done, <strong>you should see the macOS 27 public Beta appear as available to download</strong>. All you have to do now is <strong>hit the Upgrade Now button to start downloading</strong>, and you're all set!</p></p>                </section><p>That’s all that’s required to download the macOS Golden Gate public beta. 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/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[ I’ve finally found my forever dock for the Mac mini M4 — and it actually fixes the hidden power button problem ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/apple-desktops/i-thought-i-was-done-customizing-my-mac-mini-m4-until-i-tried-the-last-dock-ill-ever-need</link>
                                                                            <description>
                            <![CDATA[ Just when I thought I’d never need another dock for my Mac mini M4, Ugreen’s docking station surprised me with more ports and power than the rest. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">zoC8kjz6smwt65yf3SGjW4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7GR9s7Gz5QhdDA2YULUg8d-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 02 Jul 2026 10:04:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/7GR9s7Gz5QhdDA2YULUg8d-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Ugreen Mac Mini M4 Dock &amp; Stand installed underneath a Mac mini M4 mini PC on a desk]]></media:description>                                                            <media:text><![CDATA[The Ugreen Mac Mini M4 Dock &amp; Stand installed underneath a Mac mini M4 mini PC on a desk]]></media:text>
                                <media:title type="plain"><![CDATA[The Ugreen Mac Mini M4 Dock &amp; Stand installed underneath a Mac mini M4 mini PC on a desk]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7GR9s7Gz5QhdDA2YULUg8d-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Besides the iMac, there’s never been an Apple desktop quite like the <a href="https://www.tomsguide.com/computing/apple-desktops/mac-mini-m4-reasons-to-buy-and-skip">Mac mini</a>. It’s small yet powerful while still being whisper-quiet on your desk — and with the M4 model, you finally get front-facing ports.</p><p>Still, just like they often do with other Apple products, accessory makers were quick to try and fix its biggest flaws: an inaccessible power button and the lack of full-sized ports. While Cupertino wanted you to leave your new machine running full-time and toss out all your USB-A cables, many people like myself just weren’t ready to be that drastic.</p><p>That’s why the first accessory I added to my new desktop was a USB hub that doubled as a stand. I had one on my older <a href="https://www.tomsguide.com/computing/desktop-computers/i-just-broke-the-first-rule-of-buying-apple-products-i-bought-a-new-mac-mini-ahead-of-the-m4-mac-launch">M2 model</a> for the same reason, so when Satechi released an upgraded version for this new completely redesigned Apple mini PC, I was ecstatic.</p><p>After using <a href="https://www.tomsguide.com/computing/peripherals/i-added-satechis-new-usb-c-hub-and-stand-to-my-mac-mini-m4-and-its-the-perfect-upgrade">Satechi’s M4 Hub & Stand</a> for months, I eventually swapped it out for a similar accessory from Orico that transformed my Mac mini into a <a href="https://www.tomsguide.com/computing/peripherals/i-gave-my-mac-mini-m4-the-ultimate-upgrade-with-this-mac-pro-style-case-and-it-fixes-some-of-my-biggest-complaints">miniature Mac Pro</a>. Both devices worked well, but recently, I decided to give one more dock a chance, and I’m glad I did.</p><p>I didn’t expect to like this add-on from a company best known for its chargers and <a href="https://www.tomsguide.com/computing/i-thought-my-first-nas-was-enough-but-this-ai-powered-behemoth-is-the-private-brain-my-home-office-needed">NAS devices</a>, but Ugreen just might have made the most useful one yet. Here’s why.</p><div class="product"><a data-dimension112="6fb25403-b7d2-4625-8721-e07f2e5f3902" data-action="Deal Block" data-label="This versatile 11-in-1 stand and hub for your Mac mini M4 or Mac mini M4 Pro features a sleek silver finish that blends seamlessly with Apple's desktop. It expands your workstation with plenty of front and rear ports, lets you add up to 8TB of high-speed NVMe storage, and uses a clever built-in mechanical pass-through lever to make accessing your Mac mini M4’s power button a breeze." data-dimension48="This versatile 11-in-1 stand and hub for your Mac mini M4 or Mac mini M4 Pro features a sleek silver finish that blends seamlessly with Apple's desktop. It expands your workstation with plenty of front and rear ports, lets you add up to 8TB of high-speed NVMe storage, and uses a clever built-in mechanical pass-through lever to make accessing your Mac mini M4’s power button a breeze." data-dimension25="$55" href="https://www.amazon.com/UGREEN-Stand-Enclosure-10Gbps-Reader/dp/B0GQ4DN6MH" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="btnU7gvC6epL46ZmRw2KpL" name="Mac Mini M4 Dock & Stand" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/btnU7gvC6epL46ZmRw2KpL.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This versatile 11-in-1 stand and hub for your Mac mini M4 or Mac mini M4 Pro features a sleek silver finish that blends seamlessly with Apple's desktop. It expands your workstation with plenty of front and rear ports, lets you add up to 8TB of high-speed NVMe storage, and uses a clever built-in mechanical pass-through lever to make accessing your Mac mini M4’s power button a breeze. <a class="view-deal button" href="https://www.amazon.com/UGREEN-Stand-Enclosure-10Gbps-Reader/dp/B0GQ4DN6MH" target="_blank" rel="nofollow" data-dimension112="6fb25403-b7d2-4625-8721-e07f2e5f3902" data-action="Deal Block" data-label="This versatile 11-in-1 stand and hub for your Mac mini M4 or Mac mini M4 Pro features a sleek silver finish that blends seamlessly with Apple's desktop. It expands your workstation with plenty of front and rear ports, lets you add up to 8TB of high-speed NVMe storage, and uses a clever built-in mechanical pass-through lever to make accessing your Mac mini M4’s power button a breeze." data-dimension48="This versatile 11-in-1 stand and hub for your Mac mini M4 or Mac mini M4 Pro features a sleek silver finish that blends seamlessly with Apple's desktop. It expands your workstation with plenty of front and rear ports, lets you add up to 8TB of high-speed NVMe storage, and uses a clever built-in mechanical pass-through lever to make accessing your Mac mini M4’s power button a breeze." data-dimension25="$55">View Deal</a></p></div><h2 id="docked-and-fully-loaded">Docked and fully loaded</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="EWwi9tx78jjhtaC4Q3Yg9g" name="Ugreen Mac Mini M4 Docking Station-5" alt="The front ports on the Ugreen Mac Mini M4 Dock & Stand" src="https://cdn.mos.cms.futurecdn.net/EWwi9tx78jjhtaC4Q3Yg9g.jpg" mos="" align="middle" fullscreen="" width="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 first glance, I wouldn’t blame you for mistaking Ugreen’s <a href="https://www.tomsguide.com/computing/desktop-computers/mac-mini-m4-review">Mac mini M4</a> dock for Satechi’s. Both have a similar design and a matching silver finish, but Ugreen trades a third USB-A port up front for a full-sized SD card reader sitting next to a microSD one. It’s also slightly taller, measuring at just over an inch versus Satechi's sleeker, sub-inch height.</p><p>The one thing that really surprised me about Ugreen’s dock, though, is that it isn’t made from aluminum like Satechi’s. Instead, it’s entirely made from plastic with a very convincing paint job. Although this might sound like a downgrade at first, by opting for plastic over anodized aluminum, Ugreen solved one of the biggest issues docks like this have when sitting under your Mac mini: signal interference. From Wi-Fi to Bluetooth, having a big block of metal underneath one of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a> can significantly hamper your connections.</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="JgtGrFR75n9NgJn6anBx7j" name="Ugreen Mac Mini M4 Docking Station-4" alt="The SSD slot on the underside of the Ugreen Mac Mini M4 Dock & Stand" src="https://cdn.mos.cms.futurecdn.net/JgtGrFR75n9NgJn6anBx7j.jpg" mos="" align="middle" fullscreen="" width="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 you flip Ugreen’s dock over, you can easily add more storage to your Mac mini without having to pay the Apple Tax. Unlike Satechi’s hub, which caps out at 4TB, you can add up to an 8TB drive here. Now, I know that’s easier said than done, as we’re currently living through <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAMageddon</a> which has also greatly affected storage prices. However, it’s nice to have the option to add all that extra room, and who knows — maybe once the AI boom dies down, you just might be able to.</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="XGpo7AxYQ8hqAYCZ3zKXHm" name="Ugreen Mac Mini M4 Docking Station-1-LEDE" alt="The rear ports on the Ugreen Mac Mini M4 Dock & Stand" src="https://cdn.mos.cms.futurecdn.net/XGpo7AxYQ8hqAYCZ3zKXHm.jpg" mos="" align="middle" fullscreen="" width="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>Besides that extra storage potential, it’s the rear ports that convinced me to give Ugreen’s dock a try in the first place. While Satechi keeps all of its connectivity up front and leaves the back bare, Ugreen did the complete opposite. You still get the hardwired USB-C cable that plugs into your Mac mini to get things started, but the back expands into even more ports than you do on the <a href="https://www.tomsguide.com/best-picks/best-macbook">best MacBooks</a>, including three more USB-A ports and two USB-C ones.</p><p>Interestingly, Ugreen also included another USB-C port on the back. Instead of using it to connect more accessories, it’s designed to plug directly into a power adapter, as the “IN 5V” label underneath it suggests. You see, with an 11-in-1 hub like this one, there’s no way you’d be able to reliably run all of those rear connections, the front card readers, and a high-speed SSD off the Mac mini’s bus power alone. By plugging Ugreen’s dock into a power strip underneath your desk, you completely avoid slow data transfer speeds, disconnected peripherals, and worst of all, random SSD disconnects that could corrupt your data.</p><p>If all those rear ports and extra power weren’t enough, Ugreen’s Mac mini M4 dock has one more trick up its sleeve that completely took me by surprise.</p><h2 id="power-with-a-twist">Power with a twist</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="x9DNf9WcQjNwNt4vzRWKh5" name="Ugreen Mac Mini M4 Docking Station-6" alt="The Ugreen Mac Mini M4 Dock & Stand underneath a Mac mini M4 mini PC in a desk setup" src="https://cdn.mos.cms.futurecdn.net/x9DNf9WcQjNwNt4vzRWKh5.jpg" mos="" align="middle" fullscreen="" width="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 I’m currently in the process of reviewing MSI’s new <a href="https://www.tomsguide.com/computing/monitors/i-tried-msis-new-pro-max-qd-oled-monitor-and-it-fixes-my-biggest-gripes-with-the-apple-studio-display">Pro Max QD-OLED Mac monitor</a>, I decided to set up my Mac mini M4 with Ugreen’s dock next to it. However, as this is one of the rare Mac monitors you can also play PC games on — unlike Apple’s new <a href="https://www.tomsguide.com/computing/monitors/apple-studio-display-xdr-review">Studio Display XDR</a> — I also have the <a href="https://www.tomsguide.com/computing/mini-pcs/khadas-mind-2s-review">Khadas Mind 2S</a> with the company’s <a href="https://www.tomsguide.com/computing/mini-pcs/i-gave-my-favorite-pocketable-mini-pc-an-instant-upgrade-with-this-docking-station-and-now-its-a-full-fledged-gaming-rig">Mind Graphics 2</a> eGPU next to it.</p><p>In my testing, Ugreen’s dock for the Mac mini M4 worked in a similar way to Satechi’s. It gave me quick access to full-sized ports and an SD card reader without having to use a bulky dongle. One thing I prefer about it, though, is that with Ugreen’s dock, I can hide the 2.4GHz USB dongles for my keyboard and trackball mouse at the rear instead of having them front and center like with Satechi’s dock. Likewise, if you need to run cables from the back of your Mac mini behind your desk, this dock is the better option hands down.</p><p>I didn’t think to test and compare the Wi-Fi speeds on my Mac mini when using these two docks. However, with Ugreen’s, I didn’t notice any interference at all, nor did my speeds dip down. If you want me to put both docks through a Wi-Fi speed showdown, let me know in the comments below.</p><p>Even though I’ve come to terms with the <a href="https://www.tomsguide.com/computing/mini-pcs/i-hated-the-mac-mini-m4s-power-button-until-i-accidentally-proved-apple-was-right">Mac mini’s awkward power button placement</a> after leaving it on for over a month, it’s still nice to be able to easily reach it. While Satechi has a standard cutout to make it more accessible, Ugreen took things a step further.</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="DvvrsSUrLnhQR2B6qW3Wc8" name="Ugreen Mac Mini M4 Docking Station-2" alt="A person using the Ugreen Mac Mini M4 Dock & Stand to more easily reach the Mac mini M4's power button" src="https://cdn.mos.cms.futurecdn.net/DvvrsSUrLnhQR2B6qW3Wc8.jpg" mos="" align="middle" fullscreen="" width="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 the top left corner of Ugreen’s dock, there’s a physical plastic pass-through lever that makes pressing the Mac mini’s power button almost effortless. A simple press up and your Mac mini magically springs to life, while holding it down while the device is on brings up Apple’s shutdown menu. It’s a small detail, but in my day-to-day use, it made a noticeable difference.</p><p>Now, if you’re thinking about adding this dock underneath your own Mac mini, you do need to be careful. You see, Ugreen actually makes two docks for this mini PC, not just a single one. The $89 base version doesn’t have an SSD slot on the bottom, nor does it have this lever. Instead, it uses a basic cutout just like Satechi’s.</p><p>For $10 more, though, you can get the dock I have here which supports up to an 8TB SSD. Because it houses that drive, it’s slightly taller, hence the inclusion of that ingenious power button lever at the back.</p><h2 id="a-final-docking-place">A final docking place</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1976px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="wKuFBx5mqqQ7ySR4yiSakD" name="mac-mini-docks-vs" alt="A side by side shot showing Satechi's Mac mini M4 hub and stand and Orico's Mac Pro-style case for the Mac mini M4" src="https://cdn.mos.cms.futurecdn.net/wKuFBx5mqqQ7ySR4yiSakD.jpg" mos="" align="middle" fullscreen="" width="1976" height="1112" attribution="" endorsement="" class="inline"></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 only so many times you can redo your Mac mini M4 setup, and after years of experimentation, I think I’ve finally found my forever dock.</p><p>While I love how Satechi’s standard dock is an exact match to the design and materials Apple used, its lack of rear ports and smaller SSD capacity hold it back. Alternatively, you could pair your Mac mini with <a href="https://www.tomsguide.com/computing/peripherals/i-tested-satechis-new-thunderbolt-5-cubedock-and-it-works-great-with-my-macbook-pro-but-i-keep-mistaking-it-for-a-mac-mini-m4">Satechi’s Thunderbolt 5 CubeDock</a> if you want even more power, much higher data bandwidth and support for up to an 8TB SSD. Then again, that professional powerhouse costs $399 on its own, whereas all of these other docks sit comfortably under $100.</p><p>Orico’s dock, on the other hand, is as much of an enclosure for Apple’s mini PC as it is a dock. I’ll admit, it did look really cool on my desk. However, it forces your Mac mini into an awkward sideways position, meaning you lose out on seeing the beauty and compactness of Apple’s redesign. It does support up to an 8TB SSD, but you are ultimately left with fewer ports overall.</p><p>Having tried all three of these options for extended periods, Ugreen’s is my favorite yet, and for good reason. Those extra ports and having them hidden at the back really make a massive difference. At the same time, since it can be independently powered, I know that all of my connected devices won’t be constantly fighting for wattage.</p><p>You really can’t go wrong with any of these docks, but the right one for you will depend entirely on your specific workflow. If you just managed to pick up a new Mac mini or you’re looking to give your current setup a serious upgrade, at least you have plenty of great options.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/i-brought-a-mini-pc-with-me-on-my-last-trip-and-id-do-it-again-in-a-heartbeat">I’ve reviewed a ton of mini PCs and my favorite Mac mini alternative just got cooler and quieter</a></li><li><a href="https://www.tomsguide.com/computing/monitors/i-went-big-on-a-budget-with-this-40-inch-ultrawide-monitor-and-its-incredibly-immersive-without-breaking-the-bank">I went all-in on this 40-inch ultrawide and it’s incredibly immersive without breaking the bank</a></li><li><a href="https://www.tomsguide.com/computing/peripherals/i-thought-a-vertical-mouse-was-no-match-for-my-trackball-until-i-tried-one-and-now-im-never-going-back">I finally tried a vertical mouse and it was the ergonomic upgrade my desk setup was missing — here’s why</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Steam Machine is too expensive, so I’m telling my friends to just buy one of these gaming PCs instead (and install SteamOS on them) ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/gaming-desktops/steam-machine-is-too-expensive-so-im-telling-my-friends-to-just-buy-one-of-these-gaming-pcs-instead-and-install-steamos-on-them</link>
                                                                            <description>
                            <![CDATA[ Valve officially priced the Steam Machine at an eye-watering $1,049. As a budget tester, here are 5 Prime Day gaming PC deals that offer better performance for less. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Kzi2WRAZbhTXd3SwAXUsQm</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/MjMrB7EKGr37w2SxnwKBK4-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 23 Jun 2026 11:36:38 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Desktops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/MjMrB7EKGr37w2SxnwKBK4-1280-80.jpg">
                                                            <media:credit><![CDATA[Future / Valve]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Steam Machine alternatives]]></media:description>                                                            <media:text><![CDATA[Steam Machine alternatives]]></media:text>
                                <media:title type="plain"><![CDATA[Steam Machine alternatives]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/MjMrB7EKGr37w2SxnwKBK4-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I was so excited for the Steam Machine, and then <a href="https://www.tomsguide.com/gaming/pc-gaming/valves-steam-machine-is-ready-to-launch-starting-at-usd1-049-im-getting-one-to-review-and-im-taking-your-questions-live">Valve charged $1,049 for it</a>…yikes. As a PC gaming expert, I can point to many <a href="https://www.tomsguide.com/live/news/prime-day-2026-handpicked-editor-recommended-deals-live">current Prime Day deals happening right now</a> that give you more performance for less money.</p><p>While the price <em>could </em>have been a lot worse, it really puts this console/mini PC hybrid into no man’s land here — a place where you could get much more bang for your buck. Granted, you won’t get that cute little 6x6-inch cube build, but I always follow the bottom line here.</p><p>Plus, with <a href="https://www.tomsguide.com/gaming/valve-confirms-you-can-build-your-own-steam-machine-with-latest-steamos-update">SteamOS being updated so you can install it on your own computer easily,</a> there’s a chance here to get yourself a Steam box without needing to pay that Valve premium. Though it's worth noting that with some of these Nvidia-based systems, you may want to stick with Windows for just a little longer, as Valve confirmed Team Green GPU support is coming “eventually.”</p><h2 id="prime-day-gaming-pc-deals-for-the-same-price-or-cheaper-than-a-steam-machine">Prime Day gaming PC deals for the same price or cheaper than a Steam Machine</h2><p>So I need to set some expectations here a little. Valve claims the Steam Machine is capable of 4K 60 FPS gameplay, and while that’s <em>technically </em>true with a big AMD FSR caveat, the reality is you’re looking more at 1080p or 1440p gaming.</p><p>All of these systems are capable of around those ranges too.</p><div class="product"><a data-dimension112="53daa893-67d3-43a1-a563-b1f4f1dec40b" data-action="Deal Block" data-label="Doubling the RAM here for $3 less than the 16GB builds below. Yes this tower is bigger than the Micro ATX options you’re about to see, but for the extra headroom in AAA titles and multitasking that 32GB of DDR4 memory can give you, that is significant for 1440p gaming." data-dimension48="Doubling the RAM here for $3 less than the 16GB builds below. Yes this tower is bigger than the Micro ATX options you’re about to see, but for the extra headroom in AAA titles and multitasking that 32GB of DDR4 memory can give you, that is significant for 1440p gaming." data-dimension25="$996" href="https://www.newegg.com/abs-stratos-ruby-gaming-desktop-rtx-5060-core-i5-14400f-32gb-ddr5-1tb-ssd-sr7800x3d9070xt-black/p/N82E16883360936" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1718px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="RrbjjKwkQvtMtrsUz9jur7" name="ABS Cyclone Aqua Gaming PC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/RrbjjKwkQvtMtrsUz9jur7.jpg" mos="" align="middle" fullscreen="" width="1718" height="1718" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Doubling the RAM here for $3 less than the 16GB builds below. Yes this tower is bigger than the Micro ATX options you’re about to see, but for the extra headroom in AAA titles and multitasking that 32GB of DDR4 memory can give you, that is significant for 1440p gaming.<a class="view-deal button" href="https://www.newegg.com/abs-stratos-ruby-gaming-desktop-rtx-5060-core-i5-14400f-32gb-ddr5-1tb-ssd-sr7800x3d9070xt-black/p/N82E16883360936" target="_blank" rel="nofollow" data-dimension112="53daa893-67d3-43a1-a563-b1f4f1dec40b" data-action="Deal Block" data-label="Doubling the RAM here for $3 less than the 16GB builds below. Yes this tower is bigger than the Micro ATX options you’re about to see, but for the extra headroom in AAA titles and multitasking that 32GB of DDR4 memory can give you, that is significant for 1440p gaming." data-dimension48="Doubling the RAM here for $3 less than the 16GB builds below. Yes this tower is bigger than the Micro ATX options you’re about to see, but for the extra headroom in AAA titles and multitasking that 32GB of DDR4 memory can give you, that is significant for 1440p gaming." data-dimension25="$996">View Deal</a></p></div><div class="product"><a data-dimension112="77a0c92a-8fbc-4938-8c51-bc3add3be62c" data-action="Deal Block" data-label="Don’t expect the world with this thing — it is a budget build after all. But this does have the bare essentials to do 1080p gaming (provided you play some AAA titles at a mix of medium to low settings with FSR). The Steam Machine will take a slight lead over this performance-wise, but at $380 cheaper, it’s actually got value for money." data-dimension48="Don’t expect the world with this thing — it is a budget build after all. But this does have the bare essentials to do 1080p gaming (provided you play some AAA titles at a mix of medium to low settings with FSR). The Steam Machine will take a slight lead over this performance-wise, but at $380 cheaper, it’s actually got value for money." data-dimension25="$669" href="https://www.amazon.com/CyberPowerPC-Master-Gaming-Windows-GMA3100A3/dp/B0DXVH416Y" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:573px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="gdHM3PGArMh7MdjWh4pR7W" name="CyberPowerPC Gamer Master" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/gdHM3PGArMh7MdjWh4pR7W.jpg" mos="" align="middle" fullscreen="" width="573" height="573" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Don’t expect the world with this thing — it is a budget build after all. But this does have the bare essentials to do 1080p gaming (provided you play some AAA titles at a mix of medium to low settings with FSR). The Steam Machine will take a slight lead over this performance-wise, but at $380 cheaper, it’s actually got value for money.<a class="view-deal button" href="https://www.amazon.com/CyberPowerPC-Master-Gaming-Windows-GMA3100A3/dp/B0DXVH416Y" target="_blank" rel="nofollow" data-dimension112="77a0c92a-8fbc-4938-8c51-bc3add3be62c" data-action="Deal Block" data-label="Don’t expect the world with this thing — it is a budget build after all. But this does have the bare essentials to do 1080p gaming (provided you play some AAA titles at a mix of medium to low settings with FSR). The Steam Machine will take a slight lead over this performance-wise, but at $380 cheaper, it’s actually got value for money." data-dimension48="Don’t expect the world with this thing — it is a budget build after all. But this does have the bare essentials to do 1080p gaming (provided you play some AAA titles at a mix of medium to low settings with FSR). The Steam Machine will take a slight lead over this performance-wise, but at $380 cheaper, it’s actually got value for money." data-dimension25="$669">View Deal</a></p></div><div class="product"><a data-dimension112="ed1db7cf-0d72-49af-900e-85b0341f00e7" data-action="Deal Block" data-label="Packed into a nice Micro ATX case for a smaller size, alongside that Arc B570 with 10GB of video memory (and XeSS 3 support for multi-frame generation), this machine hits a sweet spot for me. In testing, that GPU is at its strongest in 1080p raw performance, but the AI trickery means you can extract a little QHD action from it too." data-dimension48="Packed into a nice Micro ATX case for a smaller size, alongside that Arc B570 with 10GB of video memory (and XeSS 3 support for multi-frame generation), this machine hits a sweet spot for me. In testing, that GPU is at its strongest in 1080p raw performance, but the AI trickery means you can extract a little QHD action from it too." data-dimension25="$849" href="https://www.newegg.com/stormcraft-sirius-gaming-desktop-pc-intel-arc-b580-intel-core-i5-14400f-16gb-ddr4-1tb-nvme-ssd-si1440fbb-b57n1/p/N82E16883420042" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Piqt3qVJYCYndZCEBtHvaa" name="Stormcraft Sirius" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Piqt3qVJYCYndZCEBtHvaa.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Packed into a nice Micro ATX case for a smaller size, alongside that Arc B570 with 10GB of video memory (and XeSS 3 support for multi-frame generation), this machine hits a sweet spot for me. In testing, that GPU is at its strongest in 1080p raw performance, but the AI trickery means you can extract a little QHD action from it too.<a class="view-deal button" href="https://www.newegg.com/stormcraft-sirius-gaming-desktop-pc-intel-arc-b580-intel-core-i5-14400f-16gb-ddr4-1tb-nvme-ssd-si1440fbb-b57n1/p/N82E16883420042" target="_blank" rel="nofollow" data-dimension112="ed1db7cf-0d72-49af-900e-85b0341f00e7" data-action="Deal Block" data-label="Packed into a nice Micro ATX case for a smaller size, alongside that Arc B570 with 10GB of video memory (and XeSS 3 support for multi-frame generation), this machine hits a sweet spot for me. In testing, that GPU is at its strongest in 1080p raw performance, but the AI trickery means you can extract a little QHD action from it too." data-dimension48="Packed into a nice Micro ATX case for a smaller size, alongside that Arc B570 with 10GB of video memory (and XeSS 3 support for multi-frame generation), this machine hits a sweet spot for me. In testing, that GPU is at its strongest in 1080p raw performance, but the AI trickery means you can extract a little QHD action from it too." data-dimension25="$849">View Deal</a></p></div><div class="product"><a data-dimension112="79ee49b9-638d-4a91-a6e6-2c539a1ff5b2" data-action="Deal Block" data-label="Now here’s something I didn't expect — a PC with one of the latest Nvidia GPUs for less than $1,000! Same build as the Stormcraft above, but with a Team Green GPU that is going to give you stellar 1080p gaming, and unlock a lot of QHD gameplay too with DLSS 4.5 using AI trickery to do a lot of the heavy lifting." data-dimension48="Now here’s something I didn't expect — a PC with one of the latest Nvidia GPUs for less than $1,000! Same build as the Stormcraft above, but with a Team Green GPU that is going to give you stellar 1080p gaming, and unlock a lot of QHD gameplay too with DLSS 4.5 using AI trickery to do a lot of the heavy lifting." data-dimension25="$899" href="https://www.newegg.com/stormcraft-sirius-gaming-desktop-pc-geforce-rtx-5060-intel-core-i5-14400f-16gb-ddr4-1tb-ssd-si1440fbb-560n2/p/N82E16883420040" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Piqt3qVJYCYndZCEBtHvaa" name="Stormcraft Sirius" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Piqt3qVJYCYndZCEBtHvaa.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Now here’s something I didn't expect — a PC with one of the latest Nvidia GPUs for less than $1,000! Same build as the Stormcraft above, but with a Team Green GPU that is going to give you stellar 1080p gaming, and unlock a lot of QHD gameplay too with DLSS 4.5 using AI trickery to do a lot of the heavy lifting.<a class="view-deal button" href="https://www.newegg.com/stormcraft-sirius-gaming-desktop-pc-geforce-rtx-5060-intel-core-i5-14400f-16gb-ddr4-1tb-ssd-si1440fbb-560n2/p/N82E16883420040" target="_blank" rel="nofollow" data-dimension112="79ee49b9-638d-4a91-a6e6-2c539a1ff5b2" data-action="Deal Block" data-label="Now here’s something I didn't expect — a PC with one of the latest Nvidia GPUs for less than $1,000! Same build as the Stormcraft above, but with a Team Green GPU that is going to give you stellar 1080p gaming, and unlock a lot of QHD gameplay too with DLSS 4.5 using AI trickery to do a lot of the heavy lifting." data-dimension48="Now here’s something I didn't expect — a PC with one of the latest Nvidia GPUs for less than $1,000! Same build as the Stormcraft above, but with a Team Green GPU that is going to give you stellar 1080p gaming, and unlock a lot of QHD gameplay too with DLSS 4.5 using AI trickery to do a lot of the heavy lifting." data-dimension25="$899">View Deal</a></p></div><div class="product"><a data-dimension112="97390f9d-f262-4387-ad95-36b269f17420" data-action="Deal Block" data-label="If you want a similar RTX 5060 build but in a bigger case with better thermals for quiet fans, that’s where Thermaltake’s system comes in. That does mean if you wanted to dabble with some of the overclocking settings in the Nvidia app to push this into the 1440p region, you could without hearing the fans start working overtime!" data-dimension48="If you want a similar RTX 5060 build but in a bigger case with better thermals for quiet fans, that’s where Thermaltake’s system comes in. That does mean if you wanted to dabble with some of the overclocking settings in the Nvidia app to push this into the 1440p region, you could without hearing the fans start working overtime!" data-dimension25="$999" href="https://www.newegg.com/thermaltake-gaming-desktop-pc-geforce-rtx-5060-intel-core-i5-12600kf-16gb-ddr4-1tb-nvme-ssd-v17b-b76r-560-lcs-black/p/N82E16883100127" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="7bg3cvkwCecnNKJsUZ9AF5" name="thermaltake gaming desktop" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7bg3cvkwCecnNKJsUZ9AF5.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you want a similar RTX 5060 build but in a bigger case with better thermals for quiet fans, that’s where Thermaltake’s system comes in. That does mean if you wanted to dabble with some of the overclocking settings in the Nvidia app to push this into the 1440p region, you could without hearing the fans start working overtime!<a class="view-deal button" href="https://www.newegg.com/thermaltake-gaming-desktop-pc-geforce-rtx-5060-intel-core-i5-12600kf-16gb-ddr4-1tb-nvme-ssd-v17b-b76r-560-lcs-black/p/N82E16883100127" target="_blank" rel="nofollow" data-dimension112="97390f9d-f262-4387-ad95-36b269f17420" data-action="Deal Block" data-label="If you want a similar RTX 5060 build but in a bigger case with better thermals for quiet fans, that’s where Thermaltake’s system comes in. That does mean if you wanted to dabble with some of the overclocking settings in the Nvidia app to push this into the 1440p region, you could without hearing the fans start working overtime!" data-dimension48="If you want a similar RTX 5060 build but in a bigger case with better thermals for quiet fans, that’s where Thermaltake’s system comes in. That does mean if you wanted to dabble with some of the overclocking settings in the Nvidia app to push this into the 1440p region, you could without hearing the fans start working overtime!" data-dimension25="$999">View Deal</a></p></div><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-gaming-deals"><span>We're tracking all the best Prime Day gaming deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Gaming&min_discount_ratio=0.95&offer_type=all&rows=4&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&show_countdown=true&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right {      right: 0;      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>\n        \x3C/div>\n      \x3C/div>\n    \x3C/div>          \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const encodedTag = encodeURIComponent(this.activeDealTag.toLowerCase().replace(/\s+/g, '-'));             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map(v => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              return `                \x3Ca href="${this.escapeHTML(linkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item">                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let existingChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             if (this.getViewMode() === 'carousel') {                 if (!existingChevron) {                     gridWrapper.insertAdjacentHTML('beforeend', '\n                 \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: \'smooth\'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>');                 }             } else {                 if (existingChevron) {                     existingChevron.remove();                 }             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            if (!this.processArticleFired) {                  this.processArticleFired = true;                  document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));               }            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve reviewed a ton of mini PCs and my favorite Mac mini alternative just got cooler and quieter ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/geekom-a9-max-review</link>
                                                                            <description>
                            <![CDATA[ The Geekom A9 Max 2026 Edition builds on what made last year’s mini PC a powerhouse but it still has all the upgradeability and ports you could ever need. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">WivUNjJPTsxXgzBPH7TyoW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4YxrYaj5VneFaqKey7pNE5-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 21 Jun 2026 07:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/4YxrYaj5VneFaqKey7pNE5-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A person plugging a 2.4 GHz USB dongle into one of the front ports on the Geekom A9 Max 2026 Edition]]></media:description>                                                            <media:text><![CDATA[A person plugging a 2.4 GHz USB dongle into one of the front ports on the Geekom A9 Max 2026 Edition]]></media:text>
                                <media:title type="plain"><![CDATA[A person plugging a 2.4 GHz USB dongle into one of the front ports on the Geekom A9 Max 2026 Edition]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4YxrYaj5VneFaqKey7pNE5-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Geekom A9 Max 2026 Edition improves on last year’s model with an upgraded AMD Ryzen AI 9 processor, though the rest of its components remain identical. However, Geekom also added its more efficient IceBlast 3.0 cooling, which lets this incredibly fast mini PC run at full power with minimal fan noise.</p><p>This new version keeps the same all-aluminum case and port selection I loved on the original, too. Just like with the standard <a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/geekom-a9-max-review">Geekom A9 Max</a>, you still get four handy USB-A ports on the front, with enough connectivity around back to drive up to four displays simultaneously. While you can certainly open this mini PC up to add another M.2 SSD, there’s also one of Geekom’s standard SD card readers on the side for quickly expanding your storage capacity.</p><p>At $1,799, the Geekom A9 Max 2026 Edition is certainly a pricey mini PC. However, you can typically find it for a few hundred dollars off on Geekom’s website, making it only slightly more expensive than its predecessor. That's not bad, given that RAMageddon doesn’t look to be slowing down anytime soon.</p><p>Just like I did with the original, I’ve been using this upgraded mini PC as my daily driver for the past month. During that time, its internal fan never made a peep, and the system hasn’t missed a beat or slowed down at all. However, just like with the first-gen A9 Max, it is a bit trickier to open and upgrade than past Geekom mini PCs I’ve tested.</p><p>My Geekom A9 Max review will help you decide if this is the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PC</a> for your workflow or if it’s worth picking up last year’s model for slightly less.</p><h3 class="article-body__section" id="section-geekom-a9-max-2026-edition-review-cheat-sheet"><span>Geekom A9 Max 2026 Edition review: Cheat Sheet</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:5086px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jajQTT8uB9hVbuunMjHbDJ" name="Geekom A9 Max-10" alt="The Geekom A9 Max 2026 Edition on a desk with its power adapter and included accessories" src="https://cdn.mos.cms.futurecdn.net/jajQTT8uB9hVbuunMjHbDJ.jpg" mos="" align="middle" fullscreen="" width="5086" height="2861" attribution="" endorsement="" class="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>What is it? </strong>A follow-up to last year’s compact, silver mini PC with desktop-class power under the hood and loads of front and rear ports.</li><li><strong>Who is it for?  </strong>Those who need a powerful mini PC with desktop-class performance to replace a larger system or their laptop.</li><li><strong>What does it cost? </strong>The A9 Max 2026 Edition <a href="https://www.amazon.com/dp/B0FJ213R6G?maas=maas_adg_9A7ED9749F0B927CFADEECED6283AABD_afap_abs&ref_=aa_maas&tag=maas&th=1" target="_blank" rel="nofollow">costs $1,699 on Amazon</a> but it’s currently discounted to <a href="https://www.geekompc.com/geekom-a9-max-mini-pc/?mtm_campaign=pa9max26-now" target="_blank" rel="nofollow">$1,485 on Geekom’s website</a> where you can use code <strong>TGA9MAX26</strong> to get an additional 8% off.</li><li><strong>What do we like? </strong>The upgraded and more powerful Ryzen AI 9 processor, its compact form factor, the ability to power it via USB-C, the highly generous rear and especially front port selection, and its excellent RAM and storage expandability.</li><li><strong>What don’t we like? </strong>The more premium price compared to last year’s model, the more difficult-than-usual case opening process for upgrades, and the easily detached internal Wi-Fi antennas.</li></ul><h3 class="article-body__section" id="section-geekom-a9-max-specs"><span>Geekom A9 Max: Specs</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Geekom A9 Max 2026 Edition (as tested)</p></th><th  ><p>Geekom A9 Max</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,485</p></td><td  ><p>$1,199</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>AMD Ryzen AI 9 HX 470</p></td><td  ><p>AMD Ryzen AI 9 HX 370</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>AMD Radeon 890M</p></td><td  ><p>AMD Radeon 890M</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>32GB DDR5 (upgradeable to 128GB)</p></td><td  ><p>32GB DDR5 (upgradeable to 128GB)</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>2TB (upgradeable to 4TB), 1 x M.2 2230 (upgradeable to 4TB)</p></td><td  ><p>2TB (upgradeable to 4TB), 1 x M.2 2230 (upgradeable to 4TB)</p></td></tr><tr><td class="firstcol " ><p><strong>OS</strong></p></td><td  ><p>Windows 11 Pro</p></td><td  ><p>Windows 11 Pro</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>4 x USB-A, 1 x 3.5mm headphone jack (front), 1 x SD card reader, 1 x Kensington Lock (side), 2 x USB-A, 2 x HDMI 2.1, 2 x USB 4 (one with PD-in), 2 x 2.5G Ethernet</p></td><td  ><p>4 x USB-A, 1 x 3.5mm headphone jack (front), 1 x SD card reader, 1 x Kensington Lock (side), 2 x USB-A, 2 x HDMI 2.1, 2 x USB 4 (one with PD-in), 2 x 2.5G Ethernet</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 7, Bluetooth 5.4</p></td><td  ><p>Wi-Fi 7, Bluetooth 5.4</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>5.31 x 5.20 x 1.85 inches</p></td><td  ><p>5.31 x 5.20 x 1.85 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.56 pounds</p></td><td  ><p>1.56 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-geekom-a9-max-2026-edition-the-ups"><span>Geekom A9 Max 2026 Edition: The ups</span></h3><p>The Geekom A9 Max 2026 Edition keeps what works about the original with loads of ports at the front and back, an all aluminum case and plenty of opportunities to upgrade it further if you’re so inclined. However, it now features a faster processor and even better cooling.</p><h2 id="sleek-silver-and-souped-up">Sleek, silver and souped-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:3918px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Nc2CaaQdoazuBx22QVHmCQ" name="Geekom A9 Max-9" alt="The Geekom A9 Max 2026 Edition upright on a desk" src="https://cdn.mos.cms.futurecdn.net/Nc2CaaQdoazuBx22QVHmCQ.jpg" mos="" align="middle" fullscreen="" width="3918" height="2204" attribution="" endorsement="" class="inline"></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 5.31 x 5.20 x 1.85 inches, the Geekom A9 Max 2026 Edition retains the same compact footprint as the original, which is slightly larger — albeit shorter — than Apple’s redesigned <a href="https://www.tomsguide.com/computing/desktop-computers/mac-mini-m4-review">Mac mini M4</a>. It won’t take up any noticeable room on your desk, but you do have the option to mount this mini PC behind a monitor thanks to the included VESA mounting plate. However, given those handy front ports and the side-facing SD card reader, I wouldn’t recommend hiding it away.</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="iqEh2dGs8k8jrCR25BTRnC" name="Keychron Q11 Ultra-3" alt="A desk setup built around the Keychron Q11 Ultra and the Geekom A9 Max 2026 Edition" src="https://cdn.mos.cms.futurecdn.net/iqEh2dGs8k8jrCR25BTRnC.jpg" mos="" align="middle" fullscreen="" width="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 weight of just 1.54 pounds, the A9 Max has a premium heft without being heavy, meaning you can easily slip it into a backpack. While it comes packaged with a traditional power brick that plugs into a rear barrel port, you don't actually have to use it. One of the two USB4 ports around back supports Power Delivery input (marked "PD-in"), allowing you to power the entire system with a compact <a href="https://www.tomsguide.com/computing/peripherals/this-robot-gan-charger-is-one-of-my-favorite-gadgets-of-2024-and-it-just-got-a-big-upgrade">100W GaN charger</a> instead — a convenient perk I've also seen on other mini PCs like the <a href="https://www.tomsguide.com/computing/desktop-computers/msi-cubi-nuc-ai-plus-2mg-review">MSI Cubi NUC AI+ 2MG</a>.</p><p>Design-wise, this new A9 Max is virtually identical to its predecessor on the outside. Under the hood, however, it sports an upgraded AMD Ryzen AI 9 HX 470 processor and Geekom’s new IceBlast 3.0 cooling. While the original was already fast, this refreshed chip pushes the system's total AI capabilities from 80 up to 86 TOPS (trillions of operations per second) of processing power.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Geekom A9 Max 2026 Edition</strong></p></th><th  ><p><strong>Geekom A9 Max</strong></p></th><th  ><p><strong>Geekom IT15</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Geekbench 6.4 single-core</strong></p></td><td  ><p>2910</p></td><td  ><p>2976</p></td><td  ><p>3080</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6.4 multi-core</strong></p></td><td  ><p>12476</p></td><td  ><p>15140</p></td><td  ><p>15589</p></td></tr><tr><td class="firstcol " ><p><strong>25GB file copy test (MBps)</strong></p></td><td  ><p>17.31</p></td><td  ><p>15.34</p></td><td  ><p>19.62</p></td></tr><tr><td class="firstcol " ><p><strong>Handbrake (Mins:Secs)</strong></p></td><td  ><p>3:30</p></td><td  ><p>3:25</p></td><td  ><p>4:44</p></td></tr></tbody></table></div><p>If you look at the results from our lab tests, you might be scratching your head as to why last year's original A9 Max actually outperforms this newer model. Fortunately, there’s a simple explanation for this that could be a pro or a con depending on your workflow and technical expertise.</p><p>Like the original model, this 2026 Edition features 32GB of DDR5 RAM. However, the original split that memory across two sticks in a dual-channel configuration (2 x 16GB). On this newer model, Geekom ships the system with a <em>single</em> 32GB stick of DDR5 RAM. Running in single-channel mode severely bottlenecks the memory bandwidth, choking the processor during heavy multi-core tasks and synthetic benchmarks.</p><p>I spoke with Geekom about this design choice, and they explained their reasoning: it's all about upgrade paths. Since the A9 Max 2026 Edition is highly upgradeable, keeping a single slot open means that if you want to jump to 64GB of RAM down the line, you can simply buy a matching 32GB stick rather than having to throw away two perfectly good 16GB sticks.</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:4794px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="yAkAhgbfJUMLjFz4wR2iFZ" name="Geekom A9 Max-2" alt="A person playing Death Stranding 2 on a portable monitor using the Geekom A9 Max 2026 Edition" src="https://cdn.mos.cms.futurecdn.net/yAkAhgbfJUMLjFz4wR2iFZ.jpg" mos="" align="middle" fullscreen="" width="4794" height="2697" attribution="" endorsement="" class="inline"></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 good news is that while using the new A9 Max as my daily driver, I personally didn’t notice any real-world slowdowns or hangups. In fact, I was quite impressed with its day-to-day snappiness, and the integrated Radeon 890M graphics even managed to deliver a very playable experience running <a href="https://www.tomsguide.com/gaming/death-stranding-2-is-the-most-beautiful-game-ive-ever-played-and-its-everything-id-hope-for-in-a-sequel">Death Stranding 2</a> on a 1080p monitor.</p><p>Ultimately, if you’re the type of user who prefers a "set-it-and-forget-it" machine and has no intention of ever opening up the case, you'll get better out-of-the-box performance value from the original A9 Max. But if you plan on immediately upgrading this mini PC to its limits and can benefit from the long-term potential of the HX 470 processor, the 2026 model makes a lot of sense — provided you don't mind paying extra for it.</p><h2 id="the-anti-mac-mini-m4">The anti-Mac Mini M4</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5216px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4YxrYaj5VneFaqKey7pNE5" name="Geekom A9 Max_LIST" alt="A person plugging a 2.4 GHz USB dongle into one of the front ports on the Geekom A9 Max 2026 Edition" src="https://cdn.mos.cms.futurecdn.net/4YxrYaj5VneFaqKey7pNE5.jpg" mos="" align="middle" fullscreen="" width="5216" height="2934" attribution="" endorsement="" class="inline"></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 what Apple wants you to think, there are plenty of us that still rely on USB-A ports instead of USB-C ones. Well, if like me, you’re one of those people, then Geekom has the perfect mini PC for you. On the front of the A9 Max, you get four USB-A ports and a 3.5mm headphone jack. These easy-to-reach ports are great for plugging in flash drives or 2.4 GHz USB dongles for accessories like mice, keyboards and controllers.</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:4572px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="FfMQZLKKHciiDkehauEdTe" name="Geekom A9 Max-7" alt="The rear ports on the Geekom A9 Max 2026 Edition" src="https://cdn.mos.cms.futurecdn.net/FfMQZLKKHciiDkehauEdTe.jpg" mos="" align="middle" fullscreen="" width="4572" height="2572" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Then around back, you get two more USB-A ports (one is high-speed like the four around front while the other is USB 2.0), two HDMI 2.1 ports, two USB4 ports, dual 2.5 gigabit Ethernet ports and a barrel port power connector. That second 2.5 GbE port is great if you want to connect a NAS device to this mini PC, for instance.</p><p>As I mentioned before, with two USB4 ports and two HDMI 2.1 ports, the A9 Max can drive up to four 4K monitors simultaneously. Likewise, you could use the USB4 port on the right for power instead.</p><p>Although I adore my Mac mini M4, I’m constantly trying out <a href="https://www.tomsguide.com/computing/peripherals/i-added-satechis-new-usb-c-hub-and-stand-to-my-mac-mini-m4-and-its-the-perfect-upgrade">different stands</a> and <a href="https://www.tomsguide.com/computing/peripherals/i-gave-my-mac-mini-m4-the-ultimate-upgrade-with-this-mac-pro-style-case-and-it-fixes-some-of-my-biggest-complaints">hubs</a> to add those missing USB-A ports to it. With the A9 Max, I have more USB-A ports than I ever did on my big old desktop gaming PC.</p><h2 id="faster-yet-cooler">Faster yet cooler</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5690px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="5UmifnM2FgECpo8ozKuaYj" name="Geekom A9 Max-1" alt="A desk setup built around the Geekom A9 Max 2026 Edition" src="https://cdn.mos.cms.futurecdn.net/5UmifnM2FgECpo8ozKuaYj.jpg" mos="" align="middle" fullscreen="" width="5690" height="3201" attribution="" endorsement="" class="inline"></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 problem you often run into with mini PCs is excessive fan noise. This comes with the territory, since you’re dealing with a smaller system overall. For the most part, I haven’t run into this with Geekom’s mini PCs besides with the Intel-powered <a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/geekom-it15-review">Geekom IT15</a> I reviewed last year. However, when the original A9 Max was left running demanding workloads for long periods, its internal fan would get quite noisy.</p><p>That’s why with the 2026 Edition of the A9 Max, the company upgraded its cooling system to IceBlast 3.0. While the original has dual-copper heat pipes, this upgraded version features a massive full-copper module that’s paired with a bigger custom turbo fan with larger blades. Since the blades are larger and this new module holds heat better, the single fan is able to move more air at lower, much quieter RPMs. As such, the A9 Max 2026 Edition is able to run at peak power without getting overly hot or loud.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3327px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="DedmPrVt6DakyTT44JV2F" name="Geekom A9 Max-3" alt="A person working on the Geekom A9 Max 2026 Edition with multiple browser windows open" src="https://cdn.mos.cms.futurecdn.net/DedmPrVt6DakyTT44JV2F.jpg" mos="" align="middle" fullscreen="" width="3327" height="1871" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Personally, the original A9 Max never got too loud for me during standard tasks, even with dozens of Chrome tabs open across multiple displays. However, if you plan on pushing this mini PC a lot harder, then this new cooling solution will absolutely make a difference. Before deciding between it and the original, I recommend carefully considering how you’re actually going to be using it on a daily basis.</p><h3 class="article-body__section" id="section-geekom-a9-max-2026-edition-the-downs"><span>Geekom A9 Max 2026 Edition: The downs</span></h3><p>The A9 Max 2026 Edition is a powerful and full-featured mini PC, but it’s not without its downsides. The upgraded processor and cooling are nice to have, but they’re not a must-have upgrade over the original. At the same time, opening this mini PC up to upgrade it still proves somewhat tedious given how easily its Wi-Fi antenna cables come unattached. </p><h2 id="mind-those-pesky-wi-fi-antennas">Mind those pesky Wi-Fi antennas</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4586px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="eiTKRj68kfgoSggCTMDoT6" name="Geekom A9 Max-6" alt="A person opening the Geekom A9 Max 2026 Edition up with a screwdriver" src="https://cdn.mos.cms.futurecdn.net/eiTKRj68kfgoSggCTMDoT6.jpg" mos="" align="middle" fullscreen="" width="4586" height="2580" attribution="" endorsement="" class="inline"></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 the most part, opening the A9 Max 2026 Edition up to upgrade its RAM or to add extra storage is fairly easy. After flipping it over, you have to remove the four rubber feet at each corner to reveal standard Phillips screws. </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:5572px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TxgqvG5j8JDBTWzFFZK7CC" name="Geekom A9 Max-5" alt="The Geekom A9 Max 2026 Edition open on a table with all the parts laid out next to it" src="https://cdn.mos.cms.futurecdn.net/TxgqvG5j8JDBTWzFFZK7CC.jpg" mos="" align="middle" fullscreen="" width="5572" height="3134" attribution="" endorsement="" class="inline"></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 other Geekom mini PCs you can get right to their components, but with this one, you first have to remove its massive heatsink before doing so. It’s fairly easy to take off as you just have to remove a few more screws, but like with the original A9 Max, there is a catch.</p><p>The A9 Max’s Wi-Fi antenna cables are taped onto the heatsink, and when you take it off, it’s very easy for them to come unattached. Unfortunately, they’re installed underneath this mini PC’s M.2 SSD, and reattaching them can be quite tedious to 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:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="G894EMEUcAoSRfGxU3i77J" name="Geekom A9 Max-4" alt="The Geekom A9 Max 2026 Edition open on a desk with its internals exposed" src="https://cdn.mos.cms.futurecdn.net/G894EMEUcAoSRfGxU3i77J.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>With the heatsink removed, you can see the single stick of 32GB of DDR5 memory and the free M.2 slot next to the SSD. While it’s positioned for a much smaller 2230 SSD, it's easily accessible if you want to quickly drop in a short drive to expand your capacity.</p><p>Honestly, Geekom’s mini PCs are pretty easy to open and upgrade, and this new A9 Max is no exception. Just be forewarned that you’ll likely have to put up a bit of a fight to get those Wi-Fi antenna cables reconnected after doing so.</p><h2 id="not-quite-an-a10-max">Not quite an A10 Max</h2><p>With the <a href="https://www.tomsguide.com/computing/desktop-computers/geekom-a5-review">Geekom A5 2025 Edition</a> I reviewed, it had been two years between when the original released and when the upgraded version came out. With the A9 Max 2026 Edition, though, the original A9 Max came out just last year.</p><p>As you might have guessed from earlier in this review, the main reason Geekom decided to put out a new version of this mini PC so quickly was to fix the cooling issues of the original. That aggressive thermal throttling and loud fan noise was a deal-breaker for a lot of people, and fortunately, the A9 Max 2026 Edition fixes all of this with its IceBlast 3.0 cooling. Along the way, you also get a slightly faster processor, which is unfortunately a bit handicapped due to the single-channel RAM configuration Geekom went with this time around.</p><p>Don’t get me wrong: the original A9 Max was an excellent mini PC, and so too is this one. However, instead of a slight performance upgrade and improved cooling, I wouldn’t have minded seeing Geekom jump straight to a true "A10 Max." Given higher component costs due to RAMageddon, though, maybe it’s for the best that the company waited to take things to their next logical conclusion.</p><h3 class="article-body__section" id="section-geekom-a9-max-2026-edition-verdict"><span>Geekom A9 Max 2026 Edition: Verdict</span></h3><p>The Geekom A9 Max 2026 Edition is a refined version of the original A9 Max, with some slight upgrades under the hood that make a big difference in day-to-day use. It’s quieter, cooler, and faster, but you are paying a bit more compared to what you would have last year. Still, you’re getting an ultra-fast mini PC with desktop-class performance and more ports than you'll find on most full-sized towers.</p><p>Now, I wouldn’t recommend upgrading to the 2026 Edition if you already own the original A9 Max. However, if you want a fast mini PC that you’ll be able to use at full power for years to come, it’s definitely worth the higher price tag.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I saw Asus' first Snapdragon-powered mini PC in person — and the Ascent QN10 could be the Mac mini M4 alternative for Windows users ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/i-saw-asus-first-snapdragon-powered-mini-pc-in-person-and-the-ascent-qn10-could-be-the-mac-mini-m4-alternative-for-windows-users</link>
                                                                            <description>
                            <![CDATA[ The Asus Ascent QN10 is a gorgeous Snapdragon mini PC built from the ground up for local AI workloads. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">EjWmYMZXgy7eoL8XADcahR</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/vLBJdJFaH5HiRyh6aE7b44-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 08 Jun 2026 05:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/vLBJdJFaH5HiRyh6aE7b44-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Asus Ascent QN10 mini PC on a table]]></media:description>                                                            <media:text><![CDATA[The Asus Ascent QN10 mini PC on a table]]></media:text>
                                <media:title type="plain"><![CDATA[The Asus Ascent QN10 mini PC on a table]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/vLBJdJFaH5HiRyh6aE7b44-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Instead of a black square case with an Intel or AMD chip inside, with the Ascent QN10, Asus is doing things differently — both with its design and its silicon.</p><p>Unlike with its Intel-powered NUC mini PCs or AMD-powered ExpertCenter ones, the Ascent QN10 is the first to use Qualcomm’s Snapdragon chips, specifically the <a href="https://www.tomsguide.com/computing/laptops/i-just-benchmarked-every-snapdragon-x2-elite-chip-and-apple-intel-and-amd-should-be-worried-about-2026">Snapdragon X2 Elite</a>. As such, Asus has given this mini PC a sleek silver case with an anodized aluminum finish as opposed to the black plastic it uses on others.</p><p>At <a href="https://www.tomsguide.com/computing/best-of-computex-2026">Computex 2026</a>, I got a chance to see and hold the newly unveiled Ascent QN10 in person. While I wasn’t able to fully test it just yet, based on our previous benchmark testing of Snapdragon X2 Elite laptops, I’m excited to see what this chip can do when unleashed in an Asus mini PC for the first time.</p><p>The new Asus Ascent QN10 is so much more than the chip powering it though. Here are my initial impressions after some one-on-one time with it away from the crowds on the show floor.</p><h2 id="asus-ascent-qn10-specs">Asus Ascent QN10 Specs</h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>Qualcomm Snapdragon X2 Elite (18-Core Oryon CPU)</p></td></tr><tr><td class="firstcol " ><p><strong>Graphics</strong></p></td><td  ><p>Qualcomm Adreno X2-90</p></td></tr><tr><td class="firstcol " ><p><strong>NPU</strong></p></td><td  ><p>Qualcomm Hexagon (Up to 80 TOPS)</p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>Up to 32GB LPDDR5x</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>512GB, 1TB or 2TB</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>2 x USB4, 2 x USB-A, 1 x 3.5mm audio jack (front), 1 x USB4, 1 x HDMI 2.1, 2 x USB-A, 1 x 2.5 Gigabit Ethernet (rear)</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>5.1 x 5.1 x 1.5 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.6 pounds</p></td></tr></tbody></table></div><h2 id="sleek-small-and-silver">Sleek, small — and silver</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="p4taZ3zBog44VzPsHKQBdB" name="DSC05737.JPG" alt="The front ports of the Asus Ascent QN10" src="https://cdn.mos.cms.futurecdn.net/p4taZ3zBog44VzPsHKQBdB.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>At just 5.1 x 5.1 x 1.5 inches, the Ascent QN10 is smaller than some of the other Asus mini PCs I’ve reviewed in the past like the tall variant of the <a href="https://www.tomsguide.com/computing/desktop-computers/asus-NUC-14-pro-review">NUC 14 Pro</a>. It’s no longer cube-shaped either, nor is it rectangular like the new Asus NUC 16 Pro. Instead, what we have here is a perfectly uniform square block with ports on the front and back and vents on either side.</p><p>Speaking of ports, there are two ultra-fast USB4 ones right on the front of the Ascent QN10 that support speeds of up to 40 Gbps, can output video via DisplayPort 1.4 and also offer Power Delivery. Right next to them, you get a 3.5mm headphone/microphone combo jack and two USB-A ports for connecting your accessories.</p><p>Personally, I’m looking forward to how you can grab two portable monitors or even a pair of the <a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">best smart glasses</a> for some extra screen real estate in a pinch. Likewise, having these faster ports up front is great for transferring data to and from an external hard drive or even your smartphone.</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:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="oiZCpZHUeWX3YzGfqDGauP" name="DSC05732.JPG" alt="The right side exhaust ports on the Asus Ascent QN10 mini PC" src="https://cdn.mos.cms.futurecdn.net/oiZCpZHUeWX3YzGfqDGauP.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Asus has done something incredibly clever with the Ascent QN10’s cooling, too. While the vents that bring in cool air on the left side form a dense, uninterrupted block of vertical slits, the exhaust grills on the right side are physically split by a horizontal strip of aluminum. The reason for this is pretty interesting.</p><p>Since the Ascent QN10 uses a blazing-fast PCIe Gen 5 SSD which tends to run hotter, Asus added a second internal fan just to cool it. To avoid having the heat from the SSD and CPU mixing together, that physical gap on the right panel keeps the exhaust channels isolated. So cool fresh air comes in all at once on the left but gets separated on the way out.</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:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="qSeGV3S4xs5hDkRStZ6UQJ" name="DSC05732.JPG" alt="The rear ports on the Asus Ascent QN10 mini PC" src="https://cdn.mos.cms.futurecdn.net/qSeGV3S4xs5hDkRStZ6UQJ.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p> Then on the back of the Ascent QN10, we still have a barrel port connector for power along with another USB4 port, two more USB-A ports, HDMI 2.1, and a fast 2.5 Gigabit Ethernet port. Overall, this mini PC has a phenomenal mix of front and rear connectivity. At the same time, despite its small size, it can drive up to four 4K displays simultaneously as well.</p><p>We’re definitely going to have to get an Ascent QN10 in for testing, but so far, it looks like a promising and powerful mini PC. There is one catch though: it’s missing a useful feature you'll find on almost all of Asus’ other mini PCs.</p><h2 id="no-hiding-this-one">No hiding this one</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="3s4iQuWyENE7Cw5uMA2aGU" name="DSC05738.JPG" alt="The underside of the Asus Ascent QN10 mini PC" src="https://cdn.mos.cms.futurecdn.net/3s4iQuWyENE7Cw5uMA2aGU.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When you flip the Ascent QN10 over, things look slightly different than they would on Asus’ NUC or ExpertCenter mini PCs. There isn’t a latch to quickly gain access to its internals, nor are there brackets to attach a VESA-mounting plate.</p><p>Instead, there are four white feet around the vents in the middle of the Ascent QN10 with screws at each corner. You can certainly open this mini PC up, but you will need a screwdriver to do so. While you can’t add more RAM due to how Qualcomm’s Snapdragon architecture is engineered, there are dual M.2 slots and both support up to 2TB for a total of 4TB of storage when fully equipped.</p><p>Now, it wasn’t the non-upgradeable RAM or the QN10 not having a toolless design that surprised me most; it was how you can’t VESA-mount this mini PC. One of the perks of using one of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a> is that — for the most part — you can usually <a href="https://www.tomsguide.com/opinion/i-mounted-a-mini-pc-to-the-back-of-my-monitor-for-an-even-cleaner-setup">mount them behind your monitor</a>. Doing so gives you the space-saving benefits of an all-in-one computer like an iMac but at a fraction of the price and with more flexibility.</p><p>Given its sleek silver design and anodized aluminum case, though, I think Asus wants its first Snapdragon-powered mini PC to sit front and center on your desk. That’s alright with me, but I do wish Asus had included an integrated fingerprint reader on the power button or even next to it for faster logins. Since the Ascent QN10 is the kind of mini PC you can't hide away behind a monitor, having biometric security right at your fingertips would have been a nice touch.</p><h2 id="only-ai-will-tell">Only AI will tell</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5895px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="h3SUTgp2SRapNu2hKjWfin" name="DSC05747" alt="The Asus Ascent QN10 mini PC in front of a company slogan" src="https://cdn.mos.cms.futurecdn.net/h3SUTgp2SRapNu2hKjWfin.jpg" mos="" align="middle" fullscreen="" width="5895" height="3316" attribution="" endorsement="" class="inline"></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 glad that Asus gave me a chance to see and hold the Ascent QN10 before its official release. However, there’s only so much I can glean from it without having it powered on and connected to a monitor.</p><p>Besides its sleek design and the premium components inside, the big sell here is the Qualcomm Hexagon NPU. It features 80 TOPS and is powerful enough to run AI agents like OpenClaw, Hermes, or Claude Desktop directly on the Ascent QN10. With Qualcomm’s AI Hub, it should be easy enough for even beginners to get started running AI locally. Since this mini PC is ARM and not x86-based, it should be a whole lot quieter and cooler when doing so too.</p><p>A few more questions remain as well, like how much the Ascent QN10 will actually cost when it releases. For now, though, I think this mini PC has the potential to be a great <a href="https://www.tomsguide.com/computing/apple-desktops/mac-mini-m4-reasons-to-buy-and-skip">Mac mini M4</a> alternative for Windows users who are looking to get started with AI agents.</p><p>Stay tuned, as I’m definitely calling in one of these for review.</p><ul><li><a href="https://www.tomsguide.com/computing/mini-pcs/i-tried-the-new-rog-nuc-16-and-asus-upgraded-mini-gaming-pc-is-complete-overkill-but-in-the-best-way-possible">I tried the new ROG NUC 16 and Asus’ upgraded mini gaming PC is complete overkill — but in the best way possible</a></li><li><a href="https://www.tomsguide.com/computing/gaming-laptops/all-8-laptops-launching-with-nvidia-rtx-spark-this-fall-and-what-they-can-do">All 8 laptops launching with Nvidia RTX Spark this fall and what they can do</a></li><li><a href="https://www.tomsguide.com/computing/laptops/i-held-the-macbook-neo-in-one-hand-and-the-new-xps-13-in-the-other-and-dells-affordable-laptop-is-surprisingly-lighter">I held the MacBook Neo in one hand and the new XPS 13 in the other — and Dell’s $699 laptop is surprisingly lighter</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tried the new ROG NUC 16 and Asus’ upgraded mini gaming PC is complete overkill — but in the best way possible ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/i-tried-the-new-rog-nuc-16-and-asus-upgraded-mini-gaming-pc-is-complete-overkill-but-in-the-best-way-possible</link>
                                                                            <description>
                            <![CDATA[ The new Asus ROG NUC 16 is an incredibly powerful and feature-packed mini gaming PC but the price tag still stings. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">PhHbtVcJBxmhZRLLJJrkjN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/9RVmNQhsQVvaLxv3LYHVVV-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 05 Jun 2026 04:42:16 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Gaming Desktops]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/9RVmNQhsQVvaLxv3LYHVVV-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A person playing Pragmata on the Asus ROG NUC 16 mini gaming PC]]></media:description>                                                            <media:text><![CDATA[A person playing Pragmata on the Asus ROG NUC 16 mini gaming PC]]></media:text>
                                <media:title type="plain"><![CDATA[A person playing Pragmata on the Asus ROG NUC 16 mini gaming PC]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/9RVmNQhsQVvaLxv3LYHVVV-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The new Asus ROG NUC 16 is the kind of device you need to experience firsthand to truly appreciate what this console-sized PC is capable of. Thankfully, while everyone else at the ROG 20th anniversary event made their way upstairs toward the DJ, I slipped away for some one-on-one time with this mini gaming PC. I’m incredibly glad I did, because the raw performance packed into this tiny case completely blew me away.</p><p>Even though we’re dealing with just a 3-liter case here, Asus has managed to pack this device full of powerful components. From an Intel Core Ultra 9 290HX processor to up to a Nvidia RTX 5080 Laptop GPU and even 128GB of DDR5 memory fully configured, the ROG NUC 16 is no slouch. </p><p>My favorite thing this time around is that in addition to the standard black, it now also comes in white. However, if you prefer black but want something different, there’s always the even more powerful ROG NUC 16 Edition 20 which features gold accents all around like the new <a href="https://www.tomsguide.com/gaming/handheld-gaming/asus-rog-xbox-ally-x20-hands-on-review">ROG Xbox Ally X20</a> I checked out when I first arrived at <a href="https://www.tomsguide.com/computing/best-of-computex-2026">Computex 2026</a>.</p><p>So what can a console-sized mini PC with all the latest components actually pull off gameplay-wise? Quite a lot. If the <a href="https://www.tomsguide.com/computing/gaming-desktops/steam-machine-leak-suggests-4-different-models-and-a-queue-system-to-stop-scalpers">Steam Machine</a> just doesn’t seem like it has enough power to make your living room PC gaming dreams come true, then the ROG NUC 16 could be just what you’re looking for.</p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="5qk1l7" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="asus-rog-nuc-16-specs">Asus ROG NUC 16 Specs</h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Intel Core Ultra 9 290HX Plus</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Up to Nvidia RTX 5080 (or 5090 with ROG 20th Anniversary Edition)</p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>Up to 128GB DDR5</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>Up to 2TB </p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1 x USB-C, 2 x USB-A, 1 x 3.5mm headphone jack, 1 x SD card reader (front), 1 x Thunderbolt 4, 2 x HDMI 2.1, 2 x DisplayPort 2.1, 2 x USB-A, DC-in (rear)</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 7, Bluetooth 5.4, 2.5 Gigabit Ethernet</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>11.1 x 7.4 x 2.2 inches (282.4 x 189.5 x 56.5 mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>6.88 lbs (3.12 kg)</p></td></tr></tbody></table></div><h2 id="console-sized-pc-power">Console-sized PC power</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="HVEZAZdeAvCbVWsNz6mEVc" name="DSC05635.JPG" alt="The front ports of the Asus ROG NUC 16" src="https://cdn.mos.cms.futurecdn.net/HVEZAZdeAvCbVWsNz6mEVc.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>On the front of the ROG NUC 16, there are two high-speed USB-A ports and a USB-C port along with a 3.5mm audio jack. There’s also a lightstrip above the power button with ROG branding on the right. </p><p>One big difference this time around is that Asus has completely redesigned the ROG NUC 16’s stand. Instead of having to manually screw it in like on the <a href="https://www.tomsguide.com/computing/desktop-computers/asus-rog-nuc-970-review">ROG NUC 970</a> I reviewed a few years ago, you now get a removable one made of two pieces that works in both vertical and horizontal orientations. </p><p>At the same time, the ROG NUC 16 now knows which orientation it’s in thanks to the G-sensor in its motherboard. Depending on which orientation you have the device in, its triple-fan QuietFlow cooling system will adjust accordingly for the best airflow.</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:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="NYmL9LTwKyPdVbrKC8HDWi" name="DSC05636.JPG" alt="The rear ports of the Asus ROG NUC 16" src="https://cdn.mos.cms.futurecdn.net/NYmL9LTwKyPdVbrKC8HDWi.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Around back is where things really get interesting with the ROG NUC 16. On the left, you have all your video-out ports from the Nvidia GPU inside which include dual HDMI 2.1, dual DisplayPort 2.1 and a Thunderbolt 4 port. Then on the right, there are four more high-speed USB-A ports and a 2.5 Gigabit Ethernet port.</p><p>I’ve tested larger mini PCs like the <a href="https://www.tomsguide.com/computing/mini-pcs/forget-consoles-i-spent-a-week-with-this-mini-pc-in-my-living-room-and-i-cant-believe-how-well-it-performs">Framework Desktop</a> with fewer USB-A ports, so I really like how Asus has given you more than enough for all your peripherals. The ROG NUC 16 has an impressive selection of ports and powerful components inside but how well does it game? That’s what I was about to find out.</p><h2 id="small-footprint-max-graphics">Small footprint, max graphics</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5738px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="dsr746TWWuCbLXndxrvEm4" name="DSC05644" alt="A person playing Pragmata on the Asus ROG NUC 16 mini gaming PC" src="https://cdn.mos.cms.futurecdn.net/dsr746TWWuCbLXndxrvEm4.jpg" mos="" align="middle" fullscreen="" width="5738" height="3228" attribution="" endorsement="" class="inline"></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 its ROG 20th Anniversary Event, Asus had all of its standard devices launching at Computex 2026 set up in the main room and the special edition ones for the anniversary in a smaller room off to the side.</p><p>What I liked about the ROG NUC 16 setup in particular was how I could see both the black and white version on either side and try it out in the middle. While I couldn’t switch between games like I could on the ROG Xbox Ally X20, Capcom’s <a href="https://www.tomsguide.com/gaming/pragmata-review">Pragmata</a> was already loaded up and ready to go. While I had read my colleague Tony Polanco’s review, I didn’t have a chance to play it myself, so this was great.</p><p>When playing with a mouse and keyboard, the game ran buttery smooth on the ROG NUC 16. It looked great too, especially as this mini gaming PC was paired with a 27-inch ROG Swift OLED gaming monitor.</p><p>One thing that really surprised me was that I didn’t hear a peep out of the ROG NUC 16 while playing. Since it had likely been running for hours before I got to try it, I figured the fans would have ramped up by now. However, with three active cooling fans and dual vapor chambers instead of standard copper heat pipes, the ROG NUC 16 feels like the kind of mini PC you can game on for hours without having to put on one of the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets </a>to drown out fan noise.</p><p>Obviously we’ll need to get one in for testing and put it through the paces at home. However, during my brief time with the ROG NUC 16, I was quite impressed with its performance overall. After skipping last year’s <a href="https://www.tomsguide.com/computing/desktop-computers/i-didnt-expect-this-mini-pc-that-looks-like-a-ps5-to-be-this-powerful-or-customizable-and-now-i-cant-wait-to-try-it-out">ROG NUC 2025</a>, going from the ROG NUC 970 to this one was a massive improvement and all my previous gripes have been fixed. Well, all but one of them.</p><h2 id="portability-has-a-price">Portability has a 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:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="pMcFzH2SNYCk4W93jPbZfB" name="DSC05634.JPG" alt="The Asus ROG NUC 16 in Moonlight White in a vertical orientation" src="https://cdn.mos.cms.futurecdn.net/pMcFzH2SNYCk4W93jPbZfB.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Back when I first tried out one of Asus’ ROG NUC mini gaming PCs, the top-tier configuration was expensive at $1,799 for the ROG NUC 970. However, it wasn’t out of reach for those who wanted a premium mini PC they could game on and easily throw into a backpack to take with them anywhere. In the years since though, the price of an ROG NUC has climbed steadily upward.</p><p>For instance, last year’s ROG NUC 2025 launched with a base price of around $3,200. Unfortunately, this new ROG NUC 16 is even more expensive with a starting price of $3,799 for the baseline configuration. Then if you want the Moonlight White model seen here, you’re going to be paying even more at $4,700. Now Asus isn’t entirely to blame for this as due to <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAMaggeddon</a>, component prices just keep going up and up. </p><p>Will the ROG NUC 16 be worth it for most people? Probably not. Keep in mind that you’re paying a higher price for a premium machine you can take with you anywhere. Also, thanks to its new design and how Asus has reworked its cooling, the ROG NUC 16 will stay quiet under load while similarly-specced mini gaming PCs will sound like a jet engine under load.</p><p>If you’re looking for that console aesthetic but prefer to play on PC, then you might want to take a look at the <a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/minisforum-g1-pro-review">Minisforum G1 Pro</a> I recently reviewed. It is slightly larger but still smaller than a PS5 Pro by a fair margin when standing vertically. However, unlike the ROG NUC 16, it has an internal power supply instead of a large power brick and you can actually upgrade its graphics card since it uses a standard — albeit mini-sized — desktop GPU.</p><p>For those with money to spend who are short on space or travel overseas for extended periods, the ROG NUC 16 is the most powerful mini gaming PC you can get right now. And thanks to its powerful components, it will smoke any console, well at least until the PS6 and next Xbox arrive in a few years.</p><ul><li><a href="https://www.tomsguide.com/computing/laptops/i-held-the-macbook-neo-in-one-hand-and-the-new-xps-13-in-the-other-and-dells-affordable-laptop-is-surprisingly-lighter">I held the MacBook Neo in one hand and the new XPS 13 in the other — and Dell’s $699 laptop is surprisingly lighter</a></li><li><a href="https://www.tomsguide.com/computing/gaming-laptops/all-8-laptops-launching-with-nvidia-rtx-spark-this-fall-and-what-they-can-do">All 8 laptops launching with Nvidia RTX Spark this fall and what they can do</a></li><li><a href="https://www.tomsguide.com/computing/laptops/microsoft-surface-laptop-ultra-rtx-spark-hands-on-review">I just tested Microsoft Surface Laptop Ultra — Nvidia RTX Spark brings life to one of the best laptops I’ve ever tried</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The Dell 24 AIO is no iMac, but it’s a reliable all-in-one computer for the money ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/desktop-computers/dell-24-aio-review</link>
                                                                            <description>
                            <![CDATA[ The Dell 24 AIO won't dethrone the iMac, but it’s a great fit for students and remote workers. For the essentials, the Dell 24 AIO is exactly what you need. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">2LzXXrjdFq39WrZXtqdvNR</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/RyoZXeJamESHr3ztyYL3v4-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 12 May 2026 12:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Desktop Computers]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                                                                                    <dc:creator><![CDATA[ Dylan Haas ]]></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/RyoZXeJamESHr3ztyYL3v4-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Dell 24 AIO (ec24260)]]></media:description>                                                            <media:text><![CDATA[Dell 24 AIO (ec24260)]]></media:text>
                                <media:title type="plain"><![CDATA[Dell 24 AIO (ec24260)]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/RyoZXeJamESHr3ztyYL3v4-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Let’s get this out of the way: The Dell 24 AIO is no <a href="https://www.tomsguide.com/computing/apple-desktops/apple-imac-m4-review"><u>iMac</u></a>, especially when it comes to performance. That said, I don’t think Dell’s all-in-one desktop should be immediately dismissed. That’s because it's a solid, no-fuss productivity machine that nails the basics and exceeds expectations for entertainment.</p><p>It's not a powerhouse capable of handling demanding games or video editing, and its display leaves much to be desired. However, this minimalist all-in-one is a perfect fit for those who don't need all the bells and whistles of a more powerful rig, such as students and remote workers.</p><p>Simplicity, convenience, and reliability are all things the Dell 24 AIO brings to the table, and it delivers on all of them quite well. However, its shortcomings prevent it from being an instant recommendation. Find out more in my full review.</p><h3 class="article-body__section" id="section-dell-24-aio-review-cheat-sheet"><span>Dell 24 AIO review: Cheat Sheet</span></h3><ul><li><strong>What is it? </strong>The Dell 24 AIO is an all-in-one desktop designed to save space and deliver great performance for everyday tasks like web browsing and document editing.</li><li><strong>Who is it for? </strong>Remote workers, students, and home-office-havers who are only looking to tackle basic productivity tasks, listen to music, and watch content.</li><li><strong>What does it cost? </strong>The most budget-friendly configuration we reviewed <a href="https://www.dell.com/en-us/shop/desktop-computers/dell-24-all-in-one-desktop/spd/dell-ec24260-aio/useec24260wcto01" target="_blank" rel="nofollow">starts at $1,349</a>. If you want all the highest-end specs, the all-in-one desktop can run you up to $2,549.</li><li><strong>How are the speakers? </strong>While all-in-one stock speakers don’t typically impress, the Dell 24 AIO stands out for its crisp, punchy sound system.</li><li><strong>Can it handle gaming? </strong>The Dell 24 AIO is not well-suited for power-hungry tasks like gaming and photo/video editing.</li></ul><h3 class="article-body__section" id="section-dell-24-aio-review-specs"><span>Dell 24 AIO review: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Dell 24 AIO</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,349</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>24-inch FHD (1920x1200) Touch Display</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Intel Core Ultra 5 322</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Intel Graphics</p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>512GB</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>2x USB-A, 3x USB-C, 1x HDMI out, 1x HDMI in, 1x 3.5mm headphone jack, 1x Ethernet port, 1x power adaptor port</p></td></tr><tr><td class="firstcol " ><p><strong>Webcam</strong></p></td><td  ><p>8MP IR UPD Camera</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>21.2 x 2.3 x 14.2 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>10.9 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-dell-24-aio-review-the-ups"><span>Dell 24 AIO review: The ups</span></h3><p>The Dell 24 AIO impresses thanks to its strong performance, sharp display, and generous port selection.</p><h2 id="great-performance">Great 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.15%;"><img id="MnNjQ3WpkAF4uPLQ9MVotL" name="Dell 24 AIO (EC24260)--5" alt="Dell 24 AIO (ec24260)" src="https://cdn.mos.cms.futurecdn.net/MnNjQ3WpkAF4uPLQ9MVotL.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Every day, productivity tasks are the Dell 24 AIO’s bread and butter.</p><p>During my testing, I used it for most of my work, including writing reviews, sending emails, filling out spreadsheets, and basic web browsing. It handled all those things swimmingly, and I never noticed any slowdown, even when having a bunch of tabs open at once.</p><div ><table><caption>Performance benchmarks</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Dell 24 AIO</strong></p></td><td  ><p><strong>iMac M4</strong></p></td><td  ><p><strong>Lenovo Yoga AIO 27</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 (single/multi-core)</strong></p></td><td  ><p>2,567 / 7,789</p></td><td  ><p>3,646 / 15,550</p></td><td  ><p>2,889 / 14,724</p></td></tr><tr><td class="firstcol " ><p><strong>Handbrake</strong></p></td><td  ><p>8:43</p></td><td  ><p>5:03</p></td><td  ><p>3:58</p></td></tr></tbody></table></div><p>Our Geekbench 6 CPU performance data aligns with this. Single-core performance, which handles those low-lift tasks I mentioned above, is strong at 2,567. That’s nowhere near the 3,646 score of the M4 iMac, but still comparable to the impressive <a href="https://www.tomsguide.com/computing/desktop-computers/lenovo-yoga-aio-27-review"><u>Lenovo Yoga AIO 27</u></a>, which scored a 2,889.</p><p>The multi-core scores paint a different picture, though, and show why the Dell 24 AIO is worse at handling more demanding tasks like gaming and photo/video editing. The Dell AIO scored 7,789, while the Lenovo and iMac scored 15,550 and 14,724, respectively.</p><p>While the Dell 24 AIO’s multi-core scores don’t touch those of the M4 iMac and Lenovo Yoga AIO 27, you still shouldn’t have any issues with the basics when using the AIO. Once you start taking on more demanding projects, that’s when you’ll run into trouble, but I’ll get to that later. Otherwise, you can expect the Dell AIO to be a reliable daily driver desktop.</p><h2 id="space-saving-design">Space saving 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.15%;"><img id="MqXN94rFwkkCaaRU6kpgST" name="Dell 24 AIO (EC24260)--2" alt="Dell 24 AIO (ec24260)" src="https://cdn.mos.cms.futurecdn.net/MqXN94rFwkkCaaRU6kpgST.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of the main reasons to buy an all-in-one desktop is to save space, and the Dell 24 AIO does just that. The entire setup is just three pieces: The monitor/PC, keyboard, and mouse. So, no matter what kind of real estate you’re working with, you should absolutely have room to fit the AIO into your workspace comfortably.</p><p>After placing it on your desk, setting up the AIO is a breeze — it’s as simple as plugging in the included power adapter and booting it up. From there, you’re off to the races. </p><p>Beyond the space it saves, the Dell 24 AIO also looks great. I usually prefer a more minimalist look for my tech, and to me, this AIO nails it. The all-white body forgoes flashiness but still has some character.</p><p>I also really like that the monitor’s speaker system is on the <em>front</em> of the computer. It makes for a way better audio experience than other desktops that opt for back-facing speakers, which shoot directly into the wall behind it and distort the finer details you probably wouldn’t want to miss (more on those speakers in a bit).</p><p>For me, the only downside of the Dell 24 AIO’s physical design is the fixed stand, which only allows tilt adjustments. If you’re looking to change the height of the display or swivel it from side to side, you’re out of luck. I found the fixed height okay for me, but the lack of swivel made it unnecessarily difficult to access the back of the computer, where all the ports are. A slight annoyance, but definitely worth considering.</p><h2 id="impressive-speakers-and-webcam">Impressive speakers and webcam</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="Da6HgSWp6DSiSodNhgyRna" name="Dell 24 AIO (EC24260)--8" alt="Dell 24 AIO (ec24260)" src="https://cdn.mos.cms.futurecdn.net/Da6HgSWp6DSiSodNhgyRna.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m not normally impressed with stock speakers. That goes for monitors, laptops, and even TVs. But the Dell 24 AIO shocked me with how great its built-in speakers sound. </p><p>High and midtones sounded super crisp, and I could even hear a decent amount of bass, whether I was listening to music or watching a film. And because the sound system supports Dolby Atmos, I was able to get a much more immersive surround-sound experience from whatever content was on the screen.</p><p>I’m more accustomed to the tinny, crackly built-in speakers you’ll find in many laptops and monitors today, so the full-bodied audio experience of the Dell 24 AIO was a pleasant and welcome surprise.</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="aogry3pk9mdroM7wowKvsQ" name="WIN_20260511_09_28_36_Pro" alt="A webcam photo from the Dell 24 AIO review" src="https://cdn.mos.cms.futurecdn.net/aogry3pk9mdroM7wowKvsQ.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 monitor’s 8MP webcam is also a highlight. It looks crystal clear during video calls, and even has facial recognition support for logging in to your various accounts faster.</p><h2 id="fantastic-port-variety">Fantastic port variety</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="HshdiqnWAW4VGtm7ppGerh" name="Dell 24 AIO (EC24260)--11" alt="Dell 24 AIO (ec24260)" src="https://cdn.mos.cms.futurecdn.net/HshdiqnWAW4VGtm7ppGerh.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The AIO has a really nice selection of ports that should cover most people's needs.</p><p>You’ll get a bunch of USB ports, including a USB 2.0 duo and three USB 3.2 ports. An Ethernet port is also here if you want to plug in for faster internet speeds, and a 3.5mm jack in case you don’t have a pair of Bluetooth headphones.</p><p>What I really liked having, though, was the desktop’s pair of HDMI in and out ports, which allows you to connect another laptop or monitor to use as an extended display. I had my laptop connected to the AIO for most of my review period, and it was really convenient to have a second screen that I could pop in and out of on the fly while getting work done.</p><h3 class="article-body__section" id="section-dell-24-aio-review-the-downs"><span>Dell 24 AIO review: The downs</span></h3><p>The Dell 24 AIO has a lot going for it, but it also has some serious setbacks.</p><h2 id="it-s-no-powerhouse">It’s no powerhouse</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="d8TnTv7hGW2DZPW3vwQ4P" name="Dell 24 AIO (EC24260)--4" alt="Dell 24 AIO (ec24260)" src="https://cdn.mos.cms.futurecdn.net/d8TnTv7hGW2DZPW3vwQ4P.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As I mentioned earlier, the Dell 24 AIO isn’t exactly a performance workhorse. Even though it's not meant for that, it’s still a downside that it can’t handle even light gaming or larger creative projects.</p><p>Every game we tested looked like a slideshow if it didn’t crash completely, and the AIO struggled to run demanding apps like those in the Adobe Creative Cloud suite (which aligns with our Geekbench 6 testing data in the performance section above).</p><p>This desktop is definitely better for the basics, and if that’s all you need, you should have no problems here. But if you’re a creative who requires more from your desktop, you’re probably better off looking elsewhere. When you can get an iMac at a similar price point that can handle a much heavier workload, it’s hard to look past the AIO’s shortcomings in this area. </p><h2 id="display-lacks-detail">Display lacks detail</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="e3CDhhKWZM5SvPCo4X5GAF" name="Dell 24 AIO (EC24260)--9" alt="Dell 24 AIO (ec24260)" src="https://cdn.mos.cms.futurecdn.net/e3CDhhKWZM5SvPCo4X5GAF.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Dell 24 AIO’s display is a bit of a mixed bag. When it comes to color accuracy, it actually performs really well, and yielded a Delta-E result that was on par with both the M4 iMac and <a href="https://www.tomsguide.com/computing/desktop-computers/lenovo-yoga-aio-27-review"><u>Lenovo Yoga 27 all-in-one desktop</u></a>. Delta-E is how we measure color accuracy during testing, and the lower the number we get, the better.</p><p>The Lenovo Yoga scored a Delta-E of 0.21, the M4 iMac a 0.22, and the Dell 24 AIO a 0.22 as well. So, it’s hanging right there with some heavy hitters in that regard.</p><div ><table><caption>Display benchmarks</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Dell 24 AIO</strong></p></td><td  ><p><strong>iMac M4</strong></p></td><td  ><p><strong>Lenovo Yoga AIO 27</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Nits (brightness)</strong></p></td><td  ><p>228.8</p></td><td  ><p>450</p></td><td  ><p>352.6</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB</strong></p></td><td  ><p>123.6%</p></td><td  ><p>111.8%</p></td><td  ><p>116.5%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3</strong></p></td><td  ><p>87.6%</p></td><td  ><p>79.2%</p></td><td  ><p>82.6%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.22</p></td><td  ><p>0.22</p></td><td  ><p>0.21</p></td></tr></tbody></table></div><p>But that’s really where the highlights of this display end. When we conducted our brightness tests, the Dell AIO immediately fell behind, scoring an average brightness of just 228.8 nits compared to the Lenovo’s 352.6 nits and the iMac’s 450 nits. It’s pretty apparent just looking at the screen with your naked eye, too.</p><p>During my review period, I couldn’t help but feel like the display was a little bit dim, even with the brightness settings jacked up. There are a few different display presets that you can cycle through to try to tweak it to your liking, but the standard mode has the highest average brightness out of all of them, so don’t expect it to get much better than that.</p><p>The FHD panel can only handle up to 1200p resolution, and while it’s not a complete dealbreaker, I did notice some artifacting when I got closer to the screen, especially around smooth-edged logos or highly detailed images. Again, if you’re just using this computer to take on super basic tasks, this probably won’t be as glaring an issue. But if you’re a stickler for image quality, you’re definitely going to notice the imperfections in this lackluster display.</p><h2 id="disappointing-keyboard">Disappointing keyboard</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="BwTkkB3QTMBLjQLGNM6Nu8" name="Dell 24 AIO (EC24260)--6" alt="Dell 24 AIO (ec24260)" src="https://cdn.mos.cms.futurecdn.net/BwTkkB3QTMBLjQLGNM6Nu8.jpg" mos="" align="middle" fullscreen="" width="2000" height="1123" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While it’s nice that the Dell 24 AIO comes bundled with a mouse and keyboard, one of the latter was a huge issue for me.</p><p>The AIO’s keyboard is perfectly serviceable in terms of size and form factor, but the feedback I got while typing on it really missed the mark. The keys are missing that tactile, clicky sensation that I want from a keyboard. Instead, they just feel kind of mushy, and it really affected how quickly I could type on them.</p><p>The keyboard feel is subjective and specific to each person, so your mileage may vary with this one, but I personally couldn’t get with the included keyboard on the AIO. If I owned one of these all-in-one desktops, I’d probably connect one of my other keyboards.</p><h3 class="article-body__section" id="section-dell-24-aio-review-verdict"><span>Dell 24 AIO review: Verdict</span></h3><p>Even though I would personally want a more powerful all-in-one desktop for my demanding workflow, I still think the Dell 24 AIO is a great option for a very specific type of person.</p><p>The Dell AIO is easy to set up, and its minimalist design makes it simple to use with little friction. It handles the basics with flying colors, has great built-in peripherals, and features a diverse array of ports that’ll allow you to get even more mileage out of your machine.</p><p>For those reasons, it’ll most likely be a match for someone who isn’t seeking luxury, but something that’s uncomplicated and reliable when it comes to tackling whatever the day throws at them.</p><p>Creative types and gamers will probably want to steer clear of this all-in-one due to its display and performance pitfalls, but students and remote workers who value the bare necessities should keep the Dell 24 AIO on their radar.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Steam Machine leak suggests 4 different models — and a queue system to stop scalpers ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/gaming-desktops/steam-machine-leak-suggests-4-different-models-and-a-queue-system-to-stop-scalpers</link>
                                                                            <description>
                            <![CDATA[ Valve is reportedly prepping 4 Steam Machine models, along with a reservation queue to curb scalpers and bots, but there's no news on pricing. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Bbv9mHv49sALP5vQMUXUT3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/WLec9wkyEhDpZxRRLJYEqE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 11 May 2026 15:23:06 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Desktops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/WLec9wkyEhDpZxRRLJYEqE-1280-80.jpg">
                                                            <media:credit><![CDATA[Valve]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Valve Steam Machine]]></media:description>                                                            <media:text><![CDATA[Valve Steam Machine]]></media:text>
                                <media:title type="plain"><![CDATA[Valve Steam Machine]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/WLec9wkyEhDpZxRRLJYEqE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/gaming/gaming-peripherals/steam-controller-review">Steam Controller</a> launched last week and <a href="https://www.tomsguide.com/news/live/valve-stream-controller-launch-live">sold out in less than 30 minutes</a>. As expected, eBay listings went live shortly after, with the peripheral marked up by hundreds of dollars. Valve has since implemented a queue system for Steam Controller orders, and if a recent rumor is true, the company will do the same for the upcoming Steam Machine.</p><p>As <a href="https://wccftech.com/steam-machine-queue-system-4-models-scalpers/" target="_blank">Wccftech</a> reports, a new leak suggests that Valve is bringing back the reservation queue system—the same one used for 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>s launch. That alone is interesting, but the leak also suggests how many versions of the PC/console hybrid we should expect.</p><div class="product"><a data-dimension112="1a22437f-994d-45af-8a6c-6e537931c2b0" data-action="Deal Block" data-label="The new Steam Controller could be one of the best PC game controllers thanks to its Magnetic thumbsticks, a full set of inputs for your Steam games, haptic motors, and claimed 35+ hours of battery life. Now with the new queue system, you might have a shot at nabbing one." data-dimension48="The new Steam Controller could be one of the best PC game controllers thanks to its Magnetic thumbsticks, a full set of inputs for your Steam games, haptic motors, and claimed 35+ hours of battery life. Now with the new queue system, you might have a shot at nabbing one." data-dimension25="$99" href="https://store.steampowered.com/sale/steamcontroller" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1232px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="p4kRCykqzQRFswEntyNcUE" name="Steam Controller" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/p4kRCykqzQRFswEntyNcUE.jpg" mos="" align="middle" fullscreen="" width="1232" height="1232" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The new Steam Controller could be one of the best PC game controllers thanks to its Magnetic thumbsticks, a full set of inputs for your Steam games, haptic motors, and claimed 35+ hours of battery life. Now with the new queue system, you might have a shot at nabbing one.<a class="view-deal button" href="https://store.steampowered.com/sale/steamcontroller" target="_blank" rel="nofollow" data-dimension112="1a22437f-994d-45af-8a6c-6e537931c2b0" data-action="Deal Block" data-label="The new Steam Controller could be one of the best PC game controllers thanks to its Magnetic thumbsticks, a full set of inputs for your Steam games, haptic motors, and claimed 35+ hours of battery life. Now with the new queue system, you might have a shot at nabbing one." data-dimension48="The new Steam Controller could be one of the best PC game controllers thanks to its Magnetic thumbsticks, a full set of inputs for your Steam games, haptic motors, and claimed 35+ hours of battery life. Now with the new queue system, you might have a shot at nabbing one." data-dimension25="$99">View Deal</a></p></div><p>For those who don’t know, the reservation queue is tied to a vetted Steam account. By requiring a purchase history or a verified account, Valve can prevent scalpers from using thousands of burner bots to swarm checkout pages. Those who’ve had active Steam accounts for an unspecified amount of time will get priority on the line. Anyone trying to flip a console on eBay for a 300% markup will be out of luck.</p><p>One of the more interesting details from this alleged leak is that there will be four distinct models. Valve has confirmed 512GB and 2TB models, but we can make educated guesses about the other two. As Wccftech notes, one could have 1TB of storage, while the other could be a bundle with the Steam Controller. I agree with this assessment.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-evvmme"></div>                            </div>                            <script src="https://kwizly.com/embed/evvmme.js" async></script><p>The big question about the Steam Machine is its price. Given the ongoing RAM crisis, it’s safe to assume Valve is waiting as long as possible before revealing the official cost. If the company can keep prices in the $599 to $899 range, it would certainly undercut the PS5 Pro, which now costs $899 after PS5 price hikes.</p><p>Given the unofficial nature of this story, please take it with a healthy dose of skepticism. We’ll keep you updated on any further developments, so 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/computing/gaming-laptops/razer-blade-16-2026-review">I spent two weeks with the Razer Blade 16 (2026) — and it’s a serious gaming laptop powerhouse</a></li><li><a href="https://www.tomsguide.com/best-picks/best-computers">Best computers in 2026: Our 7 top picks after 500+ hours of testing</a></li><li><a href="https://www.tomsguide.com/best-picks/best-pc-game-controllers">I’ve been gaming for 25 years and these are the best PC controllers in 2026 worth your money</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Tim Cook stepping down as Apple CEO: John Ternus takes over Sept 1 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/massive-changes-at-apple-john-ternus-takes-over-as-ceo-sept-1-while-tim-cook-moves-to-executive-chairman</link>
                                                                            <description>
                            <![CDATA[ After 15 years at the helm of Apple, Tim Cook is handing over the reins to John Ternus. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">WB8pF6bheQZ827vchtwGYk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/XK7W9gHWEgHPdh5kir8n9-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 20 Apr 2026 21:09:41 +0000</pubDate>                                                                                                                                <updated>Tue, 21 Apr 2026 09:36:29 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Computing]]></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.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/XK7W9gHWEgHPdh5kir8n9-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[John Ternus and Tim Cook]]></media:description>                                                            <media:text><![CDATA[John Ternus and Tim Cook]]></media:text>
                                <media:title type="plain"><![CDATA[John Ternus and Tim Cook]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/XK7W9gHWEgHPdh5kir8n9-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Today (April 20), <a href="https://www.apple.com/newsroom/2026/04/tim-cook-to-become-apple-executive-chairman-john-ternus-to-become-apple-ceo/" target="_blank">Apple announced</a> that CEO Tim Cook is stepping aside to become the executive chairman of the firm's board of directors. John Ternus, senior vice president of hardware engineering, will become the next steward of Cupertino starting September 1, 2026.</p><p>Cook will help transition Ternus this summer and will likely host <a href="https://www.tomsguide.com/tech-events/apples-wwdc-2026-conference-kicks-off-in-june-heres-what-we-expect-to-see">WWDC 2026,</a> which kicks off in June.</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/kkBudtxgor0" allowfullscreen></iframe></div></div><p>“It has been the greatest privilege of my life to be the CEO of Apple and to have been trusted to lead such an extraordinary company. I love Apple with all of my being" Cook said in a press release.</p><p>Tim Cook has led Apple for the past 14 years since Steve Jobs resigned in 2011. In total, Cook has worked at Apple over 25 years.</p><p>Ternus joined Apple in 2001 as part of the company's product design team and became the VP of hardware engineering in 2013.</p><p>"Having spent almost my entire career at Apple, I have been lucky to have worked under Steve Jobs and to have had Tim Cook as my mentor," Ternus said.  "I am filled with optimism about what we can achieve in the years to come."</p><h2 id="who-is-john-ternus">Who is John Ternus?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TrT3r6fXvJDENQATkwjnxN" name="John Ternus.GettyImages-2264179980" alt="John Ternus in front of the Apple logo" src="https://cdn.mos.cms.futurecdn.net/TrT3r6fXvJDENQATkwjnxN.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" 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>John Ternus has been a front runner to take over the head seat for awhile now, and currently is the youngest top executive at the company at 50 years old. Assuming things go well, he could have an equally long tenure. </p><p>The rise of Ternus suggests the company is looking for a more hardware and engineering focused future.</p><p>Ternus joined the executive team in 2021 when he became the the senior vice president of Hardware Engineering. He has overseen the production and introduction of a number of product lines including the iPad, AirPods and several generations of the iPhone, Mac and Apple Watch.</p><p>He unveiled the <a href="https://www.tomsguide.com/news/apple-m1-chip-everything-you-need-to-know-about-apple-silicon-macs">M1 chip</a>, Apple's first in-house designed CPU in 2020, and the <a href="https://www.tomsguide.com/phones/iphones/iphone-air-review">iPhone Air</a> last year. </p><p>Ternus' most recent impact was with the MacBook Neo, Apple's take on a budget-friendly laptop that quickly made an imprint on that category and has sold out so quickly</p><p>"“We’re always focused on ‘how do we make a given product better,’” said Ternus in an <a href="https://www.tomsguide.com/computing/apples-joz-and-ternus-on-smart-glasses-the-macbook-neo-and-whats-next-for-ai">interview with Tom's Guide</a>. “We’re always pushing. And we never think like, ‘well, what impact if we did something here would have on a product over here?’”</p><h2 id="what-s-next-for-apple">What's next for Apple?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aUJZxCfMMXC3m2nKLVB2dV" name="iPhone Fold final design 1" alt="iPhone Fold design" src="https://cdn.mos.cms.futurecdn.net/aUJZxCfMMXC3m2nKLVB2dV.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Majin Bu on X)</span></figcaption></figure><p>Ternus will take over at an interesting, and somewhat fraught time for Apple and tech as a whole. </p><p>Tim Cook has already been navigating the tariff situation, and now the ongoing Iran War. There's also the <a href="https://www.tomsguide.com/computing/hardware/the-squeeze-is-real-i-spoke-to-ram-crisis-oracle-carmen-li-about-when-this-nightmare-ends-heres-what-she-told-me">RAM crisis</a> which isn't expected to abate until 2028, at the earliest. Apple has seemingly been on top of things but reports have shown that even Apple is eating costs associated with sky high memory prices.</p><p>Meanwhile, the<a href="https://www.tomsguide.com/phones/iphones/iphone-20-leaks-are-here-and-apple-may-be-planning-a-dramatic-redesign-unlike-anything-weve-seen-before"> 20th anniversary of the iPhone</a> is coming next year and rumors suggest it will be a huge change. Plus, Apple is expected to debut its <a href="https://www.tomsguide.com/computing/smart-glasses/pull-the-rug-out-mark-gurman-explains-apples-plan-to-launch-smart-glasses-this-year-to-stop-metas-momentum">first pair of smart glasses</a> later this year and the first<a href="https://www.tomsguide.com/phones/iphones/iphone-fold-leak-may-have-revealed-final-design-and-magsafe-confirmation-what-we-know"> foldable iPhone</a> this September.</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/kyz1z2Y5Oe0" allowfullscreen></iframe></div></div><p>Both devices are new categories for Apple that come at a time when price hikes, memory shortages, and AI are the talk of tech. </p><p>It'll be interesting to see how Ternus navigates these choppy waters while trying to bring new enthusiasm to the company.</p><h2 id="johny-srouji-named-apple-s-chief-hardware-officer">Johny Srouji named Apple's Chief Hardware Officer</h2><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:66.67%;"><img id="8Zq3cth7PQEzi2jmV4EHNk" name="Apple-Johny-Srouji" alt="Apple's new Chief of hardware Srouji" src="https://cdn.mos.cms.futurecdn.net/8Zq3cth7PQEzi2jmV4EHNk.jpg" mos="" align="middle" fullscreen="" width="3840" height="2560" 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>As Ternus transitions to CEO,<a href="https://www.apple.com/newsroom/2026/04/johny-srouji-named-apples-chief-hardware-officer/" target="_blank"> Apple also announced</a> a new head of hardware in Johny Srouji. </p><p>“Johny has been an incredible partner on the executive team, and is going to be an extraordinary chief hardware officer,” said incoming Apple CEO John Ternus in a press release. “I look forward to continuing to work closely with him in our new roles.”</p><p>Srouji joined Apple in 2008 and led development of the A4 chip, Apple's first in-house iPhone silicon. Since then he has been in charge of hardware engineering teams from silicon and batteries to cameras and sensors.</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/apples-touchscreen-macbook-pro-could-be-pushed-back-heres-what-we-know">Apple's touchscreen MacBook Pro could be 'pushed back' — here's what we know</a></li><li><a href="https://www.tomsguide.com/computing/online-security/scammers-are-weaponizing-apples-own-notifications-in-a-dangerous-new-phishing-attack-dont-fall-for-this">Scammers are weaponizing Apple’s own notifications in a dangerous new phishing attack — don’t fall for this</a></li><li><a href="https://www.tomsguide.com/computing/smart-glasses/pull-the-rug-out-mark-gurman-explains-apples-plan-to-launch-smart-glasses-this-year-to-stop-metas-momentum">'Pull the rug out': Mark Gurman explains Apple’s plan to launch smart glasses and stop Meta’s momentum</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tried the Minisforum G1 Pro and this console-sized mini PC works just as well in the living room as it does at your desk  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/desktop-computers/mini-pcs/minisforum-g1-pro-review</link>
                                                                            <description>
                            <![CDATA[ The Minisforum G1 Pro might resemble a PS5 but this mini gaming PC is packed with power and almost fully upgradeable. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">WqRq4TYQjKFZ5dcgZ7cBuP</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/5besxxjRfLc7CvG5UjqGtG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 18 Apr 2026 10:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/5besxxjRfLc7CvG5UjqGtG-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Minisforum G1 Pro next to a PS5 Pro on a table]]></media:description>                                                            <media:text><![CDATA[The Minisforum G1 Pro next to a PS5 Pro on a table]]></media:text>
                                <media:title type="plain"><![CDATA[The Minisforum G1 Pro next to a PS5 Pro on a table]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/5besxxjRfLc7CvG5UjqGtG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Minisforum G1 Pro isn’t your typical mini PC. Instead, it feels like a true small form factor (SFF) rig thanks to its internal, desktop-grade power supply and its dedicated GPU. We aren’t dealing with a power-limited laptop chip here; instead, you’re getting a low-profile Nvidia GeForce RTX 5060.</p><p>After seeing the <a href="https://www.tomsguide.com/computing/desktop-computers/i-didnt-expect-this-mini-pc-that-looks-like-a-ps5-to-be-this-powerful-or-customizable-and-now-i-cant-wait-to-try-it-out">G1 Pro at Computex</a> last summer, I knew I had to get one in for testing. I’ve been using it for both work and play for almost two months now, and it hasn’t disappointed on either front. With an AMD Ryzen 9 8945HX processor and 32GB of DDR5 RAM under the hood, the G1 Pro handled my daily workload with ease. Then, when work was done for the day, it transformed into a console-like gaming powerhouse capable of playing the latest AAA releases with the settings cranked.</p><p>Still, at $1,439, the G1 Pro is more expensive than your average mini PC — though it’s still significantly cheaper than the Asus ROG NUC. There are also some trade-offs to consider: its small footprint means a sparse port selection for accessories, and the G1 Pro can get loud when you push its hardware to the limit.</p><p>My Minisforum G1 Pro review will help you decide if this is the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PC</a> for your setup and if it really packs enough of a punch to make you consider ditching your console for good.</p><h3 class="article-body__section" id="section-minisforum-g1-pro-cheat-sheet"><span>Minisforum G1 Pro: Cheat Sheet</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ydb5Cr6zFJBeAzSK7KkKHM" name="Minisforum G1 Pro-5" alt="The Minisforum G1 Pro unboxed on a table" src="https://cdn.mos.cms.futurecdn.net/ydb5Cr6zFJBeAzSK7KkKHM.jpg" mos="" align="middle" fullscreen="" width="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><ul><li><strong>What is it? </strong>A gaming-focused mini PC with a desktop-grade power supply and GPU.</li><li><strong>Who is it for? </strong>Gamers who don’t have the space for a full tower, those who like to travel with their gaming PC and people who want workstation power in a small form factor with the option to play demanding games too.</li><li><strong>What does it cost? </strong>The Minisform G1 Pro costs $1,439 at <a href="https://store.minisforum.com/products/minisforum-g1-pro-gaming-pc" target="_blank" rel="nofollow">Minisforum</a> and <a href="https://www.amazon.com/MINISFORUM-PCIe4-0-Desktop-Computer-Graphics/dp/B0GLYNP4DK" target="_blank" rel="nofollow">Amazon</a>.</li><li><strong>What do we like? </strong>Its console-like design, the fact that it uses desktop-grade components, that you can swap in more RAM or storage, how there’s no bulky power brick and that you can even upgrade its GPU.</li><li><strong>What don’t we like? </strong>The form factor limits port availability and it can get loud when playing demanding games cranked up to max settings.</li></ul><h3 class="article-body__section" id="section-minisforum-g1-pro-specs"><span>Minisforum G1 Pro: Specs</span></h3><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,439</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>AMD Ryzen 9 8945HX</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Nvidia RTX 5060 8GB, AMD Radeon G10M</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>32GB DDR5 (supports up to 96GB)</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>1TB M.2 2280 PCIe 4.0 SSD (expandable up to 8TB)</p></td></tr><tr><td class="firstcol " ><p><strong>OS</strong></p></td><td  ><p>Windows 11</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1x USB-A, 1 x USB-C, 3.5 audio jack (front), 2 x USB-A, 1 x USB-C, 2 x DisplayPort 2.1, 1 x DisplayPort 1.4a,  2 x HDMI 2.1, 1 x 5 Gigabit Ethernet (rear)</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>Size</strong></p></td><td  ><p>12.4 x 8.5 x 2.25 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>8.3 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-minisforum-g1-pro-the-ups"><span>Minisforum G1 Pro: The Ups</span></h3><p>The Minisforum G1 Pro is far from your standard mini PC. However, its powerful components and upgradability make it just as useful in your living room as it is in the office.</p><h2 id="even-sleeker-than-a-console">Even sleeker than a console</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5besxxjRfLc7CvG5UjqGtG" name="Minisforum G1 Pro-6" alt="The Minisforum G1 Pro next to a PS5 Pro on a table" src="https://cdn.mos.cms.futurecdn.net/5besxxjRfLc7CvG5UjqGtG.jpg" mos="" align="middle" fullscreen="" width="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 12.4 x 8.5 x 2.25 inches with a white outer shell, it’s hard not to draw comparisons between the G1 Pro and Sony’s PS5. Personally, though, I prefer Minisforum’s more uniform design. On the left side of the G1 Pro’s case, there are two triangular sets of vent holes while the right side is completely flat.</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="aGCHRZ67iAmZHgij9cFSWR" name="Minisforum G1 Pro-2" alt="The Minisforum G1 Pro lying flat on a table showing off its front ports" src="https://cdn.mos.cms.futurecdn.net/aGCHRZ67iAmZHgij9cFSWR.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>A black strip runs between the two sides and on the front, there’s a high-speed USB-A port, a USB-C port (that can do video out), a 3.5mm audio jack and the power button. There are also customizable RGB lightstrips on either side of the G1 Pro’s front ports.</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="JKok389oGEc7RfvJp87f3U" name="Minisforum G1 Pro-4" alt="The rear ports of the Minisforum G1 Pro" src="https://cdn.mos.cms.futurecdn.net/JKok389oGEc7RfvJp87f3U.jpg" mos="" align="middle" fullscreen="" width="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>Now around back is where things get interesting. In the center, you get two more high-speed USB-A ports, another USB-C port (that can also do video out), an HDMI 2.1 port and surprisingly, a 5 Gigabit Ethernet port. Then on the left side, you get another HDMI 2.1 port, two DisplayPort 2.1b connections and a DisplayPort 1.4a one too from the G1 Pro’s dedicated GPU. Finally, there’s a standard PC power port along with an on/off switch on the right 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8ssgY2G2txxTTZjMKro85Y" name="Minisforum G1 Pro-7" alt="A person installing the Minisforum G1 Pro's vertical stand" src="https://cdn.mos.cms.futurecdn.net/8ssgY2G2txxTTZjMKro85Y.jpg" mos="" align="middle" fullscreen="" width="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>Unlike with the PS5, the G1 Pro comes with a vertical stand in the box. It screws onto the bottom of the device using a thumb screw for additional support. While you can technically use the G1 Pro horizontally too, doing so is a bit awkward because when you flip it over to have its vents facing up, the Minisforum and AtomMan logos are upside down. Now if you were to mount it under your desk horizontally, this wouldn’t be the case and the device would still have plenty of airflow.</p><p>Just like with my PS5 Pro or Xbox Series X, one of my favorite things about the G1 Pro is that it doesn’t have a bulky power supply like the <a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/geekom-a9-max-review">Geekom A9 Max</a> and many of the other mini PCs I’ve tested. In fact, the only other mini PC I’ve tried that uses an internal power supply is Apple’s <a href="https://www.tomsguide.com/computing/desktop-computers/mac-mini-m4-review">Mac mini M4</a>.</p><p>Since standard PC power cables are incredibly cheap, I plugged one in at my desk and had another in the entertainment center under my TV. That way, when I did want to play some of the <a href="https://www.tomsguide.com/best-picks/best-PC-games">best PC games</a> on a large screen, I could just move the G1 Pro into my living room.</p><h2 id="console-aesthetic-workstation-performance">Console aesthetic, workstation 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="ZtKL7DXtMnnhzFTuTxaJva" name="Minisforum G1 Pro-9" alt="The Minisforum G1 Pro on a desk" src="https://cdn.mos.cms.futurecdn.net/ZtKL7DXtMnnhzFTuTxaJva.jpg" mos="" align="middle" fullscreen="" width="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 G1 Pro may have a more gamer-friendly aesthetic but unlike the <a href="https://www.tomsguide.com/computing/desktop-computers/atomman-g7-pt">AtomMan G7 PT</a>, it won’t look out of place in an office setting. Sure, its white shell and unique design will draw attention but not the unwanted kind.</p><p>While the G1 Pro may be marketed as a mini gaming PC first and foremost, it’s a surprisingly capable work machine too. A big reason for this is because of its upgradeability. For instance, while my review unit shipped with 32GB of DDR5 RAM, you can actually put up to 96GB of RAM in its small case — but more on that later.</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="tW7rxiZJc4tUkP8DdZhMyd" name="Minisforum G1 Pro-10" alt="A desk setup built around the Minisforum G1 Pro" src="https://cdn.mos.cms.futurecdn.net/tW7rxiZJc4tUkP8DdZhMyd.jpg" mos="" align="middle" fullscreen="" width="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>In terms of my daily workload which consists of dozens of Chrome tabs opened simultaneously and editing images in GIMP, the G1 Pro never missed a beat. It handled everything I threw at it with ease with plenty of power left over for more demanding tasks.</p><div ><table><caption>Performance Benchmarks</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Minisforum G1 Pro</strong></p></th><th  ><p><strong>Geekom A9 Max</strong></p></th><th  ><p><strong>Framework Desktop</strong></p></th><th  ><p><strong>AtomMan G7 Ti</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Geekbench 6.5 single-core</strong></p></td><td  ><p>2806</p></td><td  ><p>2976</p></td><td  ><p>2966</p></td><td  ><p>2864</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6.5 multi-core</strong></p></td><td  ><p>11612</p></td><td  ><p>15140</p></td><td  ><p>17574</p></td><td  ><p>15651</p></td></tr><tr><td class="firstcol " ><p><strong>25GB file copy test (MBps)</strong></p></td><td  ><p>1659.65</p></td><td  ><p>1749.79</p></td><td  ><p>2976.46</p></td><td  ><p>1445.75</p></td></tr><tr><td class="firstcol " ><p><strong>Handbrake (Mins:Secs)</strong></p></td><td  ><p>3:12</p></td><td  ><p>3:25</p></td><td  ><p>2:43</p></td><td  ><p>3:50</p></td></tr></tbody></table></div><p>In the table above, you can see how well the G1 Pro fared compared to the competition. It held its own in Geekbench’s single-core tests in our lab, but its multi-core results weren’t nearly as high as those from the A9 Max, <a href="https://www.tomsguide.com/computing/mini-pcs/framework-desktop-review">Framework Desktop</a> and even the Intel-powered <a href="https://www.tomsguide.com/computing/desktop-computers/atomman-g7-ti-review">AtomMan G7 Ti</a>. Still, when transcoding a 4K video to 1080p in our Handbrake test, the G1 Pro finished the task in just over three minutes.</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:3217px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="5PcKnRz4dL4UhrWBsgoUPh" name="minisforum-g1-pro-speed-test" alt="The results of a Wi-Fi speed test run on the Minisforum G1 Pro" src="https://cdn.mos.cms.futurecdn.net/5PcKnRz4dL4UhrWBsgoUPh.jpg" mos="" align="middle" fullscreen="" width="3217" height="1809" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Another area where the G1 Pro really excels is with connectivity. In addition to Bluetooth 5.4, you also get full <a href="https://www.tomsguide.com/reference/wi-fi-7-explained">Wi-Fi 7</a> support. When connected to one of the <a href="https://www.tomsguide.com/best-picks/best-Wi-fi-7-routers">best Wi-Fi 7 routers</a> in the other room and running a speed test, I saw download speeds of 1.5 Gbps which is quite fast over Wi-Fi. Then again, if you have a real need for speed, you can always use an Ethernet cable to connect the G1 Pro directly to your router using the 5 Gigabit Ethernet port around back.</p><p>The biggest difference between the G1 Pro and the rest of these mini PCs though is in gaming performance, especially since it’s the only one with a dedicated, desktop-grade GPU.</p><h2 id="not-your-average-mini-pc-gpu">Not your average mini PC GPU</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4HPmHESfNxQA8eBusjAyck" name="Minisforum G1 Pro-12" alt="A person playing Ratchet & Clank: Rift Apart on the Minisforum G1 Pro" src="https://cdn.mos.cms.futurecdn.net/4HPmHESfNxQA8eBusjAyck.jpg" mos="" align="middle" fullscreen="" width="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>Typically when gaming on a mini PC, you’re relegated to using either integrated graphics or a discrete laptop-style GPU. The latter is obviously better but with the G1 Pro, you don’t have to settle for either of these lesser options. Instead, you have the power of a discrete, desktop-grade Nvidia RTX 5060 GPU at your disposal.</p><p>The G1 Pro is mainly designed for playing games at 1440p. However, as I had it hooked up to a 4K gaming monitor, I leveraged <a href="https://www.tomsguide.com/computing/gaming-laptops/i-just-experienced-dlss-4-and-now-i-can-never-go-back-heres-why">Nvidia DLSS 4</a> — and then later <a href="https://www.tomsguide.com/computing/gpus/i-went-eyes-on-with-nvidias-dlss-4-5-dynamic-multi-frame-generation-launching-march-31-and-its-a-game-changer">DLSS 4.5</a> — to bump up the framerate in more demanding games.</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="g9F3QatvNDTJetdfLqDyYo" name="Minisforum G1 Pro-13" alt="A person playing Death Stranding 2 on the Minisforum G1 Pro" src="https://cdn.mos.cms.futurecdn.net/g9F3QatvNDTJetdfLqDyYo.jpg" mos="" align="middle" fullscreen="" width="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 Super Resolution enabled, <a href="https://www.tomsguide.com/gaming/death-stranding-2-is-the-most-beautiful-game-ive-ever-played-and-its-everything-id-hope-for-in-a-sequel">Death Stranding 2</a> ran like a charm on this smaller, console-sized mini PC. I also played through a bit of <a href="https://www.tomsguide.com/reviews/ratchet-and-clank-rift-apart">Ratchet & Clank: Rift Apart</a> with DLSS enabled for equally impressive results. As it’s still in development, I even ran the demo for the upcoming skateboarding sim <a href="https://www.tomsguide.com/computing/mini-pcs/i-gave-my-favorite-pocketable-mini-pc-an-instant-upgrade-with-this-docking-station-and-now-its-a-full-fledged-gaming-rig">Skate Style</a> natively and even at 4K, it looked and ran great.</p><div ><table><caption>Gaming Benchmarks (in FPS, @ 1080p)</caption><thead><tr><th class="firstcol empty" ></th><th  ><p>Minisforum G1 Pro</p></th><th  ><p>Framework Desktop</p></th><th  ><p>AtomMan G7 Ti</p></th><th  ><p>AtomMan G7 PT</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Metro Exodus</strong></p></td><td  ><p>51.45</p></td><td  ><p>56.56</p></td><td  ><p>91.63</p></td><td  ><p>86.12</p></td></tr><tr><td class="firstcol " ><p><strong>Cyberpunk 2077</strong></p></td><td  ><p>45.21</p></td><td  ><p>22.09</p></td><td  ><p>39.90</p></td><td  ><p>21.35</p></td></tr><tr><td class="firstcol " ><p><strong>Red Dead Redemption 2</strong></p></td><td  ><p>90.66</p></td><td  ><p>56.57</p></td><td  ><p>73</p></td><td  ><p>58.78</p></td></tr></tbody></table></div><p>In our lab tests, the G1 Pro performed well across the board without DLSS enabled. We saw 90 fps in <a href="https://www.tomsguide.com/us/red-dead-redemption-2,review-5905.html">Red Dead Redemption 2</a> at 1080p, while <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a> saw a less than ideal but still playable 45 fps at native resolution. With DLSS and upscaling enabled, though, you can easily push past 60 fps in the most demanding AAA titles.</p><p>Having a desktop-grade Nvidia RTX 5060 installed from the get-go is one of the most compelling things about the G1 Pro. However, just like its RAM and storage, you can actually swap out your GPU later on if you need even more power.</p><h2 id="small-but-surprisingly-expandable">Small but surprisingly expandable</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2FHnzfvzYG4smrLZ6b6N75" name="Minisforum G1 Pro-14" alt="The Minisforum G1 Pro open on a table with its lid visible" src="https://cdn.mos.cms.futurecdn.net/2FHnzfvzYG4smrLZ6b6N75.jpg" mos="" align="middle" fullscreen="" width="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>Opening up the G1 Pro to make upgrades is surprisingly simple. After removing the vertical stand and two screws on the base of the machine, the vented side panel just slides right off.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zfwjqYUMCVUWV7S7skuLr8" name="Minisforum G1 Pro-15" alt="The Minisforum G1 Pro open on a table" src="https://cdn.mos.cms.futurecdn.net/zfwjqYUMCVUWV7S7skuLr8.jpg" mos="" align="middle" fullscreen="" width="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>Doing so lets you see the Nvidia RTX 5060 from Gigabyte on the left, a large blower-style fan above the CPU in the center and the 350W power supply on the right. Despite the G1 Pro’s smaller size, Minisforum managed to pack a lot of powerful components into this case with well-managed cables to boot.</p><p>Now you can add more memory or storage, but doing so requires unplugging the power supply’s main connector and removing the CPU fan. While one of the M.2 SSD slots is occupied with a 1TB drive, there’s a free one next to it. In total, you can add up to 8TB of storage with a 4TB SSD in each slot. Minisforum even includes an extra SSD heatsink in the box, which is a nice touch for those adding a second high-speed drive.</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="FTWhofRTgocWsSvY42pApB" name="Minisforum G1 Pro-16" alt="A close up shot of the Minisforum G1 Pro's internals" src="https://cdn.mos.cms.futurecdn.net/FTWhofRTgocWsSvY42pApB.jpg" mos="" align="middle" fullscreen="" width="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>Although you can’t see it here, there’s a single stick of 32GB DDR5 RAM underneath the CPU cooler. However, there’s a second, free slot next to it. Once <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAMaggedon</a> is behind us, you could utilize both to configure the G1 Pro with a whopping 96GB of memory.</p><p>A quick note on the single-channel RAM configuration my review unit shipped with: running a PC in single-channel mode does lead to a bottleneck, which is likely why those Geekbench multi-core scores from earlier were lower than expected. However, if you do decide to upgrade the G1 Pro’s RAM, you can just add another 32GB stick; if you had two 16GB sticks, you’d have to ditch them entirely to reach 64GB or more.</p><p>Though 96GB of RAM will definitely be overkill for most, if you’re using this mini PC for 8K video editing or running LLMs locally, it’s nice to know that you have plenty of room to expand in the future. Speaking of which, since the G1 Pro uses a standard GPU — albeit a low-profile one — you could theoretically swap out the included RTX 5060 with an RTX 6060 once Nvidia’s next-gen GPUs hit the market.</p><h3 class="article-body__section" id="section-minisforum-g1-pro-the-downs"><span>Minisforum G1 Pro: The Downs</span></h3><p>The Minisforum G1 Pro is truly a remarkable mini PC that breaks new ground. However, it’s not without its downsides, which include a sparse port selection for your accessories and fans that can get quite noisy when running demanding workloads or graphically-intensive games.</p><h2 id="port-shortage-but-not-for-video">Port shortage (but not for video)</h2><p>Just like with the AtomMan G7 Ti, I wish the G1 Pro had a few more USB-A ports. Since I switch between computers so much, I prefer using a 2.4 GHz USB dongle for my mouse and keyboard as opposed to Bluetooth. This lets me quickly get up and running when setting up a new PC.</p><p>You do get three USB-A ports — one on the front and two on the back — with the G1 Pro. However, since I have a pair of <a href="https://www.tomsguide.com/audio/speakers/kanto-ora">Kanto Ora</a> bookshelf speakers hooked up via USB along with the dongles for my mouse and keyboard, I found myself at a loss when I wanted to plug in the dongle for a controller. One more USB-A port to get the total up to four would have been a nice addition here.</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="5Gr9uV3a9QGvpzUvJCgdXF" name="Minisforum G1 Pro-3" alt="The rear video out ports from the GPU on the Minisforum G1 Pro" src="https://cdn.mos.cms.futurecdn.net/5Gr9uV3a9QGvpzUvJCgdXF.jpg" mos="" align="middle" fullscreen="" width="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 don’t get quite as many USB-A ports as you do on a machine like the Geekom A9 Max, you do get loads of video out ports. Both the front and back USB-C ports are capable of video out, but the G1 Pro also features two HDMI 2.1 ports and two DisplayPort connections. </p><p>If you want to run a multi-monitor setup, the G1 Pro is more than capable of doing so with ease. However, if you have a lot of older accessories that use USB-A, then you’ll likely need to pair this mini PC with a hub to get all the ports you need.</p><h2 id="the-beast-unleashed">The beast unleashed</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8o7vER3qxPHWuZuPurYecJ" name="Minisforum G1 Pro-8" alt="An overhead shot of the Minisforum G1 Pro showing off its top exhaust" src="https://cdn.mos.cms.futurecdn.net/8o7vER3qxPHWuZuPurYecJ.jpg" mos="" align="middle" fullscreen="" width="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>Let’s face it: mini PCs can get noisy due to their smaller size, and the G1 Pro certainly suffers from this, but only when pushing the machine with demanding games or intensive workloads. With my sound meter, I measured 40dB when using this mini PC for work which is roughly as loud as a quiet library. However, when I booted up a resource-intensive game like Death Stranding 2, I saw sound levels reach as high as 60dB.</p><p>Although 60dB is quite loud if you have the G1 Pro sitting right next to you on a desk, switching to a pair of <a href="https://www.tomsguide.com/audio/headphones/apples-cheapest-accessory-helped-me-get-through-a-13-hour-flight-this-is-a-life-saver">wired USB-C headphones</a> did the trick and made that extra fan noise a lot less noticeable. One of the <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">best gaming headsets</a> would have worked just as well.</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:2850px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qQyHmZtBviGnHxmTfDSn8N" name="minisforum-app" alt="A screenshot showing off the included software for tweaking the performance of the Minisforum G1 Pro" src="https://cdn.mos.cms.futurecdn.net/qQyHmZtBviGnHxmTfDSn8N.jpg" mos="" align="middle" fullscreen="" width="2850" height="1603" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>To help manage the noise, Minisforum’s pre-installed software allows you to switch between Work, Gaming, and Beast modes. These modes adjust the Ryzen 9's power limit from 60W all the way up to a staggering 100W. Depending on which one you use, the G1 Pro will prioritize either a quiet workspace or raw performance. While the software is intuitive and easy to use, I would have liked to see a dedicated physical mode switch on the front of the case, similar to the one on the AtomMan G7 Ti or G7 Pt.</p><h3 class="article-body__section" id="section-minisforum-g1-pro-verdict"><span>Minisforum G1 Pro: Verdict</span></h3><p>The Minisforum G1 Pro certainly lived up to the initial early impression I had when I first saw it at Computex last summer. It’s sleek, small and packed with powerful but more importantly upgradeable components and this really helps set it apart from other mini PCs as well as Minisforum’s previous devices.</p><p>At $1,439, it is more expensive than a console as well as most other mini PCs. However, for the price, you’re getting a dedicated Nvidia GPU which gives you access to DLSS and loads of other features. At the same time, you’re not stuck with soldered RAM and also have the ability to add more storage or even to swap out its low-profile GPU for a more powerful one down the line.</p><p>Despite its small package, the G1 Pro delivers both as a gaming machine and as a workstation. While I would have loved a few more USB-A ports, that’s by no means a dealbreaker. The same is true for heightened noise levels under heavy load since wearing a pair of headphones completely drowned out all that extra sound.</p><p>If you’re looking for a mini PC you can also game on and don’t want to be stuck with a laptop GPU or an external GPU dock, the G1 Pro is an innovative and fantastic machine for both work and play.</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/mini-pcs/forget-consoles-i-spent-a-week-with-this-mini-pc-in-my-living-room-and-i-cant-believe-how-well-it-performs">I took the Framework Desktop out to my living room and I can’t believe I’m actually gaming in 4K on an iGPU</a></li><li><a href="https://www.tomsguide.com/computing/mini-pcs/i-tried-this-ai-powered-mini-pc-for-a-week-and-this-unique-feature-earned-it-a-permanent-spot-on-my-desk">I spent a week with this AI-powered mini PC and the buttons on the front earned it a permanent spot on my desk</a></li><li><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">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</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Ticking time bomb bug in macOS disables network connectivity after 49 days — but there’s a fix ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/macbooks/ticking-time-bomb-bug-in-macos-disables-network-connectivity-after-49-days-but-theres-a-fix</link>
                                                                            <description>
                            <![CDATA[ Newly discovered macOS bug completely disables your internet connection if your Mac is left on for 49 days without a reboot. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ggYUwBUvyJAT5BUnLKDBGG</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/WNK5Zs69wY5j94beX98P3A-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 09 Apr 2026 17:32:45 +0000</pubDate>                                                                                                                                <updated>Thu, 09 Apr 2026 17:46:11 +0000</updated>
                                                                                                                                            <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/WNK5Zs69wY5j94beX98P3A-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[MacBook Pro M5]]></media:description>                                                            <media:text><![CDATA[MacBook Pro M5]]></media:text>
                                <media:title type="plain"><![CDATA[MacBook Pro M5]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/WNK5Zs69wY5j94beX98P3A-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Although you certainly can <a href="https://www.tomsguide.com/computing/mini-pcs/i-hated-the-mac-mini-m4s-power-button-until-i-accidentally-proved-apple-was-right">leave your Mac on</a> for days at a time without any issues, a newly discovered <a href="https://www.tomsguide.com/news/this-macos-flaw-lets-hackers-install-undeletable-malware-on-your-mac-how-to-stay-safe">macOS bug</a> will certainly make you think twice about doing so.</p><p>As reported by <a href="https://www.tomshardware.com/software/macos/macos-has-a-49-7-day-networking-time-bomb-built-in-that-only-a-reboot-fixes-comparison-operation-on-unreliable-time-value-stops-machines-dead-in-their-tracks" target="_blank">Tom’s Hardware</a>, the AI infrastructure and developer tools startup Photon recently discovered a “ticking time bomb” that affects every Mac. Fortunately, though, this isn’t a security bug that can be exploited by hackers. Instead, it’s the kind of bug that could leave you scratching your head if you use one of the <a href="https://www.tomsguide.com/best-picks/best-macbook">best MacBooks</a> and leave your laptop on for over a month at a time. </p><p>According to a <a href="https://photon.codes/blog/we-found-a-ticking-time-bomb-in-macos-tcp-networking" target="_blank">blog post</a> from Photon, “every Mac has a hidden expiration date.” No, your Mac won’t become unusable, and you won’t have to upgrade to a new machine. However, “after exactly 49 days, 17 hours, 2 minutes and 47 seconds of continuous uptime,” macOS experiences an “integer overflow” that “freezes the internal TCP timestamp clock.”</p><p>But what does this mean for the average Mac user? Well, once your machine has been running for exactly this long, existing TCP network connections won’t expire as they normally should. Essentially, this means that your Mac won’t be able to connect to the internet, which is why many of us get a computer in the first place.</p><p>Photon likely let Apple know once it discovered this issue, and the firm is currently working on its own solution. However, there’s an easy fix that won’t require an update or bringing your Mac to an Apple Store.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Oq8AZW"></div>                            </div>                            <script src="https://kwizly.com/embed/Oq8AZW.js" async></script><h2 id="a-simple-workaround">A simple workaround</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NP9dUKbVoFCw486fAx7Up5" name="Satechi Mac Mini M4 Stand and Hub-4" alt="A picture showing how Satechi's hub and stand for the Mac mini M4 allows you to easily reach its power button" src="https://cdn.mos.cms.futurecdn.net/NP9dUKbVoFCw486fAx7Up5.jpg" mos="" align="middle" fullscreen="" width="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 worried about your Mac losing internet connectivity, don’t be. The issue itself stems from integer overflow, where your Mac’s TCP timestamp clock keeps counting until it reaches a max value of 4,294,967,295 seconds or 49.7 days.</p><p>To get around this, all you have to do is <a href="https://www.tomsguide.com/how-to/how-to-troubleshoot-and-reset-bluetooth-on-mac">reboot your Mac</a> before the 49-day mark, and everything will be fine. Just like on one of the <a href="https://www.tomsguide.com/us/best-apple-iphone,review-6348.html">best iPhones</a>, you should reboot your Mac every week. To make things easier, you can even <a href="https://www.tomsguide.com/phones/you-can-schedule-your-mac-to-turn-off-and-on-heres-how">schedule your Mac to turn off and on</a>.</p><p>Besides fixing this specific macOS bug, a reboot also flushes memory leaks, clears system caches and temp files, cools down the machine and resets peripheral controllers, which can help rectify other odd glitches with Bluetooth and USB-C docks.</p><p>Apple isn’t alone here either, as Windows 98 also crashed after 49.7 days of uptime. Likewise, when it comes to running out of digits while counting, this same issue is why we were all so worried about Y2K back in 1999, and it’s also why the <a href="https://www.tomsguide.com/us/2038-bug-bh2017,news-25551.html">year 2038</a> could lead to similar concerns when Unix is no longer able to measure time for the same reason. But that’s a problem for another day.</p><p>I’m sure that Apple is aware of this issue and is taking steps to address it, hopefully in the next big macOS update. In the meantime, though, just remember to give your Mac a reboot every seven days, and you’ll be perfectly fine.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/home/home-office/i-turned-a-bookshelf-into-a-hidden-home-lab-and-it-completely-decluttered-my-office">I built a hidden network hub to declutter my home office but it can do so much more</a></li><li><a href="https://www.tomsguide.com/computing/macos/how-to-view-wi-fi-passwords-on-mac">How to view Wi-Fi passwords on Mac</a></li><li><a href="https://www.tomsguide.com/computing/internet/i-thought-speed-tests-were-the-be-all-and-end-all-way-to-measure-my-internet-connection-until-i-tried-orb">I thought speed tests were the be-all and end-all way to measure my internet connection until I tried Orb</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I'm a diehard Apple user — here are 9 golden discounts on devices and accessories that I'd buy right now ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/apple-desktops/im-a-diehard-apple-user-here-are-9-golden-discounts-on-devices-and-accessories-that-id-buy-right-now</link>
                                                                            <description>
                            <![CDATA[ In light of its 50th birthday, Apple's just discounted a bunch of products on Amazon — here are the 9 I'd buy right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">uQfRzivodU36tg5bxfBvVD</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/RDQ9CYRdhwZTLwJXt2N2tb-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 02 Apr 2026 00:56:47 +0000</pubDate>                                                                                                                                <updated>Thu, 09 Apr 2026 04:33:47 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ lucy.scotting@futurenet.com (Lucy Scotting) ]]></author>                    <dc:creator><![CDATA[ Lucy Scotting ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/UC9ncAYxkmJ5ipHEyX44ri.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Lucy Scotting is a staff writer for Tom’s Guide Australia, primarily covering lifestyle, streaming and internet-related news. Lucy started her career writing for HR and staffing industry publications, with articles covering emerging tech, business and finance.&lt;/p&gt;&lt;p&gt;In her spare time, Lucy can be found watching sci-fi movies, working on her dystopian fiction novel (in progress since 2017) or hanging out with her dog, Fletcher. If she’s not found doing any of the above, she’s likely on her next adventure to a new city, country, or continent. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/RDQ9CYRdhwZTLwJXt2N2tb-1280-80.jpg">
                                                            <media:credit><![CDATA[Future / Apple / Edited with Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple products on rainbow gradient background]]></media:description>                                                            <media:text><![CDATA[Apple products on rainbow gradient background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple products on rainbow gradient background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/RDQ9CYRdhwZTLwJXt2N2tb-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you have an Apple ecosystem at home, you probably already know the rarity of finding a good deal from the iPhone maker. With the most affordable Apple products still costing upwards of AU$800, it's safe to say that an Apple purchase is a certified investment. </p><p>That said, any discounts that undercut Apple devices by 10% or more are worth cheering for, and these killer prices I've just found are no exception. </p><p>Now <a href="https://www.tomsguide.com/news/live/apple-50th-anniversary">celebrating its fiftieth year</a>, Apple has cheekily discounted a range of its best-sellers on Amazon. With up to 40% off Apple Watches, MacBooks, iPhones, iPads, and accompanying accessories, <a href="https://www.amazon.com.au/stores/Apple/page/A73CF337-6406-4B4B-822A-C4E9B79BAE52?lp_asin=B0FQF9T68C&ref_=ast_bln" target="_blank">Apple's Amazon storefront has a complete list of discounted items</a>. </p><p>To get you started on finding your next Apple product, I've handpicked my favourite nine deals below. With hot prices across the latest Apple Watch 11, AirPods 4 and iPhone Air, these discounts aren't exclusive to older products, which is a big win in my book.  </p><p>You'll need to act fast to secure an Apple bargain, though — these Amazon prices won't stick around too long!</p>        <div class="featured_product_block featured_block_hero" data-id="0afca23d-8e81-4d5b-9109-72718fe4dfe6">            <a href="https://www.amazon.com.au/Apple-iPhone-Air-eSIM-only/dp/B0FQFYV39D" data-model-name="iPhone Air" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.37%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/mYey7jZYBAXULTeNby3b6V.jpg" alt="Apple product on rainbow gradient"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Apple</div>                                        <div class="featured__title">iPhone Air</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="fa5052d9-ffb6-49d5-8e0c-96e5a9f28786">            <a href="https://www.amazon.com.au/Apple-iPad-Air-11-inch-Wi-Fi/dp/B0DZ83Q3S8/ref=ast_sto_dp_puis" data-model-name="iPad Air (M3)" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.37%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/4uDA8e8yBJaGVp4aN5STAV.jpg" alt="Apple product on rainbow gradient"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Apple</div>                                        <div class="featured__title">iPad Air (M3)</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="af496c9e-3015-45da-a2e3-9ad00b8b6132">            <a href="https://www.amazon.com.au/Apple-MacBook-13-inch-10%E2%80%91core-Unified/dp/B0DZF4FXXN" data-model-name="MacBook Air 13-inch (M4)" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.37%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/kMFqaeeshm9BRSmsUKSRAV.jpg" alt="Apple product on rainbow gradient"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Apple</div>                                        <div class="featured__title">MacBook Air 13-inch (M4)</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="89c49ded-2eff-4ec4-9f59-99f8bee4ebc9">            <a href="https://www.amazon.com.au/Apple-MacBook-15-inch-10%E2%80%91core-Unified/dp/B0DZF1QHWF" data-model-name="MacBook Air 15-inch (M4)" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.37%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/LxMR25dyqyWZmTPFukBmAV.jpg" alt="Apple product on rainbow gradient"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Apple</div>                                        <div class="featured__title">MacBook Air 15-inch (M4)</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="4a54df1d-85f4-443b-8aa6-e0d532634721">            <a href="https://www.amazon.com.au/Apple-Silver-Aluminium-Purple-Always/dp/B0FQG918W3" data-model-name="Watch Series 11" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.37%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/zgEphR25owr5HuQybJvX7V.jpg" alt="Apple product on rainbow gradient"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Apple</div>                                        <div class="featured__title">Watch Series 11</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="b1201b88-9e32-4d84-82fc-8379187ea59b">            <a href="https://www.amazon.com.au/Apple-Watch-Midnight-Aluminium-Always/dp/B0FQF9T68C" data-model-name="Watch SE (3rd Gen)" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.37%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/DMfAerkk26ktri9AjMD99V.jpg" alt="Apple product on rainbow gradient"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Apple</div>                                        <div class="featured__title">Watch SE (3rd Gen)</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="966fe711-1be3-4ffe-8505-cc84a6a7a279">            <a href="https://www.amazon.com.au/Apple-MXP63ZA-A-AirPods-4/dp/B0DGJ2X3QV/" data-model-name="AirPods 4" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.37%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/fajjUgfQziAyYhuMxJSAAV.jpg" alt="Apple product on rainbow gradient"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Apple</div>                                        <div class="featured__title">AirPods 4</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="599760ef-1396-48b9-b7e5-1a084fb32dd7">            <a href="https://www.amazon.com.au/Apple-Pencil-Pro-Pixel-Perfect-Industry-Leading/dp/B0D3J8K7LN" data-model-name="Pencil Pro" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.37%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/7jA5r7kzdaRDQ52FHPmi6V.jpg" alt="Apple product on rainbow gradient"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Apple</div>                                        <div class="featured__title">Pencil Pro</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="6223aa33-2587-4a1b-a467-b12e509b9467">            <a href="https://www.amazon.com.au/Apple-Backpack-Replaceable-Battery-Water-Resistant/dp/B097QL9W35" data-model-name="AirTag (4-Pack)" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.37%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/ZNtzreCMQyGDaaiQYKPQAV.jpg" alt="Apple product on rainbow gradient"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Apple</div>                                        <div class="featured__title">AirTag (4-Pack)</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ RIP cheese grater: Apple has officially discontinued the Mac Pro but I wouldn't buy a Mac Studio yet ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/apple-desktops/rip-cheese-grater-apple-has-officially-discontinued-the-mac-pro-but-i-wouldnt-buy-a-mac-studio-yet</link>
                                                                            <description>
                            <![CDATA[ Apple has discontinued the Mac Pro with no plans for a sequel, but I wouldn't rush out and buy a Mac Studio yet. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">aEmVMFCovoUBwdpgzoquyW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jfyGETbHM2xn8oCQ967ivU-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 27 Mar 2026 20:53:35 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></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.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/jfyGETbHM2xn8oCQ967ivU-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Mac Pro 2019]]></media:description>                                                            <media:text><![CDATA[Mac Pro 2019]]></media:text>
                                <media:title type="plain"><![CDATA[Mac Pro 2019]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jfyGETbHM2xn8oCQ967ivU-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple has discontinued the infamous cheese grater Mac Pro and its $700 wheels. As of March 26, the iconic Apple Mac Pro is no longer on the Apple website; instead, would-be shoppers are <a href="https://www.apple.com/us/shop/goto/buy_mac/mac_pro" target="_blank">redirected to other Mac computers</a>.</p><p>Apple confirmed to <a href="https://9to5mac.com/2026/03/26/apple-discontinues-the-mac-pro/" target="_blank">9to5Mac </a>that it will no longer be offering the Mac Pro, and that there are no plans to develop new models.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WQKEMX"></div>                            </div>                            <script src="https://kwizly.com/embed/WQKEMX.js" async></script><p>With this week's discontinuation that drops Apple's desktop lineup to three devices: </p><ul><li>24-inch iMac M4</li><li>Mac mini M4 or M4 Pro</li><li>Mac Studio with M4 Max or M3 Ultra</li></ul><p>Plus the three laptops; <a href="https://www.tomsguide.com/computing/macbooks/i-ditched-the-macbook-air-for-a-macbook-neo-for-48-hours-and-i-was-shocked">MacBook Neo</a>, MacBook Air, and MacBook Pro.</p><h2 id="a-short-history">A short history</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:666px;"><p class="vanilla-image-block" style="padding-top:56.01%;"><img id="WFFeuKyNT6KEiXxcJET6Jj" name="Mac-Pro-Wheels_wheels.jpg" alt="Mac Pro wheels" src="https://cdn.mos.cms.futurecdn.net/WFFeuKyNT6KEiXxcJET6Jj.jpg" mos="" align="middle" fullscreen="" width="666" height="373" 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 cheese greater <a href="https://www.tomsguide.com/us/mac-pro-2019-specs-price,news-30241.html">Mac Pro debuted in 2019</a> alongside the Pro Display XDR (also recently discontinued). The original version was powered by an Intel Xeon W chipset, featuring 32GB of ram and 256GB SSD. A $52,000 version had a 28 core Intel Xeon W chip with 1.5TB of RAM and a 4TB SSD.</p><p>The <a href="https://www.tomsguide.com/news/mac-pro-2023">last update</a> it got was in 2023, when Apple refreshed the model with the M2 Ultra chip, and priced it at $6,999. As recently as June 2025 it was rumored that a new <a href="https://www.tomsguide.com/computing/macbooks/apples-entire-mac-lineup-until-2026-revealed-in-leak-heres-every-macbook-mac-pro-and-more-to-expect">M5-powered Mac Pro would arrive</a> this year and a low-end Mac Pro. With a lack of significant updates, the writing has been on the wall for the Mac Pro for a couple of years now.</p><h2 id="perhaps-wait-on-a-mac-studio">Perhaps wait on a Mac Studio</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="STqvPLhTaGcUufjS9tmxsW" name="Mac Studio 2025" alt="Mac Studio M4 Max" src="https://cdn.mos.cms.futurecdn.net/STqvPLhTaGcUufjS9tmxsW.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>If you're looking for a high-end Apple desktop, all we have left is the Mac Studio, but you may want to wait on upgrading. Currently, Apple offers the Studio in mismatched M4 Max and M3 Ultra CPU options. </p><p>Bloomberg's Mark Gurman has claimed that an <a href="https://www.tomsguide.com/computing/cpus/next-mac-studio-with-m5-ultra-chip-set-to-be-apples-most-powerful-yet-heres-when-it-may-arrive">M5 Ultra-powered Mac Studio</a> is coming this year. Though, he hedged that it will arrive after Apple announced the M5 Ultra and Max chipsets.</p><p>At the beginning of March, Apple revealed the new <a href="https://www.tomsguide.com/computing/macbooks/macbook-pro-m5-pro-and-m5-max-announced-price-release-date-specs-and-more">MacBook Pro M5 Pro and M5 Max</a>, but has yet to announce the M5 Ultra. In previous years, Apple launched its M ultra chips in March for the M1 and M3, with the M2 Ultra debuting in June.</p><p>It's possible that Apple could reveal the M5 Ultra at<a href="https://www.tomsguide.com/tech-events/apples-wwdc-2026-conference-kicks-off-in-june-heres-what-we-expect-to-see"> WWDC 2026</a>, which takes place June 8 - 12.</p><p>If that's the case, Apple may debut the Mac Studio M5 Ultra this October when it typically reveals its new MacBooks and MacBook Pro laptops. This year's versions have been rumored to feature an <a href="https://www.tomsguide.com/computing/macbooks/the-touchscreen-macbook-pro-oled-is-coming-with-a-new-interface-and-it-could-be-the-biggest-upgrade-in-years">M6 chip and OLED display</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/iphone-air-deal-lowest-price-300-pounds-off">I returned my iPhone Air, but now it's on sale for £699, and that's a no-brainer purchase</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-26-4-is-here-13-new-upgrades-for-your-iphone-you-need-to-know">iOS 26.4 is here — 13 new upgrades for your iPhone you need to know</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-ran-a-half-marathon-with-the-apple-watch-ultra-3-vs-garmin-forerunner-970-to-test-the-gps-and-heart-rate-accuracy-heres-the-winner">I ran a half marathon with the Apple Watch Ultra 3 vs Garmin Forerunner 970 to test the GPS and heart rate accuracy — here’s the winner</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I test gaming PCs for a living — this $400-off deal feels like getting away with something ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/gaming-desktops/my-favorite-pre-built-gaming-pc-is-usd400-off-and-its-beating-the-ram-price-crisis</link>
                                                                            <description>
                            <![CDATA[ Right now, you can get my top pick — the iBuyPower Ready 9 Pro R07 with Radeon RX 9070 XT for $1,949. That’s a massive $400 off which brings it down to the kind of price you’d see for a pre-built like this before the RAM price crisis kicked off! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JdPgQicp4HXAn3mfPZ7MTa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/8UNEznyafCf3MxrEvTkavh-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 25 Mar 2026 06:30:00 +0000</pubDate>                                                                                                                                <updated>Wed, 25 Mar 2026 10:19:50 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Desktops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/8UNEznyafCf3MxrEvTkavh-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iBuyPower RDY Element 9 Pro R07]]></media:description>                                                            <media:text><![CDATA[iBuyPower RDY Element 9 Pro R07]]></media:text>
                                <media:title type="plain"><![CDATA[iBuyPower RDY Element 9 Pro R07]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/8UNEznyafCf3MxrEvTkavh-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I get it. Saying “Gaming PC” and “deal” in the same headline is kind of like saying “DDR5 RAM prices are totally normal.” The <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAM price crisis</a> is claiming a lot of victims, but one is beating the odds, and it just so happens to be my top-ranked <a href="https://www.tomsguide.com/us/best-gaming-pc,review-2219.html">best gaming PC</a> you can buy.</p><p>Right now, you can get my top pick — the <a href="https://www.ibuypower.com/store/rdy-element-9-pro-r07" target="_blank" rel="nofollow">iBuyPower RDY 9 Pro R07 with Radeon RX 9070 XT for $1,949</a>. That’s a massive $400 off which brings it down to the kind of price you’d see for a pre-built like this before the RAM price crisis kicked off!</p><div class="product"><a data-dimension112="d0a72524-f815-41c4-bb7c-9fe10539b1f8" data-action="Deal Block" data-label="A serious bang-for-your-buck monster, the RDY 9 Pro R07 comes packed with the AMD Ryzen 7 7800X3D CPU, RX 9070 XT GPU, 32GB DDR5 RAM and a 2TB SSD — all housed in a gorgeous case that reveals all the parts." data-dimension48="A serious bang-for-your-buck monster, the RDY 9 Pro R07 comes packed with the AMD Ryzen 7 7800X3D CPU, RX 9070 XT GPU, 32GB DDR5 RAM and a 2TB SSD — all housed in a gorgeous case that reveals all the parts." data-dimension25="$1949" href="https://www.ibuypower.com/store/rdy-element-9-pro-r07" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1024px;"><p class="vanilla-image-block" style="padding-top:107.32%;"><img id="SohtaUjQiLhz5khzP9oDDG" name="iBuyPower gaming desktop" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SohtaUjQiLhz5khzP9oDDG.png" mos="" align="middle" fullscreen="" width="1024" height="1099" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>A serious bang-for-your-buck monster, the RDY 9 Pro R07 comes packed with the AMD Ryzen 7 7800X3D CPU, RX 9070 XT GPU, 32GB DDR5 RAM and a 2TB SSD — all housed in a gorgeous case that reveals all the parts.<a class="view-deal button" href="https://www.ibuypower.com/store/rdy-element-9-pro-r07" target="_blank" rel="nofollow" data-dimension112="d0a72524-f815-41c4-bb7c-9fe10539b1f8" data-action="Deal Block" data-label="A serious bang-for-your-buck monster, the RDY 9 Pro R07 comes packed with the AMD Ryzen 7 7800X3D CPU, RX 9070 XT GPU, 32GB DDR5 RAM and a 2TB SSD — all housed in a gorgeous case that reveals all the parts." data-dimension48="A serious bang-for-your-buck monster, the RDY 9 Pro R07 comes packed with the AMD Ryzen 7 7800X3D CPU, RX 9070 XT GPU, 32GB DDR5 RAM and a 2TB SSD — all housed in a gorgeous case that reveals all the parts." data-dimension25="$1949">View Deal</a></p></div><h2 id="who-should-buy-this">Who should buy 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8shwfrvbZjSJS765iRuG9U" name="iBuyPower RDY Element 9 Pro R07" alt="iBuyPower RDY Element 9 Pro R07" src="https://cdn.mos.cms.futurecdn.net/8shwfrvbZjSJS765iRuG9U.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>As any gaming PC, the more money you put into it, the more performance you get on the other end. </p><p>But you’ll be surprised at just how much performance you can get out of this mid-to-high tier level without needing to break the bank completely and go for something with an RTX 5080 or higher. That's definitely what I found out in my <a href="https://www.tomsguide.com/computing/gaming-desktops/ibuypower-rdy-element-9-pro-r07-review">RDY Element 9 Pro R07 review</a>.</p><p>So let’s take a closer look at gaming performance, which is mightily impressive. The numbers on that <a href="https://www.tomsguide.com/computing/gpus/amd-radeon-rx-9070-xt-review">RX 9070 XT</a> rival the much more expensive <a href="https://www.tomsguide.com/computing/gpus/nvidia-geforce-rtx-5070-ti-review">RTX 5070 Ti</a> and in raw rendering performance, you’ll get some stellar smooth frame rates at 1440p.</p><div ><table><caption>Raw rasterization performance (1440p)</caption><thead><tr><th class="firstcol " ><p>GPU</p></th><th  ><p><strong>Cyberpunk 2077 ray tracing ultra 1440p</strong></p></th><th  ><p><strong>Forza Horizon 5 max settings 1440p</strong></p></th><th  ><p>Call of Duty max settings no frame gen 1440p</p></th><th  ><p>Black Myth: Wukong Cinematic 1440p</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>RX 9070 XT</strong></p></td><td  ><p>30.2 FPS</p></td><td  ><p>190.8 FPS</p></td><td  ><p><strong>173 FPS</strong></p></td><td  ><p>62 FPS</p></td></tr><tr><td class="firstcol " ><p><strong>RTX 5070 Ti</strong></p></td><td  ><p><strong>55.5 FPS</strong></p></td><td  ><p><strong>196 FPS</strong></p></td><td  ><p>169 FPS</p></td><td  ><p><strong>86 FPS</strong></p></td></tr><tr><td class="firstcol " ><p><strong>RTX 5070</strong></p></td><td  ><p>38.2 FPS</p></td><td  ><p>158 FPS</p></td><td  ><p>139 FPS</p></td><td  ><p>84 FPS</p></td></tr><tr><td class="firstcol " ><p><strong>RTX 5060 Ti</strong></p></td><td  ><p>32.8 FPS</p></td><td  ><p>121 FPS</p></td><td  ><p>80 FPS</p></td><td  ><p>45 FPS</p></td></tr></tbody></table></div><p>When you go up to 4K, it can still more than handle its own in certain titles, and when something like Cyberpunk 2077 at Ray Tracing Ultra bogs it down, you can rely on FSR resolution scaling to get you back up to that 4K 60+ FPS sweet spot.</p><div ><table><caption>Raw rasterization performance (4K)</caption><thead><tr><th class="firstcol " ><p>GPU</p></th><th  ><p><strong>Cyberpunk 2077 ray tracing ultra 4K</strong></p></th><th  ><p><strong>Forza Horizon 5 max settings 4K</strong></p></th><th  ><p>Call of Duty max settings no frame gen 4K</p></th><th  ><p>Black Myth: Wukong Cinematic 4K</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>RX 9070 XT</strong></p></td><td  ><p>25.7 FPS</p></td><td  ><p>105.4 FPS</p></td><td  ><p>92 FPS</p></td><td  ><p>57 FPS</p></td></tr><tr><td class="firstcol " ><p><strong>RTX 5070 Ti</strong></p></td><td  ><p>33.7 FPS</p></td><td  ><p>113 FPS</p></td><td  ><p>86 FPS</p></td><td  ><p>73 FPS</p></td></tr><tr><td class="firstcol " ><p><strong>RTX 5070</strong></p></td><td  ><p>17 FPS</p></td><td  ><p>95 FPS</p></td><td  ><p>67 FPS</p></td><td  ><p>32 FPS</p></td></tr><tr><td class="firstcol " ><p><strong>RTX 5060 Ti</strong></p></td><td  ><p>15.6 FPS</p></td><td  ><p>69 FPS</p></td><td  ><p>60 FPS</p></td><td  ><p>41 FPS</p></td></tr></tbody></table></div><p>And that’s before even speaking about FSR Redstone and its DLSS-esque capabilities of handling ray tracing and smoothly scaling games without any of that telltale smearing or ghosting.</p><p>But on top of that, you’re getting a great 3-year warranty with the deal, which covers any defective components, diagnostics and repair should you ever need it. I even put that to the test by slightly unseating a RAM stick and contacting their support, who were quick to pick up and spotted the problem almost immediately.</p><h2 id="not-the-only-deal">Not the only deal</h2><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="brynxywMTwsDwqTUq7tNzT" name="iBuyPower RDY Element 9 Pro R07" alt="iBuyPower RDY Element 9 Pro R07" src="https://cdn.mos.cms.futurecdn.net/brynxywMTwsDwqTUq7tNzT.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>Of course, this is a sale across more than just this particular spec of iBuyPower’s prebuilts. A huge range is being discounted right now, and with the code CLEARANCE, you can get:</p><ul><li>$200 off Prebuilt systems over $2,999</li><li>$100 off systems over $1,999</li><li>$50 off systems over $999</li></ul><p>This code can be used between now and until the end of March 31st, so whether you want to sit more in the mid-range below the spec of the PC I’ve tested, or you want to push your rig further with a more expensive system, you can still save.</p><div class="product"><a data-dimension112="8378d29e-0ff4-4f7a-9172-35fd60f47b46" data-action="Deal Block" data-label="Same case (but in an eye-catching white), but with an Nvidia-aimed build that packs an RTX 5070 GPU, AMD Ryzen 7 7800X3D CPU, 32GB DDR5 RAM and a 2TB SSD. This is a solid mid-range build for 1440p gaming that can flirt with 4K thanks to DLSS 4.5." data-dimension48="Same case (but in an eye-catching white), but with an Nvidia-aimed build that packs an RTX 5070 GPU, AMD Ryzen 7 7800X3D CPU, 32GB DDR5 RAM and a 2TB SSD. This is a solid mid-range build for 1440p gaming that can flirt with 4K thanks to DLSS 4.5." data-dimension25="$1849" href="https://www.ibuypower.com/store/rdy-element-9-r07" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:111.84%;"><img id="R5tehZmxWRrwFzAvEqsnCG" name="iBuyPower gaming desktop" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/R5tehZmxWRrwFzAvEqsnCG.png" mos="" align="middle" fullscreen="" width="954" height="1067" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Same case (but in an eye-catching white), but with an Nvidia-aimed build that packs an RTX 5070 GPU, AMD Ryzen 7 7800X3D CPU, 32GB DDR5 RAM and a 2TB SSD. This is a solid mid-range build for 1440p gaming that can flirt with 4K thanks to DLSS 4.5.<a class="view-deal button" href="https://www.ibuypower.com/store/rdy-element-9-r07" target="_blank" rel="nofollow" data-dimension112="8378d29e-0ff4-4f7a-9172-35fd60f47b46" data-action="Deal Block" data-label="Same case (but in an eye-catching white), but with an Nvidia-aimed build that packs an RTX 5070 GPU, AMD Ryzen 7 7800X3D CPU, 32GB DDR5 RAM and a 2TB SSD. This is a solid mid-range build for 1440p gaming that can flirt with 4K thanks to DLSS 4.5." data-dimension48="Same case (but in an eye-catching white), but with an Nvidia-aimed build that packs an RTX 5070 GPU, AMD Ryzen 7 7800X3D CPU, 32GB DDR5 RAM and a 2TB SSD. This is a solid mid-range build for 1440p gaming that can flirt with 4K thanks to DLSS 4.5." data-dimension25="$1849">View Deal</a></p></div><div class="product"><a data-dimension112="be757824-454d-4b63-94a9-4e07ccc0b69a" data-action="Deal Block" data-label="Now we’re starting to get into higher end territory. AMD Ryzen 7 9800X3D CPU, RTX 5070 Ti GPU, 32GB DDR5 RAM and a 2TB SSD. This is a very capable 4K monster in most titles, and reigns supreme at 1440p in all titles — a great card for squeezing maximum frames for competitive gaming." data-dimension48="Now we’re starting to get into higher end territory. AMD Ryzen 7 9800X3D CPU, RTX 5070 Ti GPU, 32GB DDR5 RAM and a 2TB SSD. This is a very capable 4K monster in most titles, and reigns supreme at 1440p in all titles — a great card for squeezing maximum frames for competitive gaming." data-dimension25="$2399" href="https://www.ibuypower.com/store/rdy-element-pro-r08" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1024px;"><p class="vanilla-image-block" style="padding-top:107.32%;"><img id="SohtaUjQiLhz5khzP9oDDG" name="iBuyPower gaming desktop" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/SohtaUjQiLhz5khzP9oDDG.png" mos="" align="middle" fullscreen="" width="1024" height="1099" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Now we’re starting to get into higher end territory. AMD Ryzen 7 9800X3D CPU, RTX 5070 Ti GPU, 32GB DDR5 RAM and a 2TB SSD. This is a very capable 4K monster in most titles, and reigns supreme at 1440p in all titles — a great card for squeezing maximum frames for competitive gaming.<a class="view-deal button" href="https://www.ibuypower.com/store/rdy-element-pro-r08" target="_blank" rel="nofollow" data-dimension112="be757824-454d-4b63-94a9-4e07ccc0b69a" data-action="Deal Block" data-label="Now we’re starting to get into higher end territory. AMD Ryzen 7 9800X3D CPU, RTX 5070 Ti GPU, 32GB DDR5 RAM and a 2TB SSD. This is a very capable 4K monster in most titles, and reigns supreme at 1440p in all titles — a great card for squeezing maximum frames for competitive gaming." data-dimension48="Now we’re starting to get into higher end territory. AMD Ryzen 7 9800X3D CPU, RTX 5070 Ti GPU, 32GB DDR5 RAM and a 2TB SSD. This is a very capable 4K monster in most titles, and reigns supreme at 1440p in all titles — a great card for squeezing maximum frames for competitive gaming." data-dimension25="$2399">View Deal</a></p></div><div class="product"><a data-dimension112="1740cc24-3609-4cf8-970a-f5eb256f37e9" data-action="Deal Block" data-label="And here is the top tier territory for max setting 4K gameplay. The Trace X touts the gamer-centric Intel Core i9-14900KF CPU, RTX 5080 graphics, 32GB DDR5 RAM and a 2TB SSD. This is the “no expense spared” option!" data-dimension48="And here is the top tier territory for max setting 4K gameplay. The Trace X touts the gamer-centric Intel Core i9-14900KF CPU, RTX 5080 graphics, 32GB DDR5 RAM and a 2TB SSD. This is the “no expense spared” option!" data-dimension25="$2799" href="https://www.ibuypower.com/store/rdy-trace-x-b01" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:913px;"><p class="vanilla-image-block" style="padding-top:115.55%;"><img id="L7rSj9bpDwPoVbZxeFHW8G" name="iBuyPower gaming desktop" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/L7rSj9bpDwPoVbZxeFHW8G.png" mos="" align="middle" fullscreen="" width="913" height="1055" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>And here is the top tier territory for max setting 4K gameplay. The Trace X touts the gamer-centric Intel Core i9-14900KF CPU, RTX 5080 graphics, 32GB DDR5 RAM and a 2TB SSD. This is the “no expense spared” option!<a class="view-deal button" href="https://www.ibuypower.com/store/rdy-trace-x-b01" target="_blank" rel="nofollow" data-dimension112="1740cc24-3609-4cf8-970a-f5eb256f37e9" data-action="Deal Block" data-label="And here is the top tier territory for max setting 4K gameplay. The Trace X touts the gamer-centric Intel Core i9-14900KF CPU, RTX 5080 graphics, 32GB DDR5 RAM and a 2TB SSD. This is the “no expense spared” option!" data-dimension48="And here is the top tier territory for max setting 4K gameplay. The Trace X touts the gamer-centric Intel Core i9-14900KF CPU, RTX 5080 graphics, 32GB DDR5 RAM and a 2TB SSD. This is the “no expense spared” option!" data-dimension25="$2799">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I gave my favorite pocketable mini PC an instant upgrade with this docking station — and now it’s a full-fledged gaming rig ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/i-gave-my-favorite-pocketable-mini-pc-an-instant-upgrade-with-this-docking-station-and-now-its-a-full-fledged-gaming-rig</link>
                                                                            <description>
                            <![CDATA[ The Mind Graphics 2 is a powerful yet compact GPU dock that turns Khadas’ modular mini PCs into a full-fledged gaming PC with the ports of a workstation. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">D8QwWurZg5HGEEboJBcSNk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/6SsuDBsBqXfwNkz9R5NwXE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 23 Mar 2026 05:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[PC Gaming]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                    <category><![CDATA[Gaming]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/6SsuDBsBqXfwNkz9R5NwXE-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A person playing video games on the Khadas Mind 2S with a graphics boost from the Mind Graphics 2]]></media:description>                                                            <media:text><![CDATA[A person playing video games on the Khadas Mind 2S with a graphics boost from the Mind Graphics 2]]></media:text>
                                <media:title type="plain"><![CDATA[A person playing video games on the Khadas Mind 2S with a graphics boost from the Mind Graphics 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/6SsuDBsBqXfwNkz9R5NwXE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I never thought I’d go from carrying one of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a> in my pocket to dropping it in a dock and instantly being able to play AAA games. That was until I tried Khadas’ new Mind Graphics 2.</p><p>Unlike other mini PCs, where you have to open them up to upgrade their RAM or storage, the <a href="https://www.tomsguide.com/computing/desktop-computers/khadas-mind-review">Khadas Mind</a> and now the <a href="https://www.tomsguide.com/computing/mini-pcs/khadas-mind-2s-review">Khadas Mind 2</a> can be upgraded in seconds with two unique docks. While the Mind Dock adds more ports and a handy volume knob, the Mind Graphics dock takes things to a whole new level with a desktop-grade GPU.</p><p>This isn’t your standard USB4, OCuLink, or Thunderbolt-powered <a href="https://www.tomsguide.com/gaming/pc-gaming/i-shrunk-my-gaming-setup-to-a-mini-pc-and-egpu-its-shockingly-good-and-cheaper-too">eGPU dock</a> either. Instead, it uses Khadas’ proprietary 122-pin Mind Link connector for an even faster connection. Paired with an <a href="https://www.tomsguide.com/computing/gpus/nvidia-geforce-rtx-5060-ti-review">Nvidia RTX 5060 Ti</a>, the new Mind Graphics 2 has more than enough power for the <a href="https://www.tomsguide.com/best-picks/best-PC-games">best PC games</a>, but you can also use its GPU to turbocharge creative workflows like photo or video editing.</p><p>After trying out the original Khadas Mind with the first Mind Graphics dock, here’s what it's been like using the more powerful Mind 2S with the Mind Graphics 2 for a week, and why it will be hard to go back to a standard mini PC.</p><h2 id="part-gpu-part-workstation">Part GPU, part 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8H9zgmnqfK7AxCkPZT2HaU" name="Mind Graphics 2--10" alt="The Khadas Mind Graphics 2 unboxed on a table" src="https://cdn.mos.cms.futurecdn.net/8H9zgmnqfK7AxCkPZT2HaU.jpg" mos="" align="middle" fullscreen="" width="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 7.83 x 5.24 x 4.33 inches, the Mind Graphics 2 doesn’t take up all that much space on your desk at all compared to a DIY eGPU dock. Still, though, it makes the Mind 2S at 5.75 x 4.13 x 0.79 inches look absolutely tiny in comparison. In the box, you get the Mind Graphics 2 and a power cable, besides an original Mind, Mind 2, or Mind 2S mini PC; that’s all you need to get started.</p><p>There are quite a few handy ports on the front, including a 3.5mm headphone jack, a USB-C port, and an SD card reader, along with a customizable indicator light above the Khadas logo. This is a nice change from the Mind 2S and Khadas’ other pocketable mini PCs, which only have a power button up front.</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="DqrLVmzpS2jtXir2NEBVTf" name="Mind Graphics 2--9" alt="The rear ports of the Mind Graphics 2 eGPU dock" src="https://cdn.mos.cms.futurecdn.net/DqrLVmzpS2jtXir2NEBVTf.jpg" mos="" align="middle" fullscreen="" width="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>Around the back of the Mind Graphics 2 is where things start to get interesting. You get dual HDMI 2.1b ports, a DisplayPort 2.1b, two USB-A ports, a USB-C port, and a 2.5 Gigabit Ethernet port. That USB-C port isn’t for connecting peripherals, though. Instead, you can plug one of the <a href="https://www.tomsguide.com/computing/laptops/best-laptops">best laptops</a> into it and take full advantage of the RTX 5060 Ti inside, even if you don’t have one of Khadas’ mini PCs.</p><p>The Mind Graphics 2’s CNC unibody aluminum shell doesn’t just give this eGPU dock a slick look; it also acts as a secondary heat sink. In fact, this is why you can run a desktop-grade GPU in a small 2.5-liter space without it sounding like a jet engine. However, it is on the heavier side at six pounds, but this helps keep it firmly planted on your desk even while you’re disconnecting and plugging in new cables around back.</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="i2d5MyynAtNCWdodNiNnok" name="Mind Graphics 2--8" alt="A person docking the Khadas Mind mini PC on the Mind Graphics 2 dock on a table" src="https://cdn.mos.cms.futurecdn.net/i2d5MyynAtNCWdodNiNnok.jpg" mos="" align="middle" fullscreen="" width="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>On top of the Mind Graphics 2, there’s a cutout that houses a male Mind Link connector. To start using this eGPU dock with one of Khadas’ mini PCs, you just drop the device on top, and it magnetically connects to the Mind Graphics 2. It almost feels like magic, and the first time I docked the Mind 2S, it reminded me of inserting an iPod into one of those fancy speaker docks back in the day.</p><h2 id="not-so-mini-anymore">Not so mini anymore</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iAfk2W3sm5vo4qUfUp2xH5" name="Mind Graphics 2--3" alt="A triple monitor setup powered by the Khadas Mind 2S with the Mind Graphics 2 magnetically attached underneath it" src="https://cdn.mos.cms.futurecdn.net/iAfk2W3sm5vo4qUfUp2xH5.jpg" mos="" align="middle" fullscreen="" width="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>To test out the Mind Graphics 2, I decided to swap out the Mind Dock I was using at my <a href="https://www.tomsguide.com/computing/i-went-all-in-on-logitechs-mx-master-series-for-my-new-desk-setup-and-this-accessory-was-the-real-game-changer">Logitech MX Master Series-themed desk setup</a>. Even with the extra height from this eGPU dock, I still had plenty of clearance under my <a href="https://www.tomsguide.com/opinion/i-switched-monitors-instead-of-upgrading-my-gpu-for-smoother-gameplay-heres-what-happened">main ultrawide monitor,</a> and I was also able to plug in my <a href="https://www.tomsguide.com/computing/peripherals/i-added-a-portable-monitor-next-to-my-main-display-and-this-inexpensive-upgrade-is-a-game-changer">dual portable monitors</a> on either side of it to power my less conventional triple monitor setup.</p><p>In order to get the Mind 2S, I reviewed working with the dock, and I had to update its firmware. However, once that was done, the Mind Graphics 2 and the RTX 5060 Ti inside it showed up in Device Manager in Windows 11 instantly and in the Mind app.</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:1496px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="ieb2KcGDZVcS8LqkfMF3u8" name="mind-graphics-2-with-mind-app" alt="A screenshot showing how you can configure and tweak the Mind Graphics 2 in Khadas' Mind app" src="https://cdn.mos.cms.futurecdn.net/ieb2KcGDZVcS8LqkfMF3u8.jpg" mos="" align="middle" fullscreen="" width="1496" height="842" attribution="" endorsement="" class="inline"></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 Mind app, you can see the device info, update its firmware, and change the color of the indicator light above the Khadas logo on the front. One big change that I like about this new version of Khadas’ eGPU dock compared to the original Mind Graphics is that it now comes standard with 16GB of VRAM. Previously, there was an 8GB version as well as a 16GB version.</p><p>It’s always great to have options, but with PC games becoming increasingly demanding — especially on an ultrawide monitor — I’d much rather have 16 than 8GB of VRAM.</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="ucPvSJxDx5CYRPx5zRWCPD" name="Mind Graphics 2--6" alt="An overhead shot showing how the Khadas Mind mini PC looks docked on the Mind Graphics 2" src="https://cdn.mos.cms.futurecdn.net/ucPvSJxDx5CYRPx5zRWCPD.jpg" mos="" align="middle" fullscreen="" width="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 Mind 2S looks great on top of the Mind Graphics 2, and the two make a nice pair. I also really like how my stationary peripherals are plugged into the dock itself, but I still have spare USB ports on the back of the Mind 2S as well as on the front of the dock for plugging in external drives or charging my other devices.</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="YWkWAmTPjYsbbsphQCqNsJ" name="Mind Graphics 2--5" alt="An angled shot showing the fingerprint scanner and volume buttons on the Mind Graphics 2" src="https://cdn.mos.cms.futurecdn.net/YWkWAmTPjYsbbsphQCqNsJ.jpg" mos="" align="middle" fullscreen="" width="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>Besides its desktop-grade GPU, the Mind Graphics 2 has a couple of other neat tricks up its sleeve. For instance, on the right side of the dock, there’s an integrated fingerprint scanner as well as volume buttons.</p><p>The fingerprint scanner also works as a button, and when pressed, it instantly mutes any audio coming from the Mind Graphics 2’s built-in dual 5W speaker system. Need a microphone for video calls or even your favorite AI chatbot? Well, there are also dual microphones inside the Mind Graphics 2 as well. </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="5yUx9G4Yt7HAuTxU5jMxBQ" name="Mind Graphics 2--4" alt="A person working at a triple monitor desk setup powered by the Mind 2S mini PC and Mind Graphics 2 eGPU dock" src="https://cdn.mos.cms.futurecdn.net/5yUx9G4Yt7HAuTxU5jMxBQ.jpg" mos="" align="middle" fullscreen="" width="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>Using the Mind 2S with the Mind Graphics 2 was perfect for my daily workload. I had extra ports and an SD card reader front and center where I needed them, and I really appreciate having a fingerprint scanner for quickly logging into Windows each morning. </p><p>I’ll admit that most of my work takes place in a browser these days, but I did mess around in Windows and let a few apps, including GIMP and Steam, default to using the Mind Graphics 2’s RTX 5060 Ti instead of the integrated Intel Arc 140T GPU on the Mind 2S.</p><p>Now, if I still edited video like I used to back in the day, this dock’s extra graphics power certainly would have come in handy. Instead, though, I decided to put it to the test by loading up a few of my favorite PC games.</p><h2 id="from-rendering-to-gaming">From rendering to 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JEWQ542ZzA8ecUtnz4PgZW" name="Mind Graphics 2--1-LEDE" alt="A person playing the skateboarding game Skate Style on the Mind Graphics 2 eGPU dock" src="https://cdn.mos.cms.futurecdn.net/JEWQ542ZzA8ecUtnz4PgZW.jpg" mos="" align="middle" fullscreen="" width="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 I found out when I used the Mind 2S to build a proper <a href="https://www.tomsguide.com/computing/i-thought-putting-together-a-triple-monitor-setup-would-be-hard-but-i-did-it-with-three-budget-monitors-and-a-mini-pc">triple-monitor setup on a budget</a>, its integrated graphics actually let me play some less demanding games as well as some older titles quite well. With it connected to the Mind Graphics 2, though, I could finally step up to playing the latest games with ease.</p><p>Since I grew up skateboarding every day, I’ve always had a soft spot for skate games. Normally, when testing out new mini PCs with either an integrated or a discrete GPU, I like to boot up the skateboarding sim <a href="https://www.tomsguide.com/opinion/session-is-the-perfect-stopgap-until-skate-4-if-you-can-handle-the-learning-curve">Session</a>. This time around, though, I decided to test out the Mind Graphics 2 with the upcoming game, Skate Style. It uses a similar control scheme where each of the joysticks on your controller is mapped to either foot, but as you can see in the picture above, the game has a much more polished look to it.</p><p>With the Mind Graphics 2, I was able to crank up the graphics settings as well as enable DLSS for an additional performance boost. While the game is still in early access, it ran great on this setup, even on my ultrawide display. It’s a testament to the 122-pin Mind Link connection; there was none of the 'stutter' you usually associate with external graphics solutions.</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="6SsuDBsBqXfwNkz9R5NwXE" name="Mind Graphics 2--2-LEDE" alt="A person playing video games on the Khadas Mind 2S with a graphics boost from the Mind Graphics 2" src="https://cdn.mos.cms.futurecdn.net/6SsuDBsBqXfwNkz9R5NwXE.jpg" mos="" align="middle" fullscreen="" width="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>From there, I decided to up the ante by playing a bit of <a href="https://www.tomsguide.com/reviews/ratchet-and-clank-rift-apart">Ratchet & Clank: Rift Apart</a> with all the bells and whistles enabled. Even when playing in 21:9, it ran smooth as butter at a steady 60 fps. The monitor I’m using here is more productivity-focused with just a 60Hz refresh rate. However, I do want to try out the Mind Graphics 2 with one of the <a href="https://www.tomsguide.com/us/best-gaming-monitors,review-3114.html">best gaming monitors</a> to push the framerate even further to 120Hz or even 240Hz in games that support it.</p><p>I also fought my way through the last boss in <a href="https://www.tomsguide.com/reviews/final-fantasy-vii-rebirth">Final Fantasy 7 Rebirth,</a> but since that game doesn’t have native 21:9 support, I didn’t take any photos. Likewise, I picked up the <a href="https://www.tomsguide.com/reviews/dead-space-remake">Dead Space remake</a> on sale, and that game ran great, too, in ultrawide mode.</p><p>I still need to put the Mind Graphics 2 through a bit more testing, but based on my experience so far, it’s an excellent addition to Khadas’ growing Mind ecosystem. I really like how this accessory takes one of the most unique mini PCs out there and instantly transforms it into a true gaming rig, albeit in a much smaller form factor.</p><h2 id="managed-modularity">Managed modularity</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dbLuvLVb2m2dhaAKsdB9ma" name="Mind Graphics 2--7" alt="The Mind Graphics 2 eGPU dock next to the Khadas Mind 2S mini PC on a table" src="https://cdn.mos.cms.futurecdn.net/dbLuvLVb2m2dhaAKsdB9ma.jpg" mos="" align="middle" fullscreen="" width="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>Now at $1,349, the Mind Graphics 2 certainly won’t be for everyone. You can definitely cobble together your own external GPU dock for a whole lot less, but that kind of defeats the purpose. The Mind Graphics 2 is an elegant solution to a common problem, needing a bit more graphical prowess for more demanding workloads and of course, playing the latest PC games when you do get some downtime at the end of the day.</p><p>Another reason you might consider a pre-built eGPU dock like this one is for all of the extras. In addition to all those video out ports around back, you’re also getting a few handy front ports, a fingerprint scanner, and built-in speakers and microphones. </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="bgJKkSK6W22WiMYkVAL9UJ" name="Logitech MX Master Series-6" alt="The Khadas Mind 2S on a desk with the optional Mind Dock attached underneath it" src="https://cdn.mos.cms.futurecdn.net/bgJKkSK6W22WiMYkVAL9UJ.jpg" mos="" align="middle" fullscreen="" width="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>Now, if you don’t need a GPU and want to beef up Khadas’ Mind, Mind 2, or Mind 2S, there’s always the standard Mind Dock, which also adds more ports, built-in speakers, and, as I mentioned, a tactile volume knob. Having used both, I like the low-profile design of the latter, but turning a pocketable mini PC into a gaming rig just by docking it can’t be beat.</p><p>Khadas isn’t stopping with an eGPU dock, though, as the company also recently released its Mind x Play add-on for its mini PCs. Instead of letting you play games, that accessory actually takes one of its Mind mini PCs and turns it into a laptop, complete with its own screen, keyboard, trackpad, and built-in battery. I’m planning on trying that out next, but I also want to see how the Mind Graphics 2 adds to the company’s upcoming Mind Pro mini PC.</p><p>I never thought I’d be docking and undocking a mini PC like this one, even after <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">using it on the go with a pair of AR glasses,</a> but here we are. Sure, it’s a bit niche, but if you want a mini PC you can bring to the office for work and then magnetically attach to an eGPU dock for some gaming when you get home, you won’t find anything else like the Mind and Mind Graphics 2, and trust me, I’ve looked.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eAwzrO"></div>                            </div>                            <script src="https://kwizly.com/embed/eAwzrO.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/monitors/i-spent-a-week-trying-3-different-stacked-monitor-setups-and-this-is-my-favorite">I put 3 stacked monitor setups to the test and this is the one I’m sticking with</a></li><li><a href="https://www.tomsguide.com/computing/i-added-this-usd30-accessory-to-my-desk-setup-and-it-finally-let-me-use-a-dual-monitor-setup-comfortably-for-video-calls">I added this $30 accessory to my desk setup and it finally let me use dual monitors comfortably for video calls</a></li><li><a href="https://www.tomsguide.com/home/home-office/i-tested-the-worlds-most-futuristic-office-chair-and-realized-ive-been-sitting-wrong-my-whole-life">I tested the world's most futuristic office chair and realized I’ve been sitting wrong my whole life</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested the iBuyPower RDY Element 9 Pro R07, and it’s the sweet spot pre-built for PC gaming enthusiasts ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/gaming-desktops/ibuypower-rdy-element-9-pro-r07-review</link>
                                                                            <description>
                            <![CDATA[ iBuyPower’s RDY Element 9 Pro R07 is a stellar gaming pre-built with impressive mid-to-high level performance and maintains sustainable temperatures with liquid cooling — all while looking pretty fly and coming with an impressive 3-year warranty. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">yeNZ2NNUQcu4BWmnzbPgVS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/qWENtNXiUrQSTDCnjxxdJU-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 22 Mar 2026 08:30:00 +0000</pubDate>                                                                                                                                <updated>Thu, 04 Jun 2026 12:51:30 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Desktops]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/qWENtNXiUrQSTDCnjxxdJU-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iBuyPower RDY Element 9 Pro R07]]></media:description>                                                            <media:text><![CDATA[iBuyPower RDY Element 9 Pro R07]]></media:text>
                                <media:title type="plain"><![CDATA[iBuyPower RDY Element 9 Pro R07]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/qWENtNXiUrQSTDCnjxxdJU-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>At some point towards the end of last year, it was becoming clear to anyone wanting to get into PC gaming that a prebuilt was becoming more cost effective than building from scratch. And out of all the towers I’ve tested — for not just performance but bang for your buck (if that’s even a thing anymore) — iBuyPower is ranking high with the RDY Element 9 Pro R07.</p><p>Sporting a respectably powerful spec pairing of AMD’s Ryzen 7 7800X3D CPU and <a href="https://www.tomsguide.com/computing/gpus/amd-radeon-rx-9070-xt-review">Radeon RX 9070 XT GPU</a>, alongside 32GB of DDR5 RAM, recreating this kind of setup on PC Parts Picker would set you back about $2,300-$2,400. But thanks to thinking ahead and stocking up, this team’s able to get that for $250 lower than the average builder cost.</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="brynxywMTwsDwqTUq7tNzT" name="iBuyPower RDY Element 9 Pro R07" alt="iBuyPower RDY Element 9 Pro R07" src="https://cdn.mos.cms.futurecdn.net/brynxywMTwsDwqTUq7tNzT.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>Are these costs still problematic? Yes. The <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">RAM price crisis</a> is something that will continue to hit hard (at least until the AI bubble bursts). However, in a space where we’re searching every nook and cranny for even a whiff of value in computing, it’s good to see a premium desktop tower like this with a three-year warranty and impressive cooling stamina coming in at this price in 2026.</p><p>From that striking design of the case that showcases your components almost like a neon museum to the performance potential, this is one of the <a href="https://www.tomsguide.com/us/best-gaming-pc,review-2219.html">best gaming PCs</a> you can snag right now.</p><h2 class="article-body__section" id="section-ibuypower-rdy-element-9-pro-r07-cheat-sheet"><span>iBuyPower RDY Element 9 Pro R07: Cheat Sheet</span></h2><ul><li><strong>What is it? </strong>This is a pre-built gaming PC.</li><li><strong>Who is it for? </strong>This is for the “serious but not extreme” gamers — with specs sitting firmly in the mid-to-high tier.</li><li><strong>What does it cost? </strong><a href="https://www.ibuypower.com/store/rdy-element-9-pro-r07" target="_blank" rel="nofollow">You can snag this for $2,049</a>. The site says it’s discounted from $2,349, but it’s rarely on sale at full price.</li><li><strong>What do we like? </strong>This is a stylish tower with plenty of RGB chic, which reveals the impressive cooling that is sure to keep all those high performance components running at max sustained speed across all your favorite AAA titles.</li><li><strong>What don’t we like? </strong>The keyboard and mouse, while nice to have, are rather basic, and the lighting customization is a little limited.</li></ul><h2 class="article-body__section" id="section-ibuypower-rdy-element-9-pro-r07-specs"><span>iBuyPower RDY Element 9 Pro R07: Specs</span></h2><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>iBuyPower RDY Element 9 Pro R07</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$2,049</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>AMD Ryzen 7 7800X3D</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>AMD Radeon RX 9070 XT</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>32GB DDR5 6000MHz</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>2TB PCIe Gen 4 SSD</p></td></tr><tr><td class="firstcol " ><p><strong>Ports (front)</strong></p></td><td  ><p>2x USB 3.2 Gen 1 Type-A, 1x USB 3.2 Gen 2 Type C, 1x headphone jack, 1x microphone jack<strong> </strong></p></td></tr><tr><td class="firstcol " ><p><strong>Ports (rear)</strong></p></td><td  ><p>(On motherboard) 8x USB-A, 1x USB-C, 1x Ethernet, 3.5mm audio jacks (On GPU) 3x Display Port, 1x HDMI</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>20 x 9.1 x 17.4 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>~36 pounds</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-ibuypower-rdy-element-9-pro-r07-the-ups"><span>iBuyPower RDY Element 9 Pro R07: The ups</span></h2><p>The Radeon RX 9070 XT is a personal <a href="https://www.tomsguide.com/computing/gpus/best-graphics-cards">favorite gaming GPU</a> of mine, so to get an entire pre-built around this card has been a lot of fun to daily drive! But iBuyPower’s work extends so much further than that.</p><h2 id="it-s-quite-the-looker">It’s quite the looker</h2><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="sTqwBw6J7oMjRFDKZXw6DU" name="iBuyPower RDY Element 9 Pro R07" alt="iBuyPower RDY Element 9 Pro R07" src="https://cdn.mos.cms.futurecdn.net/sTqwBw6J7oMjRFDKZXw6DU.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ve seen a lot of RGB-laden pre-builts that do a good job of showing off all those components inside your case, but this is on a different level. The two sides of glass give you a full glorious view of everything going on inside — rather than just a small window. </p><p>And the end result is an unmistakably premium aesthetic that feels much more modern compared to other simpler tower cases. Though fair warning, that glass is a fingerprint magnet!</p><p>And, since it’s a gaming PC, of course there’s plenty of RGB to inject some vibrancy into affairs here. Of course, if you’re more of a fan of subtlety, this may be very in your face — at which point you should get Asus Armoury Crate software installed to tweak some of the lighting controls. </p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/a3GQsT5CDuDWF8nXU6mnFU.jpg" alt="iBuyPower RDY Element 9 Pro R07" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/vMqoJQZnMz82D2JG3eMKFU.jpg" alt="iBuyPower RDY Element 9 Pro R07" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>But being honest, as someone who has been an RGB doubter, I’m quietly impressed and often catch myself staring at the four swirling 120mm fans illuminating the outer regions and the XPG RAM sticks pulsating. </p><p>As for the convenience of it, the side glass is completely screwless and can be removed easily, ports are conveniently placed on the front, and while it’s rather heavy at over 35 pounds, the dimensions keep it easy enough to carry. </p><h2 id="impressively-performant">Impressively performant</h2><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="8shwfrvbZjSJS765iRuG9U" name="iBuyPower RDY Element 9 Pro R07" alt="iBuyPower RDY Element 9 Pro R07" src="https://cdn.mos.cms.futurecdn.net/8shwfrvbZjSJS765iRuG9U.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Element 9 Pro sits right in that “I want a beast, but I’m not insane” bracket, and what you get at this level is stellar 1440p gaming performance that can be cranked up to 4K. I normally use my tower in a dual setup kind of layout — connected by DisplayPort to the <a href="https://www.tomsguide.com/computing/monitors/alienware-aw2725q-gaming-monitor-review">Alienware’s AW2752Q</a> monitor, and then by HDMI to my TV to get both desk and couch gaming.</p><p>Starting with the desk, this combo of CPU, GPU and RAM makes this quite a workhorse for content creation and AI-infused productivity. Not all the way (Nvidia GPUs still have a lead with the way they use cores to optimize to renders and edits), but more than enough.</p><div ><table><caption>Performance testing results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>iBuyPower RDY Element 9 Pro R07 (AMD Ryzen 7 7800 X3D / RX 9070 XT)</strong></p></td><td  ><p><strong>Alienware Aurora (Intel Core Ultra 265KF / RTX 5070)</strong></p></td><td  ><p><strong>HP Omen 35L (AMD Ryzen 7 9800 X3D / RTX 5070)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 single-core</strong></p></td><td  ><p>2697</p></td><td  ><p>3071</p></td><td  ><p>3206</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 multi-core</strong></p></td><td  ><p>14698</p></td><td  ><p>20010</p></td><td  ><p>16386</p></td></tr><tr><td class="firstcol " ><p><strong>SSD speed test (MBps)</strong></p></td><td  ><p>2132.2</p></td><td  ><p>1648.4</p></td><td  ><p>2136.4</p></td></tr><tr><td class="firstcol " ><p><strong>Handbrake transcode 4K to 1080p (mm:ss)</strong></p></td><td  ><p>3:37</p></td><td  ><p>02:01</p></td><td  ><p>03:15</p></td></tr></tbody></table></div><p>Moving over to gaming, and without any of the FSR Redstone AI trickery turned on, you’re able to get a solid 4K picture at the highest detail. Though it's worth saying AMD GPUs always struggle a bit with ray tracing compared to Nvidia.</p><div ><table><caption>Performance testing results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>iBuyPower RDY Element 9 Pro R07 (AMD Ryzen 7 7800 X3D / RX 9070 XT)</strong></p></td><td  ><p><strong>Alienware Aurora (Intel Core Ultra 265KF / RTX 5070)</strong></p></td><td  ><p><strong>HP Omen 35L (AMD Ryzen 7 9800 X3D / RTX 5070)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>3DMark Speedway</strong></p></td><td  ><p>6215</p></td><td  ><p>5741</p></td><td  ><p>5884</p></td></tr><tr><td class="firstcol " ><p><strong>Cyberounk 2077 (4K Ray Tracing Ultra)</strong></p></td><td  ><p>22.69 FPS</p></td><td  ><p>16.50 FPS</p></td><td  ><p>20.36 FPS</p></td></tr><tr><td class="firstcol " ><p><strong>Black Myth: Wukong (4K Cinematic)</strong></p></td><td  ><p>56 FPS</p></td><td  ><p>47 FPS</p></td><td  ><p>48 FPS</p></td></tr></tbody></table></div><p>With FSR features turned on, that frame rate immediately accelerates with resolution scaling. </p><p>AMD’s tech has been going from strength to strength, and while Nvidia’s DLSS maintains a healthy lead in terms of virtually eliminating any of the telltale signs like ghosting and picture smearing, FSR comes damn close. Even when blown up on a giant TV, you’d struggle to notice it without some slow-motion pixel peeping.</p><h2 id="great-warranty-protection">Great warranty protection</h2><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="D9yPs29gMSoHbgCLczrzLU" name="iBuyPower RDY Element 9 Pro R07" alt="iBuyPower RDY Element 9 Pro R07" src="https://cdn.mos.cms.futurecdn.net/D9yPs29gMSoHbgCLczrzLU.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>One of the things that can often get ignored in the initial purchase of a shiny new PC is the long-term life of it, and that’s where the warranty comes in. iBuyPower offers a rather impressive three years of labor and two years of parts protection.</p><p>The company will handle diagnostics and repair within those three years, or replace defective components within the two. Of course, you’ll be using your PC for much longer than this, which is where the lifetime technical support comes in. </p><p>Doing a test call with the company’s technical support was a rapid process through the phone line’s menu tree, and a human assistant quickly resolved my faked issue of ever so slightly unseating a RAM stick. That’s great reassurance for such a high value purchase.</p><p>Oh, and speaking of longevity, shout-out to not pre-installing the GPU. Yes, that does mean that you have to follow a guide and install it yourself (the screws to attach it to the back panel of the case can be a little awkward to get to), but it also reduces packaging and ensures that PCIe slot isn’t stressed in transport.</p><h2 class="article-body__section" id="section-ibuypower-rdy-element-9-pro-r07-the-downs"><span>iBuyPower RDY Element 9 Pro R07: The downs</span></h2><p>So far so good, but it’s not all perfect out the box for the Element 9 Pro.</p><h2 id="mid-keyboard-and-mouse">Mid keyboard and mouse</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MgUesuya74qZ62582BEyF3" name="iBuyPower RDY Element 9 Pro R07" alt="iBuyPower RDY Element 9 Pro R07" src="https://cdn.mos.cms.futurecdn.net/MgUesuya74qZ62582BEyF3.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" 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 one hand, I shouldn’t complain. The fact the Element 9 Pro comes with an included RGB gaming keyboard and optical mouse is quite the nice-to-have that other companies don’t provide.</p><p>But the faster you can upgrade to one of the best mechanical keyboards and best gaming mice, the better. The membrane switches on the keyboard feel a little mushy and slow on the depress — not great for fast-paced multiplayer. And there is definitely a cheap plasticky feel across the board and mouse.</p><h2 id="ramageddon-has-impacted-this-price">RAMageddon has impacted this 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zhFx33vKKGTtETZFor4C8U" name="iBuyPower RDY Element 9 Pro R07" alt="iBuyPower RDY Element 9 Pro R07" src="https://cdn.mos.cms.futurecdn.net/zhFx33vKKGTtETZFor4C8U.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>Viewing this in a vacuum of where we stand in 2026, this is a decent price. But we can’t ignore the fact that configurations of this level have gone up roughly $350-$400 since summer 2025. The RAM price crisis has hit pre-builts hard, and while iBuyPower is doing well to buy in bulk to get ahead of these issues, every time they have to comes with a cost penalty.</p><p>So the time on this price is surely running out before it goes up again!</p><h2 class="article-body__section" id="section-ibuypower-rdy-element-9-pro-r07-verdict"><span>iBuyPower RDY Element 9 Pro R07: Verdict</span></h2><p>But at the end of the day, this is one of the best pre-built towers I’ve ever tested. The RDY Element 9 Pro R07 packs impressive performance into a gorgeous design with impressive long-term support and even a 60-day return period too.</p><p>And the liquid-cooled gaming ensures long-term stability of the performance, while looking fly as hell too.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ MacBook Neo vs Mac mini M4: Which $599 Mac should you get? ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/macbook-neo-vs-mac-mini-m4</link>
                                                                            <description>
                            <![CDATA[ The MacBook Neo is Apple's most affordable laptop yet, but the $599 Mac mini M4 offers double the RAM and more power if you don't mind staying at your desk. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Kbuy8KkJExzUNis8oNyp7A</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/UyWgQeg22LtziE8b3TiC9j-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 22 Mar 2026 05:00:00 +0000</pubDate>                                                                                                                                <updated>Tue, 28 Apr 2026 17:18:31 +0000</updated>
                                                                                                                                            <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/UyWgQeg22LtziE8b3TiC9j-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A side by side shot showing the MacBook Neo on the left and the Mac mini M4 on the right]]></media:description>                                                            <media:text><![CDATA[A side by side shot showing the MacBook Neo on the left and the Mac mini M4 on the right]]></media:text>
                                <media:title type="plain"><![CDATA[A side by side shot showing the MacBook Neo on the left and the Mac mini M4 on the right]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/UyWgQeg22LtziE8b3TiC9j-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Whether you’re thinking about upgrading from a Chromebook or ditching Windows for good, there’s never been a better time to switch to Mac, especially with the release of the new <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a>. Starting at $599 (or $499 for education), this is Apple’s most affordable MacBook yet and a great way to get started with macOS. However, it’s not your only option at this price point.</p><p>Released back in 2024, the <a href="https://www.tomsguide.com/computing/desktop-computers/mac-mini-m4-review">Mac mini M4</a> also starts at $599 (with that same education discount available). Sure, you will need a separate monitor along with a keyboard and mouse but chances are, you probably already have a display and your existing peripherals will likely work with macOS. While the MacBook Neo is arguably the <a href="https://www.tomsguide.com/best-picks/best-budget-laptops">best budget laptop</a> you can get right now, the Mac mini M4 is one of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a> overall.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ISmvUpSEG-w" allowfullscreen></iframe></div></div><p>If you don’t plan on bringing the Neo with you and will mostly be using it at home, then the Mac mini M4 becomes a much more compelling option. Then it just comes down to whether or not you prefer to be anchored to a desk or sitting on the couch when using your computer. Although you’re paying $599 for either machine, one comes equipped with a mobile chip while the other uses a full-blow desktop chip that’s significantly more powerful.</p><p>Now that we’ve tested and reviewed the MacBook Neo, we can see how it stacks up against Apple’s smallest Mac mini yet. If you only have $599 to spend on a new Mac, read this first before you rush out and buy the Neo as the Mac mini M4 is an equally impressive machine.</p><h3 class="article-body__section" id="section-macbook-neo-vs-mac-mini-m4-specs"><span>MacBook Neo vs Mac mini M4: Specs</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>MacBook Neo</strong></p></th><th  ><p><strong>Mac mini M4</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>A18 Pro (6-core CPU, 6-core GPU)</p></td><td  ><p>M4 (10-core CPU, 10 core GPU)</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>13-inch Liquid Retina (2408 x 1506)</p></td><td  ><p>None (supports up to three displays)</p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>8GB Unified Memory</p></td><td  ><p>16GB Unified Memory</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB / 512GB SSD</p></td><td  ><p>256 to 2TB SSD</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>2 x USB-C (1x USB 2.0), 1 x 3.5mm headphone jack</p></td><td  ><p>3 x Thunderbolt 4, 2 x USB-C, 1 x HDMI, 1 x Ethernet</p></td></tr><tr><td class="firstcol " ><p><strong>Battery Life</strong></p></td><td  ><p>Up to 16 hours</p></td><td  ><p>N/A</p></td></tr><tr><td class="firstcol " ><p><strong>Camera</strong></p></td><td  ><p>1080p FaceTime HD</p></td><td  ><p>N/A</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>2.7 pounds</p></td><td  ><p>1.5 pounds</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>11.71 x 8.12 x 0.50 inches</p></td><td  ><p>5 x 5 x 2 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 6E, Bluetooth 6.0</p></td><td  ><p>Wi-Fi 6E, Bluetooth 5.3, Gigabit Ethernet (upgradeable to 10 Gigabit)</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-macbook-neo-vs-mac-mini-m4-design"><span>MacBook Neo vs Mac mini M4: Design</span></h3><p>The design of these two Macs couldn’t be more different. While the MacBook Neo is a 13-inch laptop, the Mac mini M4 is a compact mini PC that Apple redesigned in 2024 to be its smallest Mac ever.</p><p>Despite being the most affordable MacBook yet, the Neo borrows quite a lot from the aesthetic of the <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-m5-review">MacBook Air</a>. It sports a fanless design, an ultra-thin chassis made from aluminum and comes with rounded corners for a more modern look. </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="B46r9xiPXUQxjPcQfuZuRB" name="dji_mimo_20260304_112012_20260304082012_1772642705988_photo" alt="Apple MacBook Neo" src="https://cdn.mos.cms.futurecdn.net/B46r9xiPXUQxjPcQfuZuRB.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>In addition to Silver, the Neo is also available in three vibrant shades: Blush (pink), Indigo (deep blue), and Citrus (yellow). Meanwhile, like other desktop Macs, the Mac mini M4 only comes in Silver.</p><p>At 2.7 pounds, the Neo is very light and extremely portable which makes it easy to slip into a backpack. On the other hand, the Mac mini M4 is technically lighter at just 1.5 pounds. However, since you’ll need a monitor along with a keyboard and mouse, it’s not nearly as easy to bring with you.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="233b5N8SkX2J3Nm2HCDymU" name="MacBook Neo A18 review-5" alt="MacBook Neo shown on desk" src="https://cdn.mos.cms.futurecdn.net/233b5N8SkX2J3Nm2HCDymU.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: Tom's Guide)</span></figcaption></figure><p>On the MacBook Neo, you get two USB-C ports and a headphone jack on the left side of the laptop with no ports on the right side 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="pjuxB5Utc7o6mUUauQTKSU" name="Mac mini M4-10" alt="The front ports of the Mac mini M4" src="https://cdn.mos.cms.futurecdn.net/pjuxB5Utc7o6mUUauQTKSU.jpg" mos="" align="middle" fullscreen="" width="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>Unlike with the previous model, Apple decided to add ports to the front of the Mac mini M4 and just like on the Neo, there are two USB-C ports as well as a headphone jack. Around back though, the Mac mini M4 comes equipped with three <a href="https://www.tomsguide.com/features/thunderbolt-4-vs-usb4-whats-the-difference">Thunderbolt 4</a> ports, an HDMI port, a gigabit Ethernet port and a power port.</p><p>When it comes to power, the Mac mini M4 can only be powered using the AC port at the back and the included power cable. The Neo comes with a compact 20W charger and is capped at a slower charging speed so you can’t use a higher-wattage one to quickly charge 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:3550px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Kqx2uQ42mmaaLu8okRaPqU" name="MacBook Neo A18 review-10" alt="MacBook Neo shown on desk" src="https://cdn.mos.cms.futurecdn.net/Kqx2uQ42mmaaLu8okRaPqU.jpg" mos="" align="middle" fullscreen="" width="3550" height="1997" attribution="" endorsement="" class="inline"></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 use either of the Neo’s USB-C ports for charging. However, the front one is the better option for charging as it’s a slower USB 2.0 port while the one at the rear is USB 3 and can be used to connect to an external display or for an external SSD.</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:3194px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="225s5zp9wA6US6jA3sNKXU" name="MacBook Neo A18 review-3" alt="MacBook Neo shown on desk" src="https://cdn.mos.cms.futurecdn.net/225s5zp9wA6US6jA3sNKXU.jpg" mos="" align="middle" fullscreen="" width="3194" height="1797" attribution="" endorsement="" class="inline"></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 keyboard on the Neo feels great to type on with 1mm of travel but it isn’t backlit. On the base model, you also don’t get Touch ID like on more expensive MacBooks. </p><p>If you want to use your fingerprint to login or for authentication instead of entering your password, then you’re going to need to spend an extra $100 on a Neo with this functionality and extra storage. Likewise, the Neo has a mechanical trackpad instead of a Force Touch one like on the MacBook Air.</p><h3 class="article-body__section" id="section-macbook-neo-vs-mac-mini-m4-performance"><span>MacBook Neo vs Mac mini M4: Performance</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>MacBook Neo</strong></p></th><th  ><p><strong>Mac mini M4</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Geekbench (single/multi-core)</strong></p></td><td  ><p>3535/8920</p></td><td  ><p>3838/14838</p></td></tr><tr><td class="firstcol " ><p><strong>Handbrake (min:secs)</strong></p></td><td  ><p>9:57</p></td><td  ><p>4:42</p></td></tr></tbody></table></div><p>Performance varies greatly between the MacBook Neo and the Mac mini M4, as they’re powered by entirely different classes of silicon. While the Mac mini uses the desktop-grade M4 chip, Apple brought the Neo’s price down to $599 by using the A18 Pro — the same mobile processor that powered the <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-16-pro-review">iPhone 16 Pro</a> back in 2024.</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/KPRNKbFasz8" allowfullscreen></iframe></div></div><p>In our lab tests, both chips showed comparable single-core performance. This means for 'burst' tasks like opening apps or loading a heavy webpage, both Macs will feel equally snappy. However, the Mac mini M4 pulls ahead in multi-core workloads, making it the superior choice for video editing or heavy multitasking.</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="9WewLFGGuEX6mfwAKBrohk" name="MacBook Neo" alt="MacBook Neo open on a desk" src="https://cdn.mos.cms.futurecdn.net/9WewLFGGuEX6mfwAKBrohk.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The biggest performance divider isn't just the chip, but the memory. The $599 Mac mini M4 ships with 16GB of RAM as standard, whereas the Neo is stuck with 8GB and there’s no way to upgrade. In our real-world stress test, the Neo began to struggle <a href="https://www.tomsguide.com/computing/macbooks/macbook-neo-chrome-tab-test-how-many-tabs-can-8gb-ram-actually-handle">once we hit 20 open browser tabs</a>, leading to sluggishness and tab reloads. The Mac mini, with double the memory, handled twice that load without breaking a sweat.</p><p>Thermals also play a big role when it comes to performance. The Neo’s fanless design makes it completely silent, but it will eventually throttle or slow down during long 4K video exports or heavy gaming sessions to stay cool. The Mac mini M4 features an internal fan that, while near-silent, allows it to maintain peak performance indefinitely.</p><h3 class="article-body__section" id="section-macbook-neo-vs-mac-mini-m4-display"><span>MacBook Neo vs Mac mini M4: Display</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zPiRYfMmizQra7ZyByNLtY" name="MacBook Neo Indigo-5" alt="MacBook Neo on a desk" src="https://cdn.mos.cms.futurecdn.net/zPiRYfMmizQra7ZyByNLtY.jpg" mos="" align="middle" fullscreen="" width="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 MacBook Neo has a 13-inch LED-backlit panel with a 2408 x 1506 resolution at 219 pixels per inch (ppi). As such, it meets Apple’s “Retina” standard and it’s also quite bright at 500 nits. Still, even with this extra brightness, you’re better off using it indoors since it has a glossy finish and you can’t upgrade to Apple’s Nano-Texture glass option like you can with more expensive MacBooks.</p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Brightness (nits)</p></th><th  ><p>Color reproduction (sRGB/DCI-P3)</p></th><th  ><p>Accuracy (Delta-E)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>MacBook Neo</strong></p></td><td  ><p>480 (HDR)</p></td><td  ><p>110%/ 78.6%</p></td><td  ><p>0.22</p></td></tr><tr><td class="firstcol " ><p><strong>Surface Laptop</strong></p></td><td  ><p>322</p></td><td  ><p>95.1% / 67.3%</p></td><td  ><p>0.25</p></td></tr><tr><td class="firstcol " ><p><strong>MacBook Air M5</strong></p></td><td  ><p>474 (HDR)</p></td><td  ><p>117.3% / 83.1%</p></td><td  ><p>0.21</p></td></tr></tbody></table></div><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3836px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="yR9QgkuBLKNQSE3axkhXqU" name="MacBook Neo A18 review-11" alt="MacBook Neo shown on desk" src="https://cdn.mos.cms.futurecdn.net/yR9QgkuBLKNQSE3axkhXqU.jpg" mos="" align="middle" fullscreen="" width="3836" height="2158" attribution="" endorsement="" class="inline"></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 only one high-speed USB-C port, you’re limited to connecting the Neo to a single external display. Likewise, you’re also stuck at 60Hz which means you won’t be able to take full advantage of high refresh rate monitors that go up to 120Hz — like Apple’s new <a href="https://www.tomsguide.com/computing/monitors/apple-studio-display-xdr-review">Studio Display XDR</a> — or even higher.</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="PcZt6XgJ2YPtQmgMvT3whe" name="Mac mini M4-03" alt="A triple monitor setup powered by the Mac mini M4" src="https://cdn.mos.cms.futurecdn.net/PcZt6XgJ2YPtQmgMvT3whe.jpg" mos="" align="middle" fullscreen="" width="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 don’t get a display with the Mac mini but thanks to the power of the M4 chip driving it, you can connect up to three external displays at the same time. When it comes to their resolution, you can run two displays at 6K at 60Hz and a third at 5K at 60Hz over Thunderbolt 4. There’s also an HDMI port around back that can output at 4K at 60Hz. Likewise, if you only want to run a single monitor, the Mac mini M4 can actually drive an 8K display at 60Hz or a 4K display at 240Hz.</p><p>Using the Neo with a single, large external display will likely be enough for most people. However, if you want to run a dual or even a triple-monitor setup for maximum productivity, then the Mac mini M4 is the better option.</p><h3 class="article-body__section" id="section-macbook-neo-vs-mac-mini-m4-graphics"><span>MacBook Neo vs Mac mini M4: Graphics</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:3793px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="riebsVzhWhheaB5sjGhBza" name="MacBook Neo gaming LIST-1" alt="MacBook Neo on a desk" src="https://cdn.mos.cms.futurecdn.net/riebsVzhWhheaB5sjGhBza.jpg" mos="" align="middle" fullscreen="" width="3793" height="2134" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Both the MacBook Neo and the Mac mini M4 are surprisingly capable gaming machines for $599, thanks to their support for hardware-accelerated ray tracing and mesh shading. However, while the Neo often relies on <a href="https://www.tomsguide.com/computing/macbooks/a-youtuber-tested-10-games-on-the-macbook-neo-and-the-results-are-surprising">MetalFX</a> upscaling to hit playable framerates, the Mac mini M4 has the raw horsepower to push higher settings natively.</p><div ><table><caption>MacBook Neo Gaming Benchmarks</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Resolution</strong></p></th><th  ><p><strong>Settings</strong></p></th><th  ><p><strong>FPS (Avg)</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Hollow Knight: Silksong</strong></p></td><td  ><p>2816 x 1762</p></td><td  ><p>Native / High</p></td><td  ><p>60 (Locked)</p></td></tr><tr><td class="firstcol " ><p><strong>Sneaky Sasquatch</strong></p></td><td  ><p>2816 x 1762</p></td><td  ><p>Native / Arcade</p></td><td  ><p>60 (Locked)</p></td></tr><tr><td class="firstcol " ><p><strong>Resident Evil 4 Remake</strong></p></td><td  ><p>1080p</p></td><td  ><p>Low / MetalFX</p></td><td  ><p>40–45</p></td></tr><tr><td class="firstcol " ><p><strong>Oceanhorn 3</strong></p></td><td  ><p>1408 x 881</p></td><td  ><p>Default</p></td><td  ><p>45–60</p></td></tr><tr><td class="firstcol " ><p><strong>Cyberpunk 2077</strong></p></td><td  ><p>720p</p></td><td  ><p>Low / MetalFX</p></td><td  ><p>30–45</p></td></tr></tbody></table></div><p>Since the Neo uses the A18 Pro, it handles AAA titles that have been ported to iOS remarkably well. In our testing, <a href="https://www.tomsguide.com/reviews/resident-evil-4">Resident Evil 4</a> and the long-awaited <a href="https://www.tomsguide.com/gaming/i-bought-silksong-just-because-of-the-hype-heres-my-impressions-after-the-opening-hours">Hollow Knight: Silksong</a> played surprisingly well on the Neo's 13-inch screen. You can also tap into the entire Apple Arcade library, including the newly released Oceanhorn 3: Legend of the Shadow Sea, which looks beautiful on the Neo's glossy Retina display.</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/CPokHk09I5s" allowfullscreen></iframe></div></div><p>However, Cyberpunk 2077 pushed this budget MacBook to its absolute limits. Since the Neo is fanless, it began to thermally throttle after about 20 minutes of gameplay, causing the framerate to dip into the low 20s. The 8GB of RAM also led to occasional stutters in open-world sections.</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="2UjXeoVBQodZJYw5QJmRvj" name="Mac mini M4-01" alt="Playing Bioshock Remastered on the Mac mini M4 with a trackball mouse and keyboard" src="https://cdn.mos.cms.futurecdn.net/2UjXeoVBQodZJYw5QJmRvj.jpg" mos="" align="middle" fullscreen="" width="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 Mac mini M4 is a much better option for extended play sessions. With 10 GPU cores and 16GB of RAM as standard, it didn’t slow down at all during our hour-long Cyberpunk stress test. Its internal fan kept the temperature stable, allowing the M4 to maintain its clock speeds indefinitely. If you’re a casual gamer who wants to play indie hits or mobile ports on the go, the Neo is a delight. However, if you want a machine that can actually act as a budget gaming PC at your desk, the Mac mini M4 is the clear winner.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eEDMAX"></div>                            </div>                            <script src="https://kwizly.com/embed/eEDMAX.js" async></script><h3 class="article-body__section" id="section-macbook-neo-vs-mac-mini-m4-outlook"><span>MacBook Neo vs Mac mini M4: Outlook</span></h3><p>Switching to Mac has never been easier with two excellent options for the same $599 price. However, choosing between the two isn’t necessarily about which one is better, but rather where you plan on working.</p><p>The MacBook Neo is the most affordable MacBook yet and as such, it’s the perfect laptop for students, writers and travelers that need a machine they can go from a backpack to open on a table in seconds. You are giving up raw power for portability but in return, you’re getting a beautifully designed laptop with a 13-inch retina display that blows most <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">budget Windows laptops</a> and especially <a href="https://www.tomsguide.com/best-picks/best-chromebooks">Chromebooks</a> out of the water.</p><p>Now if you want a desktop workstation on a budget and already have a monitor and the necessary peripherals, then the Mac mini M4 is a more powerful though stationary computer. With double the RAM and a desktop-class chip, it’s ideal for multitasking and more demanding workloads. Plus, thanks to its internal fan, it won’t throttle under pressure.</p><p>Ultimately, the choice between the newer MacBook Neo or the slightly older Mac mini M4 comes down to whether you value portability or power more. If you need a computer you can bring with you or even move from room to room easily, then the Neo is the better choice. However, if you don’t mind working at a desk and paying a bit more for a monitor and peripherals (if you don’t have them already), then the Mac mini M4 is still an excellent option.</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/i-ditched-the-macbook-air-for-a-macbook-neo-for-48-hours-and-i-was-shocked">I ditched the MacBook Air for a MacBook Neo for 48 hours — and I'm shocked</a></li><li><a href="https://www.tomsguide.com/computing/mini-pcs/i-hated-the-mac-mini-m4s-power-button-until-i-accidentally-proved-apple-was-right">I hated the Mac mini M4’s power button until I accidentally proved Apple was right</a></li><li><a href="https://www.tomsguide.com/computing/macbooks/i-played-5-games-on-the-macbook-neo-heres-my-report-card">I played 5 games on the MacBook Neo — here's my report card</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple just discontinued 15 products including one that's only six months old ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/apple-just-discontinued-15-products-including-one-thats-only-six-months-old</link>
                                                                            <description>
                            <![CDATA[ Apple just discontinued 15 devices including MacBooks, iPads and an iPhone. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">NpqTgktpC7jEPQzpadfQPd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/woiZeAU4Z8uQiyybthk226-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 09 Mar 2026 17:25:14 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[iPads]]></category>
                                                    <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Tablets]]></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.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/woiZeAU4Z8uQiyybthk226-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone 16e review.]]></media:description>                                                            <media:text><![CDATA[iPhone 16e review.]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone 16e review.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/woiZeAU4Z8uQiyybthk226-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Whenever Apple announces new devices it means that some older ones get discontinued. Last week, Apple revealed a slew of new products including the intriguing <a href="https://www.tomsguide.com/computing/macbooks/i-just-went-hands-on-with-the-usd599-macbook-neo-its-game-over-for-chromebooks-and-cheap-windows-laptops">MacBook Neo</a>, budget-friendly <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17e-review">iPhone 17e</a> and more powerful <a href="https://www.tomsguide.com/computing/macbooks/im-using-pizza-to-explain-apples-m5-pro-and-m5-max-and-now-im-convinced-laptops-are-about-to-change">MacBook Pro M5 Pro/Max</a> laptops.</p><p>As part of streamlining the devices it sells, the company <a href="https://www.macrumors.com/2026/03/06/apple-discontinued-these-15-products-this-week/" target="_blank">discontinued 15 existing devices</a>. Surprisingly, not every device is years old. The oldest was released in 2019, while the most recent only debuted six months ago.</p><p>Here's the list of 15 discontinued products:</p><ul><li><a href="https://www.tomsguide.com/phones/iphones/apple-iphone-16e-review">iPhone 16e</a> with A18 (2025)</li><li><a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review">11-inch iPad Air with M3</a> (2025)</li><li>13-inch iPad Air with M3 (2025)</li><li><a href="https://www.tomsguide.com/computing/laptops/macbook-air-m4-review">13-inch MacBook Air with M4 </a>(2025)</li><li>15-inch MacBook Air with M4 (2025)</li><li>13-inch MacBook Pro with M5 and 512GB storage (2025)</li><li>14-inch MacBook Pro with M4 Pro (2024)</li><li>16-inch MacBook Pro with M4 Pro (2024)</li><li>14-inch MacBook Pro with M4 Max (2024)</li><li>16-inch MacBook Pro with M4 Max (2024)</li><li>Mac Studio with M3 Ultra and 512GB memory (2025)</li><li>Studio Display with A13 Bionic (2022)</li><li>Pro Display XDR (2019)</li><li>Pro Stand for Pro Display XDR (2019)</li><li>Pro Display XDR VESA Mount Adapter (2019)</li></ul><p>For the most part, the Apple is just swapping one product for its updated version. The iPhone 16e gets the boot for the 17e. The M3 iPad Air has been replaced by the <a href="https://www.tomsguide.com/computing/ipads/apple-ipad-air-m4-review-small-tweaks-to-the-gold-standard">M4 version</a>,  the same for the M4 MacBook Air models which have been replaced with <a href="https://www.tomsguide.com/computing/macbooks/macbook-air-m5-review">M5 MacBook Airs.</a></p><p>The surprising discontinuation is the 512GB MacBook Pro M5, which was announced  in October 2025 for $1,599. Instead, the new base model features 1TB of internal storage, and costs $1,699.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W5lBBe"></div>                            </div>                            <script src="https://kwizly.com/embed/W5lBBe.js" async></script><p>It's unclear if this related to the ongoing <a href="https://www.tomsguide.com/computing/ram-price-crisis-2026-everything-you-need-to-know">memory crisis </a>that is reducing storage and RAM options for many companies.</p><p>Finally, we have the two oldest devices: the original Studio Display from 2022 and the Pro Display XDR (released in 2019), which were replaced by the <a href="https://www.tomsguide.com/computing/monitors/apple-reveals-new-studio-display-xdr-with-120hz-refresh-rate-and-2-000-nits-of-brightness-starting-at-usd3-299">new Studio Display XDR</a> and an updated base version.</p><h2 id="what-does-discontinued-mean-for-your-devices">What does discontinued mean for your devices?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3193px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UbMJMVGeKd2UvjMvkZZPX6" name="MacBook Air M4 2025-LIST1" alt="MacBook Air 13-inch M4 shown on tabletop" src="https://cdn.mos.cms.futurecdn.net/UbMJMVGeKd2UvjMvkZZPX6.jpg" mos="" align="middle" fullscreen="" width="3193" height="1796" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Unlike Apple's vintage or obsolete devices, discontinuation just means the company no longer sells these products through official channels. However, they are still eligible for software updates, repairs and support for at least five to seven years after their initial release date. </p><p>Apple typically places devices on its vintage list around five years after the company stops selling them. At that point, they're unlikely to get software updates, and repairs will only be available as long as parts are available. So if you own any of these discontinued products, you still have some time before you need to consider an upgrade.</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/i-love-my-macbook-air-but-anyone-buying-the-m5-should-absolutely-add-one-one-of-these-must-have-accessories-to-their-shopping-basket">I love my MacBook Air, but anyone buying the M5 should absolutely add one of these must-have accessories to their shopping basket</a></li><li><a href="https://www.tomsguide.com/news/live/apple-march-event-2026-live">Apple March event — MacBook Neo reactions, iPhone 17e and all the new products</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apple-buried-these-3-genuinely-useful-iphone-features-heres-how-to-find-them">Apple buried these 3 genuinely useful iPhone features — here's how to find them</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Forget the Mac mini M4: If I could only have one mini PC, this pocketable powerhouse is the one I’d get ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/khadas-mind-2s-review</link>
                                                                            <description>
                            <![CDATA[ The Khadas Mind 2S is a pocket-sized mini PC that performs like a workstation that’s even better when you snap it onto one of Khadas’ docks. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">AsticXhp84TjEizvjenpVR</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Y6gtfgiH2q84mHbPML27gH-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 15 Feb 2026 07:30:00 +0000</pubDate>                                                                                                                                <updated>Thu, 04 Jun 2026 12:51:30 +0000</updated>
                                                                                                                                            <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Y6gtfgiH2q84mHbPML27gH-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Khadas Mind 2S upright on a desk]]></media:description>                                                            <media:text><![CDATA[The Khadas Mind 2S upright on a desk]]></media:text>
                                <media:title type="plain"><![CDATA[The Khadas Mind 2S upright on a desk]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Y6gtfgiH2q84mHbPML27gH-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Khadas Mind 2S is unlike any mini PC I’ve tested yet. Despite its smaller, pocketable size, it features full-sized ports around back and enough power under the hood that it felt more like a workstation than a mini PC when plugged in at my desk.</p><p>After reviewing the original <a href="https://www.tomsguide.com/computing/desktop-computers/khadas-mind-review">Khadas Mind</a>, I was eager to get my hands on this new, upgraded model. While it now features an upgraded Intel Core Ultra 7 255H processor, 64GB of LPDDR5X RAM and comes with a 2TB SSD, Khadas still managed to make it fit inside the same-sized case.</p><p>Although it is on the expensive side at $1,599, there aren’t any optional upgrades to worry about as those are the specs you get with the only configuration of the Mind 2S. Then, if that’s a bit out of your price range or more power than you can handle, you could always pick up the significantly cheaper Mind 2 which starts at $799. Either way, you’re still getting the same sleek design and excellent port selection. If you need more ports or even more power, you can always expand its capabilities with one of Khadas’ optional Mind docks.</p><p>I’ve used this PC at home, while traveling and even with AR glasses for the past 10 months and in my opinion, it’s easily one of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a> you can get today. Read on though to see if this pocketable powerhouse is for you or if you’d be better off with something less portable and more stationary.</p><h3 class="article-body__section" id="section-khadas-mind-2s-cheat-sheet"><span>Khadas Mind 2S: Cheat Sheet</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cgxmSTCyyQypDSqphrJnAE" name="Khadas Mind 2S--9" alt="The Khadas Mind 2S unboxed on a desk with its power adapter and braided USB-C cable" src="https://cdn.mos.cms.futurecdn.net/cgxmSTCyyQypDSqphrJnAE.jpg" mos="" align="middle" fullscreen="" width="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><ul><li><strong>What is it?</strong> A powerful yet pocketable mini PC that feels more like a workstation than your typical device in this category.</li><li><strong>Who is it for?</strong> Those who want workstation-class power in a small, quiet package with the option to add more ports or even dedicated graphics via the Khadas ecosystem.</li><li><strong>What does it cost?</strong> The Khadas Mind 2S <a href="https://www.amazon.com/Khadas-Mind-Mini-Battery%EF%BD%9COnly-435g%EF%BD%9CThunderbolt/dp/B0DWJSPPXF?th=1" target="_blank" rel="nofollow">costs $1,599</a>, but the standard Khadas Mind 2 <a href="https://www.amazon.com/Khadas-Mind-Mini-Battery%EF%BD%9COnly-435g%EF%BD%9CThunderbolt/dp/B0DHCHV32P?th=1" target="_blank" rel="nofollow">starts at $799</a> and comes in three configurations.</li><li><strong>What do we like?</strong> Its sleek unibody-style aluminum enclosure, the slim "carry-anywhere" design, the versatile port selection, the easy-access SSD slot on the bottom, and the expansive modular dock ecosystem.</li><li><strong>What don’t we like?</strong> The significant price jump between the Mind 2 and Mind 2S and that it can get slightly noisy under heavy load.</li></ul><h3 class="article-body__section" id="section-khadas-mind-2s-specs"><span>Khadas Mind 2S: Specs</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Khadas Mind 2</p></th><th  ><p>Khadas 2S (as tested)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.khadas.com/product-page/mind-2" target="_blank" rel="nofollow">Starts at $799</a></p></td><td  ><p><a href="https://www.khadas.com/product-page/mind-2" target="_blank" rel="nofollow">$1,599</a></p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Intel Core Ultra 5 125H, Intel Core Ultra 7 155H</p></td><td  ><p>Intel Core Ultra 7 255H</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Intel Arc </p></td><td  ><p>Intel Arc 140T GPU</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>16GB LPDDR5, 32GB LPDDR5, 64GB LPDDR5X</p></td><td  ><p>64GB LPDDR5X</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>512GB SSD, 1TB SSD, 2TB SSD</p></td><td  ><p>2TB SSD</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1 x Thunderbolt 4, 1 x USB4, 1 x HDMI 2.1, 2 x USB-A</p></td><td  ><p>1 x Thunderbolt 4, 1 x USB4, 1 x HDMI 2.1, 2 x USB-A</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 6E, Bluetooth 5.3</p></td><td  ><p>Wi-Fi 6E, Bluetooth 5.3</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>Built-in 5.55Wh battery (25-hour standby time)</p></td><td  ><p>Built-in 5.55Wh battery (25-hour standby time)</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>5.75 × 4.13 × 0.79 inches</p></td><td  ><p>5.75 × 4.13 × 0.79 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>0.96 pounds (435 grams)</p></td><td  ><p>0.96 pounds (435 grams)</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-khadas-mind-2s-the-ups"><span> Khadas Mind 2S: The Ups</span></h3><p>The Mind 2S retains everything that made the original a standout — its ultra-compact, premium build — but adds a significant spec bump that pushes it into true workstation territory. While the design is still a win, it’s the massive jump in internal power that truly makes this new model shine.</p><h2 id="sleek-premium-and-pocketable">Sleek, premium and pocketable</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="otCGesfMM6YhNFzjL7W4ZA" name="Khadas Mind 2S--5" alt="The Khadas Mind 2S on a desk" src="https://cdn.mos.cms.futurecdn.net/otCGesfMM6YhNFzjL7W4ZA.jpg" mos="" align="middle" fullscreen="" width="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 5.75 x 4.13 x 0.79 inches, the Mind 2S is the exact same size as the original Mind mini PC. Despite using the same case, Khadas has made some changes to the device’s internals. </p><p>For instance, while the original Mind had a solid cooling setup, this new model features a pure copper vapor chamber liquid cooling system. Likewise, the PCIe connector on the bottom of the Mind 2S has been upgraded to PCIe 5.0 which doubles its bandwidth to 256GT/S but more on that later.</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="978eWQJZGdwRai7uXhQ3Q8" name="Khadas Mind 2S--6" alt="The rear ports of the Khadas Mind 2S" src="https://cdn.mos.cms.futurecdn.net/978eWQJZGdwRai7uXhQ3Q8.jpg" mos="" align="middle" fullscreen="" width="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>Around back, the port selection appears identical to the original Mind at first glance. However, Khadas has upgraded the ports on the Mind 2S and you now get two high-speed USB-A ports, an HDMI 2.1 port, a <a href="https://www.tomsguide.com/features/thunderbolt-4-vs-usb4-whats-the-difference">USB 4</a> port and a <a href="https://www.tomsguide.com/computing/thunderbolt-5-vs-thunderbolt-4">Thunderbolt 4</a> port. Given the Mind 2S’ tiny size, this is quite the selection of ports.</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="qVmUFc6ZJmJSsd7tozf8UC" name="Khadas Mind x Xreal One-2" alt="A person using Xreal One AR glasses with the Khadas Mind 2S mini PC at a coffee shop" src="https://cdn.mos.cms.futurecdn.net/qVmUFc6ZJmJSsd7tozf8UC.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>For instance, when I ditched my laptop for the <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">Mind 2S with a pair of Xreal One AR glasses</a>, I was able to power the device using a large portable powerbank, connect the glasses via the other USB-C port and use one of the USB-A ports for my low-profile mechanical keyboard’s 2.4 GHz dongle. All with one port to spare since I used a smaller trackball mouse that connected via Bluetooth with that setup.</p><p>The Mind 2S is a very versatile mini PC but it’s the upgraded chipset and all of the extra RAM Khadas added this time around that makes a difference.</p><h2 id="now-with-more-power">Now with more power</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3uzWXFnCtpj5dL9tdz5Gh" name="Logitech MX Master Series-2" alt="A triple monitor setup powered by the Khadas Mind 2S outfitted entirely with peripherals from Logitech's MX Master Series" src="https://cdn.mos.cms.futurecdn.net/3uzWXFnCtpj5dL9tdz5Gh.jpg" mos="" align="middle" fullscreen="" width="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 Khadas Mind was no slouch in terms of power, but the Mind 2S takes things to a whole new level. Unlike the standard Mind 2, which uses Intel’s Series 1 <a href="https://www.tomsguide.com/news/live/intel-meteor-lake-live-blog-all-the-big-intel-core-ultra-news-as-it-happens">Meteor Lake</a> chips, the Mind 2S is equipped with a Core Ultra 7 255H chip from Intel’s Series 2 Arrow Lake-H family. Not to be confused with the hyper-efficient <a href="https://www.tomsguide.com/computing/laptops/intel-lunar-lake-benchmarks-heres-how-it-compares-to-snapdragon-x-and-apple-m3">Lunar Lake</a> chips found in many of today’s ultra-thin laptops, Arrow Lake-H is all about raw performance and heavy multi-tasking.</p><p>The reason Khadas went with Arrow Lake over Lunar Lake is clear: the company has always positioned the Mind 2S as a workstation in a mini PC’s body. With 16 cores and 16 threads, the Ultra 7 255H offers double the core count of a typical Lunar Lake chip. This architectural choice is also what allowed Khadas to outfit the Mind 2S with a massive 64GB of RAM, whereas Lunar Lake is physically capped at 32GB. Power draw is another big factor; the Mind 2S can pull up to 115W under load, providing the kind of sustained performance you’d normally expect from a much larger desktop.</p><div ><table><caption>Performance Benchmarks</caption><thead><tr><th class="firstcol empty" ></th><th  ><p>Khadas Mind 2S</p></th><th  ><p>Mac mini M4</p></th><th  ><p>Geekom A9 Max</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Geekbench 6.5 single-core</strong></p></td><td  ><p>2890</p></td><td  ><p>3838</p></td><td  ><p>2976</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6.5 multi-core</strong></p></td><td  ><p>14532</p></td><td  ><p>14838</p></td><td  ><p>15140</p></td></tr><tr><td class="firstcol " ><p><strong>25GB file copy test (MBps)</strong></p></td><td  ><p>2501.33</p></td><td  ><p>3017.3</p></td><td  ><p>1749.79</p></td></tr><tr><td class="firstcol " ><p><strong>Handbrake (Mins:Secs)</strong></p></td><td  ><p>4:33</p></td><td  ><p>4:42</p></td><td  ><p>3:24</p></td></tr></tbody></table></div><p>As you can see in the table above, the Mind 2S performed great across the board. It kept pace with the much larger <a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/geekom-a9-max-review">Geekom A9 Max</a> in both single and multi-core tests and even managed to beat out the <a href="https://www.tomsguide.com/computing/desktop-computers/mac-mini-m4-review">Mac mini M4</a> by nine seconds in our video encoding test using Handbrake. Given that the Mind 2S has a significantly smaller footprint than its rivals, I’m quite impressed by how well it fared in our testing lab.</p><p>In addition to more cores and threads, the chipset Khadas picked for the Mind 2S has another trick up its sleeve for when you’re not using it purely as a workstation.</p><h2 id="not-just-for-work">Not just 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="E4uvLvpuayAheocnAPkQiL" name="Triple Monitor Setup-01-LEDE" alt="A triple monitor setup on a wooden desk" src="https://cdn.mos.cms.futurecdn.net/E4uvLvpuayAheocnAPkQiL.jpg" mos="" align="middle" fullscreen="" width="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>Ever since Khadas first sent over the Mind 2S, I’ve been using it both on the go with AR glasses and at home. Thanks to its unique form factor and the fact that it’s powered using a standard USB-C power adapter, this mini PC has found its way into quite a few of my desk setups—including my first <a href="https://www.tomsguide.com/computing/i-thought-putting-together-a-triple-monitor-setup-would-be-hard-but-i-did-it-with-three-budget-monitors-and-a-mini-pc">triple-monitor one</a> I put together last spring.</p><p>The Mind 2S has easily been able to handle my daily workload, which consists of multiple Chrome windows with dozens of tabs open in each and some heavy photo editing. However, when using it at that triple-monitor setup, curiosity got the best of me and I decided to see what it would be like to game on 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qyJqt3r9ts8U244DsdtvyK" name="Triple Monitor Setup-05" alt="The game Dirt Rally running on a triple monitor setup" src="https://cdn.mos.cms.futurecdn.net/qyJqt3r9ts8U244DsdtvyK.jpg" mos="" align="middle" fullscreen="" width="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>Even with three 1080p monitors and using Intel’s Graphics Software to stitch them together into a single display, the Mind 2S was able to run loads of older titles flawlessly. I credit this to the Intel Arc 140T iGPU inside its Core Ultra 7 255H chip. </p><p>One of the biggest perks of having 64GB of RAM is that I was able to use the Shared GPU Memory Override in the Intel Graphics Command Center to set aside 32GB of memory specifically for the iGPU. This essentially gave the Mind 2S more "VRAM" than many dedicated gaming laptops, which helped immensely with texture-heavy games.</p><p>Now, don’t expect the Mind 2S to be a gaming-focused mini PC like the <a href="https://www.tomsguide.com/computing/desktop-computers/asus-rog-nuc-970-review">Asus ROG NUC 970</a> or the <a href="https://www.tomsguide.com/computing/desktop-computers/atomman-g7-ti-review">AtomMan G7 Ti</a>. However, if you’re playing less demanding games at 1080p and don’t mind turning down a few settings here and there, you can absolutely game on it. But if you want to take things to the next level graphics-wise, Khadas has that covered too.</p><h2 id="instantly-expandable">Instantly expandable</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iajpDNe7QgH4U9gygE6Dj4" name="Khadas Mind 2S--7" alt="A person pressing on the magnetic cover on the bottom of the Khadas Mind 2S to reveal its free M.2 SSD slot" src="https://cdn.mos.cms.futurecdn.net/iajpDNe7QgH4U9gygE6Dj4.jpg" mos="" align="middle" fullscreen="" width="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>Before we get into the optional Mind Dock and Mind Graphics Dock, the Mind 2S has another trick up its sleeve. If the 2TB of onboard storage isn’t enough, all you have to do is flip this mini PC over and push down on the magnetic cover to reveal a free M.2 2230 slot.</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="NSHB33tLyhNE89M4GT4Bjn" name="Khadas Mind 2S--4" alt="The Khadas Mind 2S seen from its underside with its magnetic SSD cover opened" src="https://cdn.mos.cms.futurecdn.net/NSHB33tLyhNE89M4GT4Bjn.jpg" mos="" align="middle" fullscreen="" width="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 slot supports up to a 2TB SSD, allowing you to essentially double your storage capacity in seconds. It’s an impressive inclusion for a PC you can slip in your pocket. Speaking of portability, the Mind 2S also features an integrated 5.55Wh battery. While it isn't meant for working on the go, it allows the device to enter a low-power standby mode for up to 25 hours when unplugged. This lets you move the PC between docks or rooms without having to save your work or reboot.</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="KTnD4wnxirRX6KtbiSfMMj" name="Khadas Mind 2S--3" alt="The Khadas Mind 2S seen from its underside next to the Khadas Mind Dock accessory" src="https://cdn.mos.cms.futurecdn.net/KTnD4wnxirRX6KtbiSfMMj.jpg" mos="" align="middle" fullscreen="" width="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>Besides that SSD slot, the bottom of the Mind 2S features Khadas’ proprietary Mind Link connector. This 122-pin interface has been upgraded to PCIe 5.0 x8 on the 2S, to make it even faster. The Mind Dock adds a fingerprint scanner, a volume knob, and a wealth of extra ports, while the Mind Graphics dock houses a desktop-grade GPU.</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="EP6H4f49GtnXmBurAbhtw7" name="Khadas Mind-4.jpg" alt="Connecting the Khadas Mind mini PC to Khadas' Mind Graphics GPU dock" src="https://cdn.mos.cms.futurecdn.net/EP6H4f49GtnXmBurAbhtw7.jpg" mos="" align="middle" fullscreen="" width="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 haven't tested the new Mind Graphics 2 yet, but I spent a lot of time with the original model. One second I was working with the mini PC powered by my monitor’s USB-C port, and the next I was playing Final Fantasy XV with a desktop Nvidia RTX 4060 Ti. The upcoming Mind Graphics 2 will push this even further with an RTX 5060 Ti that takes full advantage of the 2S’s faster PCIe 5.0 bandwidth.</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="Md62cPvrCDBHVHvg9tjDxj" name="Triple Monitor Setup-07" alt="The Khadas Mind 2S mini PC attached to the Mind Dock on a desk with a monitor stand in the background" src="https://cdn.mos.cms.futurecdn.net/Md62cPvrCDBHVHvg9tjDxj.jpg" mos="" align="middle" fullscreen="" width="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 will admit that both the Mind Dock at $179 and the Mind Graphics docks which range from $849 to $1,349 are on the expensive side for optional accessories. Still, they take what was already a fantastic mini PC and transform it into a legitimate desktop replacement. </p><p>You can absolutely use the Mind 2S on its own, but the ecosystem is what truly makes it feel like the future of computing. Oh, and did I mention Khadas recently released its new Mind xPlay accessory for $399? It essentially turns this mini PC into a laptop, complete with its own display, keyboard, and trackpad.</p><h3 class="article-body__section" id="section-khadas-mind-2s-the-downs"><span>Khadas Mind 2S: The Downs</span></h3><p>The Mind 2S is a powerful computer and the perfect follow-up to Khadas’ original Mind but it’s not without its downsides, both of which stem from its much smaller form factor compared to other, less expensive mini PCs.</p><h2 id="not-quite-silent-especially-under-load">Not quite silent (especially under load)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1975px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wFfSVFvqdWR3oQdu5B2B8e" name="Khadas Mind 2S--8" alt="The Khadas Mind 2S on a desk showing the cooling vents on its sides" src="https://cdn.mos.cms.futurecdn.net/wFfSVFvqdWR3oQdu5B2B8e.jpg" mos="" align="middle" fullscreen="" width="1975" height="1111" attribution="" endorsement="" class="inline"></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 the most part, you won’t really hear the Mind 2S while you’re working. It has a slight, and by no means annoying, hum when using it for less-demanding tasks like web browsing or standard office work. In fact, I’m quite impressed by how quiet it is, given it’s less than an inch thick.</p><p>When you push the Mind 2S with heavy workloads like video editing, though, it can get noisy. For instance, when I tried running some more demanding games using its integrated graphics, the fan spun up something fierce. It's a high-pitched whir that lets you know the internal cooling is working overtime to keep that powerful Arrow Lake chip from overheating.</p><p>While it's by no means a dealbreaker, if you want a dead-silent mini PC, the Mac mini M4 is still the gold standard. The <a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/minix-elite-eu715-ai-review">Minix Elite EU715-AI</a> is another good option if you want something that runs Windows and stays practically silent during your workday, though you do sacrifice the cutting-edge performance and the unique modularity of the Khadas Mind for peace and quiet.</p><h2 id="paying-a-premium-for-pocketable-power">Paying a premium for pocketable power</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vwHRxJSD9c6Er7HsCyhMrP" name="Khadas Mind-9.jpg" alt="Slipping the Khadas Mind mini PC into a pocket" src="https://cdn.mos.cms.futurecdn.net/vwHRxJSD9c6Er7HsCyhMrP.jpg" mos="" align="middle" fullscreen="" width="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>Let’s face it: $1,599 is a steep price to pay for a mini PC. This is especially true when you can pick up an equally powerful <a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/geekom-a9-max-review">Geekom A9 Max</a> for several hundred dollars less, or even a base Mac mini M4 at a fraction of the cost. With the Mind 2S, you’re essentially paying a "form factor tax."</p><p>In addition to this high up-front price, if you want to push the Mind 2S to its limits as a workstation or a gaming PC, adding a Mind Dock and the new Mind Graphics 2 pushes the total price past the $3,000 mark. At that point, you’re firmly in the territory of high-end gaming desktops or premium workstation laptops — both of which offer similar raw power and with the latter, portability.</p><p>If you don’t plan on taking advantage of the Mind 2S’s unique modular capabilities and pocketable nature, it will likely be overkill for most people. Fortunately, the standard Mind 2 is significantly cheaper, with a starting price of $799. It gives you all the perks of the Khadas ecosystem and that signature build quality without the same initial sticker shock.</p><h3 class="article-body__section" id="section-khadas-mind-2s-verdict"><span>Khadas Mind 2S: Verdict</span></h3><p>The Khadas Mind 2S continues to impress me with its sleek design, powerful internals, and its place as the newest addition to Khadas’ growing Mind ecosystem. Despite its pocketable size, you still get full-sized ports and expandable storage. Likewise, thanks to its internal battery, this is the kind of mini PC you could actually bring with you to work and then back home in the evening — all without ever powering it down.</p><p>At $1,599, the Mind 2S certainly won’t be for everyone. In fact, I’d consider it a "special edition" device for existing Khadas Mind fans who want the maximum amount of power in this specific form factor today. Then again, with the Mind Pro now available for pre-order at $1,799, it might be worth waiting and paying a bit more for that next-gen Panther Lake chip if you're chasing the absolute ceiling of performance.</p><p>Still, if you want a seriously fast, dockable mini PC you can carry in your pocket right now, the Mind 2S is a fantastic machine that stays true to the solid foundation laid by the original Khadas Mind.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 11 new Apple products tipped for 2026 — iPhone 17e, cheap MacBook, iOS 26.4 with new Siri and more ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/11-new-apple-products-tipped-for-2026-iphone-17e-cheap-macbook-ios-26-4-with-new-siri-and-more</link>
                                                                            <description>
                            <![CDATA[ Apple is going to have a busy next few months releasing a slew products from new budget iPhones to iPads and laptops. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">uz3etoGwaRR3WbAzBxqVLo</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/e9faAuPSUG9agPg5T6xypE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 09 Feb 2026 19:29:17 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[iPads]]></category>
                                                    <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Tablets]]></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.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/e9faAuPSUG9agPg5T6xypE-1280-80.jpg">
                                                            <media:credit><![CDATA[Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tim Cook at an Apple Event]]></media:description>                                                            <media:text><![CDATA[Tim Cook at an Apple Event]]></media:text>
                                <media:title type="plain"><![CDATA[Tim Cook at an Apple Event]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/e9faAuPSUG9agPg5T6xypE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As the rest of the tech world seemingly falls apart thanks to the ongoing<a href="https://www.tomsguide.com/computing/ram-prices-are-exploding-heres-why-and-everything-you-need-to-know-about-surviving-ramageddon"> RAM crisis</a>, Apple is slated to have a busy start to 2026 with a slew new devices expected to launch in the next six months.</p><p>From the refreshed iPhone 17e to new iPads, we expect to see a variety of devices, including a new budget-friendly MacBook to take on Chromebooks and cheaper Windows notebooks. <a href="https://www.bloomberg.com/news/newsletters/2026-02-08/apple-readies-iphone-17e-new-siri-entry-level-ipad-ipad-air-and-macbook-pro-mldr3hpk" target="_blank">Bloomberg's Mark Gurman confirmed</a> a number of new devices in his PowerOn newsletter, many of which we've covered. Here's what Apple should release soon — and what's on the horizon.</p><h3 class="article-body__section" id="section-iphones-iphone-17e"><span>iPhones: iPhone 17e</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fnMMEGMUGdVyvdqHpueo36" name="iPhone 16e review" alt="iPhone 16e review." src="https://cdn.mos.cms.futurecdn.net/fnMMEGMUGdVyvdqHpueo36.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Apple's e-series is going to be an annual spring release with the second version launching this year in the <a href="https://www.tomsguide.com/phones/iphones/iphone-17e-rumors-everything-weve-heard-so-far">iPhone 17e</a>. Most of the changes with this model will reportedly be internal with new chips and the addition of MagSafe charging. </p><p>It should get <a href="https://www.tomsguide.com/phones/iphones/apples-budget-friendly-iphone-17e-just-tipped-to-get-three-big-upgrades">the A19 chip</a> from the <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-review">iPhone 17</a> plus the Apple-developed C1 modem and <a href="https://www.tomsguide.com/phones/iphones/iphone-17-could-come-packing-apples-home-made-wi-fi-chip-what-that-means-for-you">N1 wireless chip.</a> This means the iPhone 17e should support Wi-Fi 7, Bluetooth 6, and Thread - the smart home low-power mesh.</p><p>Unfortunately, the<a href="https://www.tomsguide.com/phones/iphones/iphone-17e-may-be-just-as-expensive-as-the-iphone-16e-and-thats-a-huge-disappointment"> iPhone 17e may retain the $599 of the 16e</a>, which makes it not quite as budget-friendly as you'd like a downgraded iPhone to be.</p><p>As my colleague Tom Pritchard noted, "It may be a cheap iPhone, but we've seen cheaper, and I'm wondering whether buying a used flagship iPhone is a better use of your money."</p><p>Later this fall, we expect to see the iPhone 18 Pro, <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-rumors-everything-we-know-so-far">18 Pro Max</a> and the <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone">iPhone Fold </a>launch in September. </p><h3 class="article-body__section" id="section-ipads-entry-level-air-mini"><span>iPads: Entry-level, Air, Mini</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3Fe49xAgnSFQ8UybNLkjRD" name="iPad Air M3-09-LIST" alt="iPad Air M3 on top of a pile of books stacked at an angle on a yellow office table next to a houseplant" src="https://cdn.mos.cms.futurecdn.net/3Fe49xAgnSFQ8UybNLkjRD.jpg" mos="" align="middle" fullscreen="" width="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>Gurman claims that at least three refreshed iPad models are coming this year, including a new base model, iPad Air and an updated iPad mini.</p><p>Like the 17e, the biggest upgrades will all be internal. All three are expected to get the new in-house <a href="https://www.tomsguide.com/computing/ipads/2026-ipad-models-could-get-performance-boost-new-leak-reveals-a19-and-m4-chips">Apple wireless and modem chips</a>. Additionally, they should get faster processors. Gurman claimed they would get the A18 chip, but an <a href="https://www.tomsguide.com/computing/ipads/2026-ipad-models-could-get-performance-boost-new-leak-reveals-a19-and-m4-chips">earlier report</a> based on leaked internal documents indicated that the iPads would get the <a href="https://www.tomsguide.com/computing/macbooks/forget-iphone-17-pro-that-a19-pro-chip-needs-to-be-in-a-macbook-like-yesterday">newer A19 chipset</a> or <a href="https://www.tomsguide.com/computing/apple-desktops/apple-m4-chip">the M4 chip</a>.</p><p>The base model will get the A19, while the iPad Air will get the M4 set. </p><p>Finally, at the end of 2025, it was rumored that the <a href="https://www.tomsguide.com/computing/ipads/ipad-mini-8-rumors-everything-we-know-so-far">iPad mini 8</a> will get an<a href="https://www.tomsguide.com/computing/ipads/ipad-mini-8-oled-now-tipped-to-feature-apples-a20-pro-chip-heres-what-that-means"> OLED upgrade,</a> and it might feature the <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-tipped-for-a20-pro-chip-apples-first-2nm-processor-to-power-new-foldable-phone">A20 Pro </a>CPU that will feature in the <a href="https://www.tomsguide.com/phones/iphones/iphone-18-countdown-starts-now-5-rumored-upgrades-apple-could-be-giving-its-pro-models">iPhone 18 Pro </a>later this year. The upgraded iPad mini isn't expected to launch until later this year after the iPhone 18 Pro launch.</p><h3 class="article-body__section" id="section-macbooks-budget-m5-air-and-new-pro-models"><span>MacBooks: Budget, M5 Air, and new Pro models</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:3329px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="aU4pys8HozWWA8BGnegVU6" name="MacBook Air M4 2025-2" alt="Person holding the MacBook Air 13-inch M4 outside above grass in a shaded garden" src="https://cdn.mos.cms.futurecdn.net/aU4pys8HozWWA8BGnegVU6.jpg" mos="" align="middle" fullscreen="" width="3329" height="1873" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Apple launched its MacBook Pro M5 in October last year but was missing the M5 Pro and M5 Max/Ultra models. The most current rumors have set the high-end <a href="https://www.tomsguide.com/computing/macbooks/m5-pro-and-m5-max-macbook-pros-look-set-to-launch-in-march-and-apples-next-mac-launches-are-easy-to-call">Pro models to launch</a> as early as the week of March 2. We expect the <a href="https://www.tomsguide.com/computing/macbooks/m5-macbook-air-reportedly-coming-spring-2026-plus-the-missing-macbook-pros-and-a-new-mac-mini">MacBook Air M5 to launch</a> around this time as well. </p><p>The more interesting potential release is the rumored <a href="https://www.tomsguide.com/computing/macbooks/cheap-macbook-a18-pro-everything-we-know-so-far">cheap MacBook </a>meant to take on low-cost Windows laptops and Google Chromebooks. Rumors have slated this budget MacBook to cost around $599, likely as a way for Apple to kneecap the refurbished market for deals like the <a href="https://goto.walmart.com/c/1943169/568844/9383?subId1=tomsguide-us-6564757818058362988&sharedId=tomsguide-us&u=https%3A%2F%2Fwww.walmart.com%2Fip%2FApple-MacBook-Air-13-3-inch-Laptop-Silver-M1-Chip-Built-for-Apple-Intelligence-8GB-RAM-256GB-storage%2F715596133" target="_blank" rel="sponsored">M1 MacBook Air from Walmart</a>.</p><p>The laptop should have a 12-inch to 13-inch display and run on the A18 Pro chipset, though that is speculation. I haven't seen a release date in the rumor mill, but I would put a couple bucks on it launching alongside the iPhone 17e, creating a "budget ecosystem" for Apple. Possibly, it could debut as part of a week of MacBooks with the Pro models.</p><p>Finally, on the computing front, Apple could finally release an updated Studio Display and Mac Studio desktops. Allegedly, new Mac minis, likely with the M5 chip, are on the docket as well. It's not clear when these devices will launch. Plus, an <a href="https://www.tomsguide.com/computing/macbooks/macbook-pro-m6-oled-rumors-everything-we-know-so-far">OLED MacBook Pro M6</a> is rumored to launch at some point this year, likely in October, its usual window.</p><h3 class="article-body__section" id="section-ios-26-4-siri-2-0-ios-27"><span>iOS 26.4: Siri 2.0, iOS 27</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:50.03%;"><img id="kXY7uTKX6EYEPwD7nBp2G4" name="Apple 2026 E Siri AI" alt="Siri" src="https://cdn.mos.cms.futurecdn.net/kXY7uTKX6EYEPwD7nBp2G4.jpg" mos="" align="middle" fullscreen="" width="3000" height="1501" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide/Apple)</span></figcaption></figure><p>One of our complaints about the 16e was the high price point and the lack of actual Apple Intelligence, thanks to Apple's struggles with AI and creating a <a href="https://www.tomsguide.com/phones/iphones/siri-2-0-could-be-with-us-in-just-two-weeks-heres-what-we-have-to-look-forward-to">true Siri 2.0</a>.</p><p>That version should finally <a href="https://www.tomsguide.com/ai/apple-intelligence/siri-2-0-could-finally-reach-your-iphone-next-month-with-the-gemini-powered-assistant-due-to-gain-even-more-abilities-at-wwdc-this-summer">launch with iOS 26.4</a>, likely in March, which will include upgrades to Siri. The real upgrade probably won't launch until WWDC 2026 in June when we'll learn more about<a href="https://www.tomsguide.com/phones/iphones/ios-27-could-lose-apples-rumored-new-ai-fitness-feature-but-we-could-still-see-parts-of-it-launch-this-year"> iOS 27</a> and the <a href="https://www.tomsguide.com/ai/apple-intelligence/siri-2-0-could-finally-reach-your-iphone-next-month-with-the-gemini-powered-assistant-due-to-gain-even-more-abilities-at-wwdc-this-summer">Google Gemini partnership</a> to bolster Apple Intelligence.</p><p>All in all, it's a busy season for the tech giant, and Tom's Guide will be there to cover all the new devices and help you decide if it's time to upgrade.</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/new-snapdragon-x2-elite-benchmarks-surface-and-apple-and-intel-should-be-worried">New Snapdragon X2 Elite benchmarks surface — and Apple and Intel should be worried</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/5-apple-watch-settings-you-should-change-right-now-for-more-accurate-heart-rate-tracking">5 Apple Watch settings you should change right now for more accurate heart rate tracking</a></li><li><a href="https://www.tomsguide.com/us/best-apple-iphone,review-6348.html">Best iPhones: Which iPhone should you buy?</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Get 36% off Acemagic Mini PCs but only with our exclusive codes ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/get-36-percent-off-acemagic-mini-pcs-but-only-with-our-exclusive-codes</link>
                                                                            <description>
                            <![CDATA[ Save 36% on Acemagic Mini PCs this February ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">uF4UifTkPFRBfHHa33xYNZ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ThzTgCDLKk2WVAagRpb8Xg-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 04 Feb 2026 15:13:27 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                                    <dc:creator><![CDATA[ Paul Hatton ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/yFZfUBGGs822CgbDU8DvVF.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/ThzTgCDLKk2WVAagRpb8Xg-1280-80.jpg">
                                                            <media:credit><![CDATA[Acemagic]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Acemagic]]></media:description>                                                            <media:text><![CDATA[Acemagic]]></media:text>
                                <media:title type="plain"><![CDATA[Acemagic]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ThzTgCDLKk2WVAagRpb8Xg-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Mini PCs are the perfect solution for anyone wanting high-performing hardware in a compact form factor. They're so small you can have them sitting on top of your desk or tuck them neatly underneath. Either way, you won't notice they're even there.</p><p>If that sounds like something you're looking for, you'll want to know that Acemagic, one of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PC</a> brands around, is <a href="https://www.amazon.co.uk/stores/page/2D0D2CCA-C37D-4AC6-A2F3-0B8B5EEFEEE0/?_encoding=UTF8&aref=Apm0xaqa2b&pd_rd_plhdr=t&pd_rd_i=B0D5Y92DWS&ref_=sbx_be_s_sparkle_ssd_logo&store_ref=SBV_A05553152Q7XOQ7KZ4UL6-A07811962DJ0Y2ZU1LB1R&lp_asins=B0D5Y92DWS&pd_rd_w=kBjRc&content-id=amzn1.sym.7d8787df-7d4c-460d-ab31-21b0ba272b2f%3Aamzn1.sym.7d8787df-7d4c-460d-ab31-21b0ba272b2f&pf_rd_p=7d8787df-7d4c-460d-ab31-21b0ba272b2f&pf_rd_r=FTM9V6NZKBGHYRK2NDR2&pd_rd_wg=IDRh0&pd_rd_r=f78a8ee1-110b-48d9-9c4d-f8d12928cdc6">g</a><a href="https://www.amazon.co.uk/stores/page/2D0D2CCA-C37D-4AC6-A2F3-0B8B5EEFEEE0/?_encoding=UTF8&aref=Apm0xaqa2b&pd_rd_plhdr=t&pd_rd_i=B0D5Y92DWS&ref_=sbx_be_s_sparkle_ssd_logo&store_ref=SBV_A05553152Q7XOQ7KZ4UL6-A07811962DJ0Y2ZU1LB1R&lp_asins=B0D5Y92DWS&pd_rd_w=kBjRc&content-id=amzn1.sym.7d8787df-7d4c-460d-ab31-21b0ba272b2f%3Aamzn1.sym.7d8787df-7d4c-460d-ab31-21b0ba272b2f&pf_rd_p=7d8787df-7d4c-460d-ab31-21b0ba272b2f&pf_rd_r=FTM9V6NZKBGHYRK2NDR2&pd_rd_wg=IDRh0&pd_rd_r=f78a8ee1-110b-48d9-9c4d-f8d12928cdc6">iving customers up to 36% off</a>. That equates to a generous amount of money off that you can put towards investing in a display or two.</p><p>Our top pick in the sale is the Kron Mini K1 with options to customize the amount of RAM and storage. With several available options, you can flex the spec to suit your budget. Keep in mind, though, that these are limited-time deals that are only here for the month of February.</p><h2 id="save-big-on-a-new-mini-pc">Save big on a new mini PC</h2><div class="product"><a data-dimension112="984f7f2d-877a-413b-8304-7ffdb5e1f348" data-action="Deal Block" data-label="Save up to 36% on the latest mini PCsWith generous deals across the Ace Magician range, you're guaranteed to get excellent hardware at a fraction of the price of a traditional desktop." data-dimension48="Save up to 36% on the latest mini PCsWith generous deals across the Ace Magician range, you're guaranteed to get excellent hardware at a fraction of the price of a traditional desktop." href="https://www.amazon.com/stores/ACEMAGIC/page/5BF995C2-098C-4C87-9DE4-70D955E4C902?lp_asin=B0FG7YD2D8&ref_=ast_bln&store_ref=bl_ast_dp_brandLogo_sto" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:255px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="LUwDXprrKvBYeVXeUSaTpV" name="ACEMAGICIAN" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/LUwDXprrKvBYeVXeUSaTpV.jpg" mos="" align="middle" fullscreen="" width="255" height="255" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Save up to 36% on the latest mini PCs</strong></p><p>With generous deals across the Ace Magician range, you're guaranteed to get excellent hardware at a fraction of the price of a traditional desktop.<a class="view-deal button" href="https://www.amazon.com/stores/ACEMAGIC/page/5BF995C2-098C-4C87-9DE4-70D955E4C902?lp_asin=B0FG7YD2D8&ref_=ast_bln&store_ref=bl_ast_dp_brandLogo_sto" target="_blank" rel="nofollow" data-dimension112="984f7f2d-877a-413b-8304-7ffdb5e1f348" data-action="Deal Block" data-label="Save up to 36% on the latest mini PCsWith generous deals across the Ace Magician range, you're guaranteed to get excellent hardware at a fraction of the price of a traditional desktop." data-dimension48="Save up to 36% on the latest mini PCsWith generous deals across the Ace Magician range, you're guaranteed to get excellent hardware at a fraction of the price of a traditional desktop." data-dimension25="">View Deal</a></p></div><h2 id="today-s-best-acemagic-mini-pc-deals">Today's best Acemagic Mini PC deals</h2><div class="product"><a data-dimension112="6ddf22cc-e490-4342-9beb-9e4e255caae2" data-action="Deal Block" data-label="Powered by the latest Ryzen 7 7730U, this mini PC also features 32GB DDR4 and a 1TB SSD. That's enough processing power to keep everything running smoothly and a generous hard drive for storing all your files locally.No code needed" data-dimension48="Powered by the latest Ryzen 7 7730U, this mini PC also features 32GB DDR4 and a 1TB SSD. That's enough processing power to keep everything running smoothly and a generous hard drive for storing all your files locally.No code needed" data-dimension25="$413" href="https://amazon.com/dp/B0D3H1M19P?th=1&tag=tomsguidecoup-20&linkCode=112&ascsubtag=hawk-9740179887318598880-20" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="AYq9bxokXguVQXQzWmdLQi" name="Kron Mini K1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AYq9bxokXguVQXQzWmdLQi.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Powered by the latest Ryzen 7 7730U, this mini PC also features 32GB DDR4 and a 1TB SSD. That's enough processing power to keep everything running smoothly and a generous hard drive for storing all your files locally.</p><p><strong>No code needed</strong><a class="view-deal button" href="https://amazon.com/dp/B0D3H1M19P?th=1&tag=tomsguidecoup-20&linkCode=112&ascsubtag=hawk-9740179887318598880-20" target="_blank" rel="nofollow" data-dimension112="6ddf22cc-e490-4342-9beb-9e4e255caae2" data-action="Deal Block" data-label="Powered by the latest Ryzen 7 7730U, this mini PC also features 32GB DDR4 and a 1TB SSD. That's enough processing power to keep everything running smoothly and a generous hard drive for storing all your files locally.No code needed" data-dimension48="Powered by the latest Ryzen 7 7730U, this mini PC also features 32GB DDR4 and a 1TB SSD. That's enough processing power to keep everything running smoothly and a generous hard drive for storing all your files locally.No code needed" data-dimension25="$413">View Deal</a></p></div><div class="product"><a data-dimension112="a78f8e3d-134e-4d10-b765-e545e08755b9" data-action="Deal Block" data-label="If you want the same level of power but not as much storage space, then you can save even more money by opting for a 512GB SSD rather than a 1TB SSD. Features the same connectivity with support for three 4K displays.Use our exclusive code: K132GB512GB" data-dimension48="If you want the same level of power but not as much storage space, then you can save even more money by opting for a 512GB SSD rather than a 1TB SSD. Features the same connectivity with support for three 4K displays.Use our exclusive code: K132GB512GB" data-dimension25="$341" href="https://amazon.com/dp/B0C9J69KH8?th=1&tag=tomsguidecoup-20&linkCode=112&ascsubtag=hawk-8906810127473187033-20" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1471px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="z5LU7SanQsMfWBWxcaDUV3" name="ACEMAGICIAN Kron Mini K1 Mini PC, Ryzen 7 7730U, 3" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/z5LU7SanQsMfWBWxcaDUV3.jpg" mos="" align="middle" fullscreen="" width="1471" height="1471" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you want the same level of power but not as much storage space, then you can save even more money by opting for a 512GB SSD rather than a 1TB SSD. Features the same connectivity with support for three 4K displays.</p><p><strong>Use our exclusive code: K132GB512GB</strong><a class="view-deal button" href="https://amazon.com/dp/B0C9J69KH8?th=1&tag=tomsguidecoup-20&linkCode=112&ascsubtag=hawk-8906810127473187033-20" target="_blank" rel="nofollow" data-dimension112="a78f8e3d-134e-4d10-b765-e545e08755b9" data-action="Deal Block" data-label="If you want the same level of power but not as much storage space, then you can save even more money by opting for a 512GB SSD rather than a 1TB SSD. Features the same connectivity with support for three 4K displays.Use our exclusive code: K132GB512GB" data-dimension48="If you want the same level of power but not as much storage space, then you can save even more money by opting for a 512GB SSD rather than a 1TB SSD. Features the same connectivity with support for three 4K displays.Use our exclusive code: K132GB512GB" data-dimension25="$341">View Deal</a></p></div><div class="product"><a data-dimension112="500b866d-0a32-4cbc-865b-df5833648fd2" data-action="Deal Block" data-label="Get huge savings on the mini PC that boasts a Ryzen 7 7730U CPU, 16GB DDR4, and a 512GB SSD. Includes support for 4K triple display, Bluetooth, and WiFi 6. It's powerful, compact, and now more affordable than ever.Use our exclusive code: 16GB512GBK1" data-dimension48="Get huge savings on the mini PC that boasts a Ryzen 7 7730U CPU, 16GB DDR4, and a 512GB SSD. Includes support for 4K triple display, Bluetooth, and WiFi 6. It's powerful, compact, and now more affordable than ever.Use our exclusive code: 16GB512GBK1" data-dimension25="$296.10" href="https://amazon.com/dp/B0BQHBWPYX?th=1&tag=tomsguidecoup-20&linkCode=112&ascsubtag=hawk-1366534453476663060-20" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="R3SASQ8fVsa6gegV3NzoGe" name="Kron Mini K1 512GB" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/R3SASQ8fVsa6gegV3NzoGe.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Get huge savings on the mini PC that boasts a Ryzen 7 7730U CPU, 16GB DDR4, and a 512GB SSD. Includes support for 4K triple display, Bluetooth, and WiFi 6. It's powerful, compact, and now more affordable than ever.</p><p><strong>Use our exclusive code: 16GB512GBK1</strong><a class="view-deal button" href="https://amazon.com/dp/B0BQHBWPYX?th=1&tag=tomsguidecoup-20&linkCode=112&ascsubtag=hawk-1366534453476663060-20" target="_blank" rel="nofollow" data-dimension112="500b866d-0a32-4cbc-865b-df5833648fd2" data-action="Deal Block" data-label="Get huge savings on the mini PC that boasts a Ryzen 7 7730U CPU, 16GB DDR4, and a 512GB SSD. Includes support for 4K triple display, Bluetooth, and WiFi 6. It's powerful, compact, and now more affordable than ever.Use our exclusive code: 16GB512GBK1" data-dimension48="Get huge savings on the mini PC that boasts a Ryzen 7 7730U CPU, 16GB DDR4, and a 512GB SSD. Includes support for 4K triple display, Bluetooth, and WiFi 6. It's powerful, compact, and now more affordable than ever.Use our exclusive code: 16GB512GBK1" data-dimension25="$296.10">View Deal</a></p></div><p>These deals run through to February 28. If you missed out, then check out the <a href="https://www.amazon.com/stores/ACEMAGIC/page/5BF995C2-098C-4C87-9DE4-70D955E4C902?lp_asin=B0FG7YD2D8&ref_=ast_bln&store_ref=bl_ast_dp_brandLogo_sto">ACEMAGIC Amazon store</a> for the latest deals.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested a mini PC as quiet as the Mac mini but as expandable as a desktop — and it’s this close to greatness ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/desktop-computers/mini-pcs/minix-elite-eu715-ai-review</link>
                                                                            <description>
                            <![CDATA[ The Minix Elite EU715-AI is a whisper-quiet, ultra-compact mini PC with easy upgrades, but a steep price hike and an older CPU hold it back from greatness. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">mMq8648mYSPsDvY2tkMVyV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/8eCpgRf3NemMhaSuBpLmKk-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 28 Jan 2026 12:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 04 Jun 2026 12:51:31 +0000</updated>
                                                                                                                                            <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/8eCpgRf3NemMhaSuBpLmKk-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Minix Elite EU715-AI on a table]]></media:description>                                                            <media:text><![CDATA[The Minix Elite EU715-AI on a table]]></media:text>
                                <media:title type="plain"><![CDATA[The Minix Elite EU715-AI on a table]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/8eCpgRf3NemMhaSuBpLmKk-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Minix Elite EU715-AI is one of the rare mini PCs that manages to pack high-end performance into an absolutely tiny chassis without compromising on cooling or noise. At just over an inch and a half tall, it barely takes up any room on your desk, and yet, despite its small size, it runs nearly silent.</p><p>Minix didn’t cut corners here either. Instead of using an underpowered processor for the sake of going smaller, the PC maker equipped the Elite EU715-AI with one of Intel’s Meteor Lake chips, along with enough RAM and storage to handle most workloads. However, if you need more, you can always open this mini PC up and easily upgrade it.</p><p>After spending over a month using it as my daily driver, I’m seriously impressed by just how quiet it is while handling everything I’ve thrown at it. Still, I wish there were a few more USB ports around back, and you’re definitely paying a premium price for its “Elite” all-metal case and whisper-quiet design.</p><p>My Minix Elite EU715-AI review will help you decide if this is the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PC</a> for your needs or if it’s worth going with something slightly louder and taller for a lot less.</p><h3 class="article-body__section" id="section-minix-elite-eu715-ai-cheat-sheet"><span>Minix Elite EU715-AI: Cheat Sheet</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uyfo4N8PuNfQd9aVy45j5o" name="Minix EliteMini EU715-AI--11" alt="The Minix Elite EU715-AI unboxed on a table" src="https://cdn.mos.cms.futurecdn.net/uyfo4N8PuNfQd9aVy45j5o.jpg" mos="" align="middle" fullscreen="" width="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><ul><li><strong>What is it? </strong>A business-focused mini PC that packs high-end performance into an absolutely tiny case.</li><li><strong>Who is it for? </strong>Users who want a powerful workstation that saves desk space and stays practically silent even under load.</li><li><strong>What does it cost?</strong> The Minix Elite EU715-AI <a href="https://www.minix.com.hk/products/minix-elite-eu715-ai-mini-pc" target="_blank" rel="nofollow">costs $1,300</a>. While it carries a premium price tag, this mini PC comes fully equipped with enough RAM and storage that most won't need to upgrade it for years.</li><li><strong>What do we like?</strong> The ultra-compact size, the convenience of standard USB-C power, the near-silent operation and the ability to easily add more storage later.</li><li><strong>What don’t we like? </strong>The high entry price and a frustrating lack of rear ports make cable management a challenge.</li></ul><h3 class="article-body__section" id="section-minix-elite-eu715-ai-specs"><span>Minix Elite EU715-AI: Specs</span></h3><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,300 (originally $999)</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Intel Core Ultra 7 155H</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Intel Arc Graphics</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>32GB DDR5 (up to 96GB)</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>1TB M.2 SSD, 1 x M.2 2280 (up to 8TB)</p></td></tr><tr><td class="firstcol " ><p><strong>OS</strong></p></td><td  ><p>Windows 11 Pro</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>2 x USB-A, 1 x Thunderbolt 4, 1 x 3.5mm audio combo jack (front), 1 x USB-A, 1 x DisplayPort 1.4, 1 x HDMI 2.1, 1 x USB-C, 2 x 2.5G Ethernet (back)</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>Size</strong></p></td><td  ><p>5.51 x 5.43 x 1.56 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.7 pounds (772 grams)</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-minix-elite-eu715-ai-the-ups"><span>Minix Elite EU715-AI: The ups</span></h3><p>There’s a lot to like about the Minix Elite EU715-AI, from its tiny footprint to how you’ll practically never hear its internal fan spin up. However, it’s the small things, like the included power adapter and how upgradeable it is, even with such a thin profile, that stood out to me most.</p><h2 id="tiny-package-plenty-of-power">Tiny package, plenty of power</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nwUyG983pS9bqVfbDfdKT4" name="Minix EliteMini EU715-AI--07" alt="An angled shot of the Minix Elite EU715-AI on a table" src="https://cdn.mos.cms.futurecdn.net/nwUyG983pS9bqVfbDfdKT4.jpg" mos="" align="middle" fullscreen="" width="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>Measuring 5.51 x 5.43 x 1.56 inches, the Elite EU715-AI is just slightly wider than the <a href="https://www.tomsguide.com/computing/desktop-computers/mac-mini-m4-review">Mac mini M4</a>, but it’s also half an inch shorter. This mini PC won’t take up much space on your desk at all, and Minix even includes a VESA mounting bracket if you want to <a href="https://www.tomsguide.com/opinion/i-mounted-a-mini-pc-to-the-back-of-my-monitor-for-an-even-cleaner-setup">install it behind a monitor</a>. Be warned, though: it’s so quiet you might actually forget it’s there.</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="MQ8cdJ2JsRMzisKGKaJ3L7" name="Minix EliteMini EU715-AI--10" alt="The front ports on the Minix Elite EU715-AI" src="https://cdn.mos.cms.futurecdn.net/MQ8cdJ2JsRMzisKGKaJ3L7.jpg" mos="" align="middle" fullscreen="" width="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>On the front, you get two high-speed USB-A ports, a <a href="https://www.tomsguide.com/features/thunderbolt-4-vs-usb4-whats-the-difference">Thunderbolt 4</a> port and a headphone/microphone combo jack. There are also two tiny microphones located above its front USB ports to complement its “AI” branding, just like on the <a href="https://www.tomsguide.com/computing/desktop-computers/msi-cubi-nuc-ai-plus-2mg-review">MSI Cubi NUC AI+ 2MG</a>. However, it lacks a built-in speaker like on that mini PC, so you will need to bring your own speakers to converse with your favorite AI chatbot or if you need to jump on a call.</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="C2RvsxFevR5smY7xpXbEP9" name="Minix EliteMini EU715-AI--09" alt="The rear ports of the Minix Elite EU715-AI" src="https://cdn.mos.cms.futurecdn.net/C2RvsxFevR5smY7xpXbEP9.jpg" mos="" align="middle" fullscreen="" width="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>Around back, you get two USB-C ports (one of which is used for power), one USB-A port, HDMI 2.1, DisplayPort 1.4, and two 2.5 Gigabit Ethernet ports. There is also a Kensington lock on the right side and vents to expel hot air above the rear ports.</p><div ><table><caption>Performance Benchmarks</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Minix Elite EU715-AI</strong></p></th><th  ><p><strong>Acemagic F2A</strong></p></th><th  ><p><strong>Geekom IT15</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Geekbench 6.4 single-core</strong></p></td><td  ><p>2459</p></td><td  ><p>2271</p></td><td  ><p>2126</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6.4 multi-core</strong></p></td><td  ><p>11825</p></td><td  ><p>11170</p></td><td  ><p>10547</p></td></tr><tr><td class="firstcol " ><p><strong>25GB file copy test (MBps)</strong></p></td><td  ><p>1466.28</p></td><td  ><p>1176.49</p></td><td  ><p>1200</p></td></tr><tr><td class="firstcol " ><p><strong>Handbrake (Mins:Secs)</strong></p></td><td  ><p>4:32</p></td><td  ><p>4:41</p></td><td  ><p>5:44</p></td></tr></tbody></table></div><p>Under the hood, the Elite EU715-AI is powered by an Intel Core Ultra 7 155H processor and 32GB of DDR5 memory. It also comes with a 1TB M.2 SSD and Windows 11 Pro. In our lab tests, the Elite EU715-AI beat out newer Intel-based mini PCs like the <a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/geekom-it15-review">Geekom IT15</a> across the board despite having an older, first-generation Intel Core Ultra Series 1 chip.</p><p>The reason for this performance gap is that the EU715-AI features a 16-core processor designed for high-performance laptops, whereas many newer 2nd-gen Core Ultra (<a href="https://www.tomsguide.com/computing/laptops/intel-lunar-lake-benchmarks-heres-how-it-compares-to-snapdragon-x-and-apple-m3">Lunar Lake</a>) chips focus on power efficiency over raw processing power. While the Elite EU715-AI is a powerful yet pricey mini PC, it was the low noise levels that impressed me most.</p><h2 id="mac-mini-quiet">Mac mini quiet</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QuEAWPTHsCDtGka8htNjYC" name="Minix EliteMini EU715-AI--04" alt="A dual-monitor setup built around the Minix Elite EU715-AI mini PC" src="https://cdn.mos.cms.futurecdn.net/QuEAWPTHsCDtGka8htNjYC.jpg" mos="" align="middle" fullscreen="" width="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>Just like I did with the <a href="https://www.tomsguide.com/computing/desktop-computers/acemagic-f2a-review">AceMagic F2A</a>, I had to break out my sound level meter to test the Elite EU715-AI, but for the opposite reason. With the F2A, its dual fans made a very audible hum and got as loud as 55dB. The same was true with the Geekom IT15, which hit 54dB. It’s a completely different story with the Elite EU715-AI, which was significantly quieter at just 36dB.</p><p>With other mini PCs I’ve tested, like the <a href="https://www.tomsguide.com/computing/desktop-computers/atomman-g7-ti-review">Atomman G7 TI</a>, there’s a physical button on the front to switch between performance modes. With the Elite EU715-AI, I don’t even need one; even with over 20 Chrome tabs open across three windows, it never so much as made a peep while I was working. Even when I’d leave it on in the background, it wasn’t audible at all.</p><p>If you don’t want to hear your computer at your desk, the Elite EU715-AI is the closest a Windows-based mini PC has gotten to Mac mini M4 noise levels (or lack thereof) yet in my experience.</p><h2 id="no-barrel-port-here">No barrel port here</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yMDfZdaEThPzbx6gGndvRF" name="Minix EliteMini EU715-AI--08" alt="An angled shot of the Minix Elite EU715-AI showing its USB-C power port" src="https://cdn.mos.cms.futurecdn.net/yMDfZdaEThPzbx6gGndvRF.jpg" mos="" align="middle" fullscreen="" width="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>One common feature that less premium mini PCs often share is large power adapters that use a vendor-specific barrel port connector. Fortunately, you won’t find one here. Instead, the Elite EU715-AI uses a standard 100W USB-C power adapter.</p><p>I know this is a small thing, but as someone who’s constantly <a href="https://www.tomsguide.com/computing/i-built-the-ultimate-distraction-free-desk-setup-and-now-im-truly-locked-in">building desk setups</a> and trying out new mini PCs, I don’t like being stuck with a bulky, non-standard power adapter. Since the Elite EU715-AI relies on a 100W USB-C connection, the included adapter is very compact and roughly the size of a standard phone charger. Just like with the even smaller (and pocketable) <a href="https://www.tomsguide.com/computing/desktop-computers/khadas-mind-review">Khadas Mind</a>, this means you can actually use a third-party GaN charger if you want an <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">even more portable setup for travel</a>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CJLdvw328eytHUDbCxsudN" name="Geekom A9 Max-03" alt="The rear ports of the Geekom A9 Max" src="https://cdn.mos.cms.futurecdn.net/CJLdvw328eytHUDbCxsudN.jpg" mos="" align="middle" fullscreen="" width="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>Some newer mini PCs like the <a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/geekom-a9-max-review">Geekom A9 Max</a> and the Cubi NUC AI+ 2MG let you use one of their USB-C ports for power in lieu of their barrel ports. However, since they still keep the barrel jack on the rear panel, that connector ends up being wasted physical space. That isn’t the case with the Elite EU715-AI; the back of the unit is cleaner because it was designed specifically for USB-C power input.</p><h2 id="easy-upgrades-in-a-small-case">Easy upgrades in a small case</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DgVQMfqzAk9FHguqeDqyhJ" name="Minix EliteMini EU715-AI--06" alt="The Minix Elite EU715-AI opened on a table showing its free M.2 slot and other internals" src="https://cdn.mos.cms.futurecdn.net/DgVQMfqzAk9FHguqeDqyhJ.jpg" mos="" align="middle" fullscreen="" width="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>Even with a mini PC as small as the Elite EU715-AI, you can still open it up and upgrade the existing components — and you’re able to add new ones too. In this case, you can swap out the included 32GB of RAM for up to 96GB. </p><p>Likewise, you can also swap the included 1TB M.2 SSD for a 4TB drive, and there’s also a free M.2 2280 slot where you can add another 4TB drive for a total of 8TB of storage. Not bad for such a tiny case.</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="wJg8PPmt6vJ9xy5kuGX5CM" name="Minix EliteMini EU715-AI--05" alt="A person using a screwdriver to open the Minix Elite EU715-AI" src="https://cdn.mos.cms.futurecdn.net/wJg8PPmt6vJ9xy5kuGX5CM.jpg" mos="" align="middle" fullscreen="" width="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>To get to the Elite EU715-AI’s internals, I flipped it over and removed a screw at each of its four corners. </p><p>One thing I really like about this mini PC, compared to the <a href="https://www.tomsguide.com/computing/desktop-computers/geekom-a5-review">Geekom A5</a> and most of the others I’ve reviewed, is that I didn’t have to remove the rubber case feet on the bottom to get to these screws. Instead, Minix slightly offset the Elite EU715-AI’s feet and put the case screws closer to the edge. That way, you can easily open its case without worrying about damaging those rubber feet.</p><h3 class="article-body__section" id="section-minix-elite-eu715-ai-the-downs"><span>Minix Elite EU715-AI: The downs</span></h3><p>The Minix Elite EU715-AI is a seriously impressive mini PC in a very petite package. Unfortunately, it’s not without its downsides that make cable management more difficult and put a serious dent in your wallet.</p><h2 id="short-on-ports">Short on 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:1936px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fZLeQpdjLdfJoLh6pRphfW" name="Minix EliteMini EU715-AI--02" alt="The Minix Elite EU715-AI mini PC on a desk with a mechanical keyboard and trackball mouse" src="https://cdn.mos.cms.futurecdn.net/fZLeQpdjLdfJoLh6pRphfW.jpg" mos="" align="middle" fullscreen="" width="1936" height="1089" attribution="" endorsement="" class="inline"></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 know about you, but when I want to plug wired devices into my computer, I prefer to do so at the back so that I can run their cables behind my desk. Well, the Elite EU715-AI does come equipped with three USB-A ports for doing so. The problem is, two are on the front and only one is at the rear.</p><p>Although this likely won’t be a deal-breaker for most people, at this price, I’d like to see a few more ports and even an SD card reader. Now, I get there are space limitations around back due to the Elite EU715-AI’s case, but both the <a href="https://www.tomsguide.com/computing/desktop-computers/asus-NUC-14-pro-review">Asus NUC 14 Pro</a> and the original <a href="https://www.tomsguide.com/computing/desktop-computers/msi-cubi-nuc-1m-review">MSI Cubi NUC 1M</a> both have dual USB-A ports around back. While they don’t have a DisplayPort like the Elite EU715-AI does (something you rarely see on a mini PC), the latter retains the same dual 2.5 Gigabit Ethernet ports.</p><p>Speaking of ports, I have another gripe with one of the rear ports in particular.</p><h2 id="underpowered-rear-usb-c-video">Underpowered rear USB-C video</h2><p>Having a Thunderbolt 4 port on the front of the Elite EU715-AI is very convenient for quickly connecting a portable monitor. But what if you’ve permanently incorporated one into your desk setup? Well, I have a <a href="https://www.tomsguide.com/computing/peripherals/i-added-a-portable-monitor-next-to-my-main-display-and-this-inexpensive-upgrade-is-a-game-changer">portable monitor next to my ultrawide</a>, and as such, I’d rather connect it to the Elite EU715-AI using the USB-C Gen 2x2 port around back. Unfortunately, when I tried it with two different portable monitors, I couldn’t get either of them to work.</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="DpBAvs57FPodBe7AQrNKMb" name="Minix EliteMini EU715-AI--03" alt="An overhead shot of the Minix Elite EU715-AI on a desk showing a USB-C extension cable connected to the Thunderbolt 4 port on the front" src="https://cdn.mos.cms.futurecdn.net/DpBAvs57FPodBe7AQrNKMb.jpg" mos="" align="middle" fullscreen="" width="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>Eventually, I just used an angled USB-C extension cable and plugged my portable monitor into the Thunderbolt 4 port on the front instead of the more conveniently located USB-C one on the back. It worked well enough, though this fix did take away from the Elite EU715-AI’s sleek design.</p><p>After a bit of research, I finally found the problem. While both the Thunderbolt 4 port up front and the USB-C one around back provide 15W of power (and most portable monitors need 8-12W), the rear port seems to experience handshake issues where it isn’t able to “negotiate” the power draw required by the monitor while simultaneously handling a video signal.</p><p>Once I added another USB-C cable and connected it to an outlet to power the portable monitor, I was able to get the rear port working correctly. However, I would have loved to have the same one-cable connection I have at the front of the Elite EU715-AI around back.</p><h2 id="paying-an-elite-premium">Paying an Elite premium</h2><p>When Minix first launched the Elite EU715-AI in May 2025, it was originally priced at $999. At the time, this was already more expensive than similarly specced mini PCs from brands like Minisforum and Geekom, but its compact form factor and all-metal case helped justify the "Elite" branding.</p><p>In the time since, however, the ongoing <a href="https://www.tomsguide.com/computing/ram-prices-are-exploding-heres-why-and-everything-you-need-to-know-about-surviving-ramageddon">RAM crisis</a> has pushed the price of memory through the roof. As a result, PC makers and retailers have been forced to raise prices significantly, much like how the <a href="https://www.tomsguide.com/gaming/xbox/microsoft-raises-prices-on-xbox-series-s-and-x-for-the-second-time-this-year">Xbox Series X</a> is now more expensive at $649 than it was when it launched back in 2020.</p><p>Let’s face it: you’re going to be spending more for PCs, laptops, and other electronics today than you would have just a few months ago. The problem with the Elite EU715-AI, though, is that you’re paying a $1,300 premium for a mini PC with an Intel Core Ultra Series 1 processor when Core Ultra Series 3 (Panther Lake) processors have already arrived. </p><p>Given that my colleague Jason England <a href="https://www.tomsguide.com/computing/laptops/asus-zenbook-duo-2026-review">just reviewed a laptop</a> with one of these new chips, I can tell you the performance and efficiency gains are significant, and they'll likely be making their way to mini PCs any day now. This makes the "Series 1" hardware inside this Minix feel two generations behind the curve for such a steep price.</p><h3 class="article-body__section" id="section-minix-elite-eu715-ai-verdict"><span>Minix Elite EU715-AI: Verdict</span></h3><p>The Minix Elite EU715-AI stands out thanks to its ultra-compact case and the premium materials used throughout its design. Despite being two generations older, its Intel Core Ultra 7 155H processor is still very powerful and more than equipped for a wide variety of workloads. Its near-silent operation — peaking at just 40dB — is equally impressive given the thermal and acoustic limitations that usually come with such a small chassis.</p><p>Although I would have liked to see a few more ports around back, and I think swapping the position of the Thunderbolt 4 and USB-C ones would make sense, you’re still getting a solid selection. This includes features you rarely find elsewhere in this size, like DisplayPort 1.4 and a dedicated USB-C power port.</p><p>My biggest gripe, though, is with the price. Although slightly premium, $999 was originally the perfect price point for a machine like this. Unfortunately, Minix is just one of many manufacturers forced to raise prices due to the ongoing RAM crisis. The blame for this $1,300 sticker price doesn’t fall on the company; instead, the rapid expansion of AI infrastructure has effectively hijacked the global memory supply.</p><p>Still, if you’re looking for a whisper-quiet mini PC with a very small footprint and the option to upgrade it down the line, the Elite EU715-AI could be worth the premium. This is especially true considering that memory prices aren't expected to settle until at least 2027, and may even increase further as the year goes on.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I hated the Mac mini M4’s power button until I accidentally proved Apple was right ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/i-hated-the-mac-mini-m4s-power-button-until-i-accidentally-proved-apple-was-right</link>
                                                                            <description>
                            <![CDATA[ The Mac mini M4’s oddly placed power button got a lot of heat at launch but I’ve come around to the idea of always leaving it on. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">DdMWuTiPbLb27USWhnhmfB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/TUpMErrBpjcZASartetyE8-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 17 Jan 2026 06:30:00 +0000</pubDate>                                                                                                                                <updated>Sat, 21 Mar 2026 23:24:13 +0000</updated>
                                                                                                                                            <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[Computing Peripherals]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/TUpMErrBpjcZASartetyE8-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Lifting the Mac mini M4 up in order to press its power button]]></media:description>                                                            <media:text><![CDATA[Lifting the Mac mini M4 up in order to press its power button]]></media:text>
                                <media:title type="plain"><![CDATA[Lifting the Mac mini M4 up in order to press its power button]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/TUpMErrBpjcZASartetyE8-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I was over the moon at the idea of a completely redesigned Mac mini in a much smaller case with a more powerful M4 chip. That was until Apple finally showed off its new design, revealing that, this time around, the power button on the <a href="https://www.tomsguide.com/computing/desktop-computers/mac-mini-m4-review">Mac mini M4</a> would be on the bottom instead of on the back of the device.</p><p>The Apple Magic Mouse with its <a href="https://www.tomsguide.com/computing/apple-desktops/apple-just-repeated-its-worst-design-mistake-in-the-last-20-years-the-m4-mac-mini-got-magic-moused">oddly placed charging port</a> immediately sprung to mind. At least with a wireless mouse though, you don’t have to plug it in all that often. Now with one of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a>, a power button is integral to their daily use. Apple on the other hand saw things quite differently.</p><p>Shortly after the Mac mini M4’s launch, Apple’s SVP of Worldwide Marketing Greg Joswiak and SVP of Hardware Engineering John Ternus explained in an interview with <a href="https://www.ithome.com/0/809/112.htm">IThome</a> that the underside of the Mac mini M4 was the “optimal spot” for its power button due to the redesign. At the same time, they also noted that most Mac users never actually <a href="https://www.tomsguide.com/phones/you-can-schedule-your-mac-to-turn-off-and-on-heres-how">turn their devices off</a>.</p><p>Although I used a Mac growing up and while in college, back when I reviewed the Mac mini M4, I had mostly been using Windows-based mini PCs. As such, I initially scoffed at the idea of never shutting down my computer and how Apple had practically made the device’s power button unreachable.</p><p>Now though, after using the Mac mini M4 for over a year I realized Apple just might have been right.</p><div class="product"><a data-dimension112="4bfb1d5e-7a2e-42b9-92bb-6aeda4146e14" data-action="Deal Block" data-label="Apple Mac mini M4 review" data-dimension48="Apple Mac mini M4 review" data-dimension25="$499" href="https://www.amazon.com/dp/B0DLBTPDCS" 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:39.87%;"><img id="GDTQJVDRrZzfsV3SQkfZB8" name="Apple Mac Mini M4 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GDTQJVDRrZzfsV3SQkfZB8.jpg" mos="" align="middle" fullscreen="" width="1500" height="598" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The base model Mac mini M4 is a big step up from its predecessor and provide more than enough power for most people. It comes with Apple’s powerful M4 chip, 16GB of RAM, and 256GB of storage. You also get plenty of ports in a tiny package with three Thunderbolt 4 ports, two USB-C ports, HDMI, and Ethernet.In our <a href="https://www.tomsguide.com/computing/desktop-computers/mac-mini-m4-review" data-dimension112="4bfb1d5e-7a2e-42b9-92bb-6aeda4146e14" data-action="Deal Block" data-label="Apple Mac mini M4 review" data-dimension48="Apple Mac mini M4 review" data-dimension25="$499">Apple Mac mini M4 review</a> we said the Editor's Choice machine is as close to perfect as it gets. <a class="view-deal button" href="https://www.amazon.com/dp/B0DLBTPDCS" target="_blank" rel="nofollow" data-dimension112="4bfb1d5e-7a2e-42b9-92bb-6aeda4146e14" data-action="Deal Block" data-label="Apple Mac mini M4 review" data-dimension48="Apple Mac mini M4 review" data-dimension25="$499">View Deal</a></p></div><h2 id="a-non-optional-accessory">A non-optional accessory</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xfj3p75rb3ziTy8EuGVNpj" name="Satechi Mac Mini M4 Stand and Hub-6" alt="Inserting an SD card into Satechi's hub and stand for the Mac mini M4" src="https://cdn.mos.cms.futurecdn.net/xfj3p75rb3ziTy8EuGVNpj.jpg" mos="" align="middle" fullscreen="" width="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>Just like when <a href="https://www.tomsguide.com/computing/desktop-computers/i-just-broke-the-first-rule-of-buying-apple-products-i-bought-a-new-mac-mini-ahead-of-the-m4-mac-launch">I spent a week testing out the Mac mini M2</a> ahead of the release of this updated model, the first accessory I added to the Mac mini M4 was a USB-C powered dock and stand. </p><p>I know most people are fine using Bluetooth accessories these days but since I’m constantly switching between computers, I actually prefer one of the <a href="https://www.tomsguide.com/best-picks/best-mechanical-keyboards">best mechanical keyboards</a> and a <a href="https://www.tomsguide.com/reference/what-is-a-trackball-mouse">trackball mouse</a> with 2.4 GHz USB receivers. With three USB-A ports on the front, I even have one left over to plug in a flash drive. Likewise, with an SD card reader on the left, it’s easy to quickly take photos off my camera.</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="8AZQt4Ky5MbJJCAc6VaR2n" name="Satechi Mac Mini M4 Stand and Hub-5" alt="The underside of the Satechi's hub and stand for the Mac mini M4 showing its braided USB-C cable and NVMe SSD slot" src="https://cdn.mos.cms.futurecdn.net/8AZQt4Ky5MbJJCAc6VaR2n.jpg" mos="" align="middle" fullscreen="" width="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/peripherals/i-added-satechis-new-usb-c-hub-and-stand-to-my-mac-mini-m4-and-its-the-perfect-upgrade">Satechi Mac Mini M4 Stand & Hub </a>also has another trick up its sleeve. When you flip it over, there’s a free slot where you can install up to a 4TB M.2 SSD. Doing so lets you get around paying the Apple Tax for extra storage. Also, thanks to the fact that the Mac mini M4 comes with 16GB of RAM as the new standard, you likely won’t have to jump up to an upgraded model since this accessory easily lets you add more storage space.</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="NP9dUKbVoFCw486fAx7Up5" name="Satechi Mac Mini M4 Stand and Hub-4" alt="A picture showing how Satechi's hub and stand for the Mac mini M4 allows you to easily reach its power button" src="https://cdn.mos.cms.futurecdn.net/NP9dUKbVoFCw486fAx7Up5.jpg" mos="" align="middle" fullscreen="" width="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 big problem the Satechi Stand & Hub solves is that you can now easily reach the Mac mini M4’s power button. Without it, you’d have to awkwardly tilt the device over on your desk anytime you wanted to power it back on after a shutdown.</p><p>Although I haven’t stopped using this accessory with my Mac mini M4 for over a year now, the cutout at the back isn’t the killer feature I initially thought it would be.</p><div class="product"><a data-dimension112="f46dd48b-2ffa-4f2f-a3df-c6ebd4195a2e" data-action="Deal Block" data-label="Designed to perfectly match your Mac mini M4, this aluminum hub and stand adds three USB-A ports, an SD card reader and there’s even a slot on the bottom for a M.2 NVMe drive to boost your Mac’s storage. There’s a braided USB-C cable on the back to plug it into your computer and a cutout on the back left that lets you easily reach your Mac mini M4’s power button." data-dimension48="Designed to perfectly match your Mac mini M4, this aluminum hub and stand adds three USB-A ports, an SD card reader and there’s even a slot on the bottom for a M.2 NVMe drive to boost your Mac’s storage. There’s a braided USB-C cable on the back to plug it into your computer and a cutout on the back left that lets you easily reach your Mac mini M4’s power button." data-dimension25="$99" href="https://www.amazon.com/Satechi-Stand-Enclosure-10Gbps-Reader/dp/B0DV6WJ88D" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="ZbxVvnQynCoQHyKRPhBaEW" name="satechi-mac-mini-hub-and-stand-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ZbxVvnQynCoQHyKRPhBaEW.jpg" mos="" align="middle" fullscreen="" width="3000" height="3000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Designed to perfectly match your Mac mini M4, this aluminum hub and stand adds three USB-A ports, an SD card reader and there’s even a slot on the bottom for a M.2 NVMe drive to boost your Mac’s storage. There’s a braided USB-C cable on the back to plug it into your computer and a cutout on the back left that lets you easily reach your Mac mini M4’s power button. <a class="view-deal button" href="https://www.amazon.com/Satechi-Stand-Enclosure-10Gbps-Reader/dp/B0DV6WJ88D" target="_blank" rel="nofollow" data-dimension112="f46dd48b-2ffa-4f2f-a3df-c6ebd4195a2e" data-action="Deal Block" data-label="Designed to perfectly match your Mac mini M4, this aluminum hub and stand adds three USB-A ports, an SD card reader and there’s even a slot on the bottom for a M.2 NVMe drive to boost your Mac’s storage. There’s a braided USB-C cable on the back to plug it into your computer and a cutout on the back left that lets you easily reach your Mac mini M4’s power button." data-dimension48="Designed to perfectly match your Mac mini M4, this aluminum hub and stand adds three USB-A ports, an SD card reader and there’s even a slot on the bottom for a M.2 NVMe drive to boost your Mac’s storage. There’s a braided USB-C cable on the back to plug it into your computer and a cutout on the back left that lets you easily reach your Mac mini M4’s power button." data-dimension25="$99">View Deal</a></p></div><h2 id="powered-on-and-forgotten">Powered on and forgotten</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QmjZCJY7EmTEVJPLPFiCn3" name="Mac mini M4--1-LEDE" alt="A desk setup built around the Mac mini M4 with an Apple Studio Display on an all wooden desk" src="https://cdn.mos.cms.futurecdn.net/QmjZCJY7EmTEVJPLPFiCn3.jpg" mos="" align="middle" fullscreen="" width="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>Even though I still think the Mac mini M4 is the best mini PC for most people and especially for Apple users, I’ve been using it less lately so that I can spend my time testing and reviewing other, Windows-based mini PCs. </p><p>When OpenAI rolled out its <a href="https://www.tomsguide.com/computing/browsers/i-just-tried-chatgpt-atlas-as-a-long-time-chrome-user-heres-what-i-love-and-hate">ChatGPT Atlas</a> browser back in October of last year though, I was tasked with installing it and doing a hands-on. Since it was Mac-only at that time, I got it up and running on my Mac mini M4. Now if I had one of the <a href="https://www.tomsguide.com/best-picks/best-macbook">best MacBooks </a>on hand, it would have been a lot easier taking pictures of this new AI-powered browser running on a Mac. Instead, I ended up putting a new <a href="https://www.tomsguide.com/computing/i-revamped-my-desk-setup-using-the-worlds-most-expensive-cable-management-accessory-this-changes-everything">desk setup</a> together just to do so.</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="LRPq82kxbdSLaLVTUEQo99" name="Mac mini M4--2" alt="The Mac mini M4 with Satechi's Hub & Stand installed underneath it on a wooden desk" src="https://cdn.mos.cms.futurecdn.net/LRPq82kxbdSLaLVTUEQo99.jpg" mos="" align="middle" fullscreen="" width="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>To Apple’s credit, when I was done, I didn’t shut down the Mac mini M4. Instead, I let it go into sleep mode and that was that. Much to my surprise though, when I returned from <a href="https://www.tomsguide.com/tech-events/weirdest-gadgets-of-ces-2026">CES 2026</a> last week, I saw its status light was still on. After a few taps on my keyboard, it instantly sprung back to life, completely oblivious to the fact that I had left it powered on for almost three months.</p><p>It was at that moment that it dawned on me, maybe Apple was right. With a new puppy in our game room sleeping where I previously worked, I’ve found myself working from the Mac mini M4 in the next room and letting it fall asleep on its own each night for the past week. </p><p>I think what surprised me the most though is that besides that small white indicator light, I wouldn’t have known Apple’s mini PC was sleeping as it’s completely quiet when doing so and it isn't a light sleeper like some of the Windows-based mini PCs I’ve tested and reviewed. It doesn’t “wake up” for updates or from overly sensitive peripherals. </p><p>Even when my son would bump into my desk when running over to check on the puppy, the Mac mini M4 never stirred. That was until I started typing on the keyboard in front of it.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eMwQ6O"></div>                            </div>                            <script src="https://kwizly.com/embed/eMwQ6O.js" async></script><h2 id="from-hidden-to-essential">From hidden to essential</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3886px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bgV8MxVxvAZTpiRJahz6X8" name="Orico Mini Pro-1" alt="Accessing the Mac mini M4's power button with the computer inside the Orico MiniPro Dock Case" src="https://cdn.mos.cms.futurecdn.net/bgV8MxVxvAZTpiRJahz6X8.jpg" mos="" align="middle" fullscreen="" width="3886" height="2186" attribution="" endorsement="" class="inline"></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 that I fully understand Apple’s reasoning with the Mac mini M4’s power button placement, I’d still like to see some changes with the <a href="https://www.tomsguide.com/computing/mini-pcs/mac-mini-with-m5-and-m5-pro-just-tipped-to-launch-this-year-heres-what-we-know">Mac mini M5</a> or whatever comes next. Instead of tucking it away on the underside of the device, what if Apple actually made it useful?</p><p>After reviewing the <a href="https://www.tomsguide.com/computing/mini-pcs/i-tried-this-ai-powered-mini-pc-for-a-week-and-this-unique-feature-earned-it-a-permanent-spot-on-my-desk">MSI Cubi NUC AI+ 2MG</a> and loving the fingerprint scanner integrated into its power button, I’d love to see Apple do something similar with the next Mac mini. Right now, if you want to use Touch ID to do things like log in, use Apple Pay, install new software or buy apps from the Mac App Store, your only option is to purchase a <a href="https://www.tomsguide.com/news/apple-just-made-its-best-mac-keyboard-available-to-buy-separately">Magic Keyboard with Touch ID</a> separately. But imagine how much more useful this functionality would be if it was built right into your Mac?</p><p>Even if Apple doesn’t want to give up the biggest selling point of its most expensive keyboard, there are other ways the Mac mini’s power button could be useful. Given that we’re getting an upgraded and more intelligent <a href="https://www.tomsguide.com/ai/apple-intelligence/apples-big-siri-overhaul-looks-set-for-spring-2026-heres-what-itll-be-able-to-do">Siri</a> soon, imagine if a short press of the power button could bring that up while a long press could be used to shutdown your computer. The possibilities are really almost endless once you bring short, long and even double presses into the mix.</p><p>It might have taken me over a year, but now, I finally understand why Apple compromised with the placement of the Mac mini M4’s power button. I’d say I was going to shut down my computer now but given that it’s been on for months, I guess I’ll just step away from my keyboard and let it drift off to sleep.</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/peripherals/i-tried-satechis-new-mechanical-keyboard-with-the-mac-mini-m4-and-it-puts-apples-magic-keyboard-to-shame">I tried this new mechanical keyboard with the Mac mini M4 and it puts Apple’s Magic Keyboard to shame</a></li><li><a href="https://www.tomsguide.com/computing/apple-desktops/mac-mini-m4-reasons-to-buy-and-skip">Mac mini M4 — 4 reasons to buy and 3 reasons to skip</a></li><li><a href="https://www.tomsguide.com/computing/peripherals/i-gave-my-mac-mini-m4-the-ultimate-upgrade-with-this-mac-pro-style-case-and-it-fixes-some-of-my-biggest-complaints">I gave my Mac mini M4 the ultimate upgrade with this Mac Pro-style case and it fixes some of my biggest complaints</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'This is going to be a challenging year': Framework just raised the price of its desktops by up to $460 due to RAM crisis, and it will go higher ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/desktop-computers/this-is-going-to-be-a-challenging-year-framework-just-raised-the-price-of-its-desktops-by-up-to-usd460-due-to-ram-crisis-and-it-will-go-higher</link>
                                                                            <description>
                            <![CDATA[ Due to the ongoing RAM crisis, Framework is now forced to raise the price of its desktops by up to $460. Here's everything you need to know. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4cWcVcTmeX6wBt84toiaJX</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ayvLTyKxGU7kcqHKjz2zYn-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 13 Jan 2026 15:30:37 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Desktop Computers]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                                                                <author><![CDATA[ tony.polanco@futurenet.com (Tony Polanco) ]]></author>                    <dc:creator><![CDATA[ Tony Polanco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/atzRNqFt5wYgEUPBDahWsD.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ayvLTyKxGU7kcqHKjz2zYn-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Framework Desktop on a desk]]></media:description>                                                            <media:text><![CDATA[The Framework Desktop on a desk]]></media:text>
                                <media:title type="plain"><![CDATA[The Framework Desktop on a desk]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ayvLTyKxGU7kcqHKjz2zYn-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/computing/ram-prices-are-exploding-heres-why-and-everything-you-need-to-know-about-surviving-ramageddon">RAMageddon</a> strikes again, as Framework is increasing desktop prices by up to $460. The company had already raised laptop prices in recent weeks, so it was inevitable that its desktops would be affected. </p><p>“We held off on it as long as we could,” said Framework in a <a href="https://frame.work/at/de/blog/updates-on-memory-pricing-and-navigating-the-volatile-memory-market" target="_blank">blog post</a>, “but with LPDDR5x memory prices from our suppliers continuing to increase rapidly, we've had to update the pricing on Framework Desktop systems and Mainboards.”</p><p>Framework says that the prices of 128GB parts have spiked the most, with costs now going up by up to $460, as mentioned above. However, the company will honor the original pricing for existing pre-orders. </p><p>\And this might be a small consolation, but the price of rigs with 32GB and 64GB of RAM will only go up by $40 each. The company claims that the <a href="https://frame.work/products/framework-desktop-mainboard-amd-ryzen-ai-max-300-series?v=FRAFMK0002" target="_blank">32GB Framework Desktop Mainboard</a> is cheaper than building your own desktop PC from <a href="https://pcpartpicker.com/user/nrp/saved/#view=jKDmFT" target="_blank">parts with similar performance</a>.</p><h2 id="a-rough-year-ahead">A rough year ahead</h2><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="zYfuzCGiEbJ4C4QXZSGf4Q" name="Framework Desktop Review-3" alt="Customizing the front panel of the Framework Desktop with custom tiles" src="https://cdn.mos.cms.futurecdn.net/zYfuzCGiEbJ4C4QXZSGf4Q.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Framework says it has limited price increases to only cover the cost increase of RAM from its suppliers, and is using "Weighted Average Cost" of inventory to accommodate the volatility in RAM purchase prices. “We will continue to do everything we can to make our computers accessible during this time, and we'll keep you informed throughout,” said Framework.</p><p>That last statement is accurate, as Framework has indeed continued updating the original blog post whenever it has raised prices. The transparency is welcome, as it means customers won’t be blindsided by price hikes from the company.</p><div><blockquote><p>We will continue to do everything we can to make our computers accessible during this time</p><p>Framework</p></blockquote></div><p>Given how some industry experts <a href="https://www.tomsguide.com/computing/theres-just-not-enough-supply-to-go-around-micron-believes-ram-shortage-wont-improve-until-2028-at-least-until-the-ai-demand-starts-to-fade-away">don’t expect the RAM situation to stabilize until 2028</a>, we’re going to hear more stories like this throughout 2026. If you’re a tech enthusiast like me, then this year is going to be rough.</p><p>It’ll be interesting to see how much higher component prices will go before customers decide it’s not worth upgrading their computers. I don’t know about you, but I certainly don’t plan to purchase any PC parts unless it’s an emergency. I suspect this will be common throughout 2026.</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/2026-will-be-the-year-of-the-laptop-but-will-they-actually-be-affordable">I think 2026 will be a breakout year for laptops and a brutal one for buyers</a></li><li><a href="https://www.tomsguide.com/computing/gaming-laptops/asus-rog-zephyrus-g14-with-intel-panther-lake-and-no-nvidia-gpu-was-real-and-we-saw-it-heres-what-happened">The strange disappearance of the Asus ROG Zephyrus G14 with Intel Panther Lake and integrated graphics</a></li><li><a href="https://www.tomsguide.com/computing/gaming-laptops/i-just-tested-lenovos-legion-pro-rollable-concept-and-now-my-gaming-laptop-feels-boring">I just tested Lenovo’s Legion Pro Rollable concept, and now my gaming laptop feels boring</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve always wanted a keyboard with a computer inside and HP finally made one I’d want to use ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/ive-always-wanted-a-keyboard-with-a-computer-inside-and-hp-finally-made-one-id-want-to-use</link>
                                                                            <description>
                            <![CDATA[ HP’s EliteBoard G1a takes the keyboard-PC from hobbyist novelty to mainstream workhorse and it’s the upgrade I’ve been waiting for. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">DbW4tmezSy3xSL8cTEJzH6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EyugyuymyTFbCd2kmwHCnj-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 12 Jan 2026 12:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/EyugyuymyTFbCd2kmwHCnj-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A person holding the EliteBoard G1a keyboard-PC with an HP logo in the background]]></media:description>                                                            <media:text><![CDATA[A person holding the EliteBoard G1a keyboard-PC with an HP logo in the background]]></media:text>
                                <media:title type="plain"><![CDATA[A person holding the EliteBoard G1a keyboard-PC with an HP logo in the background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EyugyuymyTFbCd2kmwHCnj-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>While one of the <a href="https://www.tomsguide.com/computing/laptops/best-laptops">best laptops</a> will certainly do the job for most people, I’ve always found them limiting. From their non-modular designs to the constant worry of keeping a battery topped off, I prefer to work on a desktop whenever possible.</p><p>In fact, I’ve gone so far as to bring one of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a> with me when I travel, and more recently, I ditched my laptop entirely for a <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">pocketable mini PC and a pair of AR glasses</a>. The catch is that I still have to bring a keyboard. But what if I didn’t?</p><p>The <a href="https://www.tomsguide.com/news/new-raspberry-pi-400-revealed-and-its-stuffed-inside-a-keyboard">Raspberry Pi 400</a> was the first device to truly put the keyboard-PC back on the map. At less than $100, you aren't paying a premium for the form factor, but being limited to ARM-based Linux meant it could never be my daily driver for work.</p><p>HP recently showed off its new EliteBoard G1a, which feels much better suited for a mainstream audience as it offers a full <a href="https://www.tomsguide.com/face-off/windows-11-home-vs-windows-11-pro">Windows 11 Pro</a> experience that easily fits in a backpack. After going hands-on with it, I think I’m finally one step closer to leaving my mini PC behind and just working from a keyboard — even if the dream isn't quite perfect yet.</p><h2 id="finally-a-pro-level-keyboard-pc">Finally, a pro-level keyboard-PC</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5364px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dHyNMoTTbzDSshjMCqQuQC" name="HP Eliteboard G1A-4" alt="A side view of the HP EliteBoard G1a keyboard-PC showing off its side vents and USB-C ports" src="https://cdn.mos.cms.futurecdn.net/dHyNMoTTbzDSshjMCqQuQC.jpg" mos="" align="middle" fullscreen="" width="5364" height="3017" attribution="" endorsement="" class="inline"></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 first glance, the HP EliteBoard G1a doesn’t look that different from any other keyboard you’d find in an office setting, as it has a full-size layout with a numpad on the right. It’s only when you see it from the side that you notice the laptop-like vents and two USB-C ports on the top left corner. </p><p>On the version I saw, these were the only two ports on the device — one is a high-speed <a href="https://www.tomsguide.com/news/usb4">USB4</a> port and the other is USB 3.2 Gen 2.</p><p>What surprised me most about the EliteBoard G1a is that both of these ports are capable of video out. With one of the <a href="https://www.tomsguide.com/best-picks/best-monitors">best monitors</a> that has at least 65W of USB-C Power Delivery, you can actually run a <a href="https://www.tomsguide.com/computing/i-ditched-my-ultrawide-display-for-this-dual-monitor-setup-heres-what-happened">dual-monitor setup</a> right from the keyboard. This effectively turns your display into a docking station, leaving your desk completely clutter-free.</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:5914px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="3Fkbz67QKHThKfocnwXzKQ" name="HP Eliteboard G1A-3" alt="The underside of the HP EliteBoard G1a keyboard-PC showing off its cooling vents" src="https://cdn.mos.cms.futurecdn.net/3Fkbz67QKHThKfocnwXzKQ.jpg" mos="" align="middle" fullscreen="" width="5914" height="3327" attribution="" endorsement="" class="inline"></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 you flip the EliteBoard G1a over, the cooling vents reveal its true nature. Powered by an <a href="https://www.tomsguide.com/computing/amd-joins-the-copilot-pc-race-to-beat-macbooks-with-ryzen-ai-300-series-while-extending-desktop-lead-with-9000-cpu">AMD Ryzen AI 300 Series</a> processor with up to Radeon 860M graphics, it’s a legitimate powerhouse. </p><p>Beyond standard office work, it’s equipped to handle creative apps like Photoshop and even light gaming — tasks that would bring a Raspberry Pi 400 to its knees.</p><p>The device can also be outfitted with an optional 32Wh internal battery. This isn’t meant for working on the go with a portable monitor; instead, like with the <a href="https://www.tomsguide.com/computing/desktop-computers/khadas-mind-review">Khadas Mind</a> mini PC, it’s designed to let you move from one desk to another without shutting down or rebooting.</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:5733px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ncFTFRunHtdiGaSa7UeWCX" name="HP Eliteboard G1A-2" alt="A closeup shot showing the numpad and the power button of the HP EliteBoard G1a keyboard-PC" src="https://cdn.mos.cms.futurecdn.net/ncFTFRunHtdiGaSa7UeWCX.jpg" mos="" align="middle" fullscreen="" width="5733" height="3225" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Even the power button feels "Elite." A solid white LED means it’s powered on, while a blinking light indicates Modern Standby — ready to wake up with a single tap. You can even opt for a version with an integrated fingerprint sensor for Windows Hello, so you can securely login as you’re powering up the device.</p><p>During my hands-on time, the experience was snappy and, more importantly, practically silent. An HP rep explained that it’s tuned to stay at or below 38dB, backed by a TÜV certification for low noise. For a moment there, I almost forgot there was a whole computer underneath my fingers.</p><h2 id="close-but-it-doesn-t-quite-track">Close but it doesn't quite track</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="6nsRfEtVCziJuE9PpETwci" name="HP Eliteboard G1A-5" alt="A wide shot of the HP EliteBoard G1a keyboard-PC showing the device plugged in next to the included and pre-paired wireless mouse" src="https://cdn.mos.cms.futurecdn.net/6nsRfEtVCziJuE9PpETwci.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I was quite impressed with the EliteBoard G1a, but it isn’t without its shortcomings, the most significant of which is the numpad on the right. If you’re an accountant or a real number cruncher, you probably need those keys, but for the rest of us, it feels like wasted space. </p><p>A trackpad would be a whole lot more useful for a device meant to be a portable all-in-one. HP is actually exploring adding a trackpad version to the EliteBoard G1a lineup, but in the meantime, the device at least comes with a pre-paired wireless mouse to bridge the gap.</p><p>As someone who couldn’t imagine working without one of the <a href="https://www.tomsguide.com/best-picks/best-mechanical-keyboards">best mechanical keyboards</a>, the real deal-breaker for me is the typing experience. To achieve that ultra-thin 12mm profile, the EliteBoard G1a features a low-profile scissor-switch membrane keyboard instead of true mechanical switches. </p><p>The silver lining is that the design is remarkably modular; the keyboard deck is spill-resistant and easy to replace if it gets damaged or if you accidentally douse it in coffee.</p><p>If the EliteBoard G1a had mechanical keyswitches and a trackpad on the right, it would be the perfect device for me, especially given how much power that AMD Ryzen AI 300 chip packs into such a tiny form factor. Unfortunately, it’s currently designed for business users where a quiet membrane keyboard is par for the course.</p><p>Now that HP has shown you can cram a powerful Windows 11 computer into a keyboard, I'm hopeful other PC makers will follow suit. Here’s to hoping one of them decides to go all-in on the premium typing experience and gives us a keyboard-PC with both mechanical switches and a trackpad.</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/peripherals/i-finally-added-a-nas-to-my-home-network-and-i-cant-believe-i-waited-this-long">I finally added a NAS to my home network, and I can’t believe I waited this long</a></li><li><a href="https://www.tomsguide.com/opinion/im-glad-i-knew-these-5-things-before-buying-a-mini-pc">The 5 things I'm glad I knew before buying a mini PC</a></li><li><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">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</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just went hands-on with Lenovo’s new mini PC, and the Yoga Mini i could be the perfect companion for your desk ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/i-just-went-hands-on-with-lenovos-new-mini-pc-and-the-yoga-mini-i-could-be-the-perfect-companion-for-your-desk</link>
                                                                            <description>
                            <![CDATA[ The Lenovo Yoga Mini i shuns the typical mini PC design for a circular case, but its interactive AI features and other extras really make it stand out. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">whwCY3E6nMtjPfCQmoCECQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/VSMTZqCB82tdnrMLhxmtbW-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 07 Jan 2026 09:49:12 +0000</pubDate>                                                                                                                                <updated>Wed, 07 Jan 2026 09:51:33 +0000</updated>
                                                                                                                                            <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/VSMTZqCB82tdnrMLhxmtbW-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Lenovo Yoga Mini i mini PC on a table]]></media:description>                                                            <media:text><![CDATA[The Lenovo Yoga Mini i mini PC on a table]]></media:text>
                                <media:title type="plain"><![CDATA[The Lenovo Yoga Mini i mini PC on a table]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/VSMTZqCB82tdnrMLhxmtbW-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Lenovo Yoga Mini i is an absolutely tiny mini PC in a puck-shaped chassis that still manages to pack a serious performance punch thanks to the inclusion of <a href="https://www.tomsguide.com/computing/cpus/intel-unleashes-14-panther-lake-cpus-heres-what-to-expect-from-the-new-core-ultra-3-chips">Intel’s new Core Ultra Series 3</a> chips. However, it has quite a few tricks up its sleeve that could easily earn it a place amongst the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a>.</p><p>Unveiled during <a href="https://www.tomsguide.com/news/live/ces-2026-live-latest-news">CES 2026</a>, this is the second mini PC from Lenovo’s Yoga line, and as such, it sports the same aluminum finish from the company’s premium line of consumer laptops. Despite its small size, Lenovo has outfitted the Yoga Mini i with an excellent selection of rear ports, but there are also a few handy ports on the side.</p><p>I briefly went hands-on with the Yoga Mini i at CES, but its unique form factor immediately made it stand out. However, it wasn’t until I learned more about this mini PC that its unique design and built-in AI capabilities truly clicked.</p><p>Here are my initial thoughts on the Yoga Mini i and why I think it just might be the perfect desktop companion.</p><h2 id="lenovo-yoga-mini-i-hands-on-review-specs">Lenovo Yoga Mini i hands-on review: Specs</h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$699 (starting)</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Intel Core Ultra Series 3</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Intel Arc Graphics</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>Up to 32GB LPDDR5X</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>Up to 2TB </p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1 x USB-A, 2 x USB-C (one with 100W PD-in), 2 x Thunderbolt 4, 1 x 2.5G Ethernet, 1 x 3.5mm headphone jack </p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 7, Bluetooth 6.0</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>5.12 x 5.12 x 1.91 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.32 pounds</p></td></tr></tbody></table></div><h2 id="lenovo-yoga-mini-i-price-and-availability">Lenovo Yoga Mini i: Price and availability</h2><p>The Lenovo Yoga Mini i will have a starting price of $699 and is expected to launch in June 2026. However, we’ll likely learn more about other, more powerful configurations of this mini PC and what they’ll cost when we get closer to its release this summer.</p><h2 id="lenovo-yoga-mini-i-design">Lenovo Yoga Mini i: 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:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="QKNX52NPjM985UFEkWWudj" name="Lenovo-Yoga-Mini-05" alt="The side ports on the Lenovo Yoga Mini i" src="https://cdn.mos.cms.futurecdn.net/QKNX52NPjM985UFEkWWudj.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>At 5.12 x 5.12 x 1.91 inches, the Yoga Mini i is slightly larger as well as slightly shorter than Apple’s Mac mini M4 and it also features a case that’s made from aluminum. However, its round form factor instantly sets it apart, especially among other rectangular mini PCs.</p><p>On the front, the Yoga logo is visible in the center with two holes for its built-in microphone above, and the Lenovo logo is etched onto the top of its case. Conveniently, on the side of the Yoga Mini i, there’s a Thunderbolt 4 port along with a 3.5mm combo headphone and microphone jack.</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:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="PxMoqrSGyTuRbhCpaKRje3" name="Lenovo-Yoga-Mini-06" alt="The rear ports on the Lenovo Yoga Mini i" src="https://cdn.mos.cms.futurecdn.net/PxMoqrSGyTuRbhCpaKRje3.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Then around back, there’s a single USB-A port, an HDMI 2.1 port, two USB-C ports — one of which is used to power the device with 100W PD-in — a second Thunderbolt 4 port and a 2.5 Gigabit Ethernet port. This is quite a lot of ports for a device this size, given the limitations that come with using a rounded case instead of a rectangular one.</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:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="Gp9g5jBKP7kRcNEwyZoaEA" name="Lenovo-Yoga-Mini-04" alt="A person holding the Lenovo Yoga Mini i showing off the underside of this mini PC" src="https://cdn.mos.cms.futurecdn.net/Gp9g5jBKP7kRcNEwyZoaEA.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When you flip the Yoga Mini i over, there’s a small stand on the bottom of the device with a rubber ring that wraps all the way around to keep it firmly planted on your desk. Then above that, there are circular holes all the way around this mini PC, which serve a dual purpose. Not only do they provide ventilation as part of their 360-degree airflow system, but they also provide audio output from the Yoga Mini i’s built-in speaker.</p><p>It’s clear a lot of thought went into the design of this mini PC, but as I said before, it has a few more tricks up its sleeve.</p><h2 id="lenovo-yoga-mini-i-qira-and-wi-fi-sensing">Lenovo Yoga Mini i: Qira and Wi-Fi sensing</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5327px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="C2CyYy9viB59uSFf67tzBF" name="Lenovo-Yoga-Mini-03" alt="An overhead view of the Lenovo Yoga Mini i mini PC on a table" src="https://cdn.mos.cms.futurecdn.net/C2CyYy9viB59uSFf67tzBF.jpg" mos="" align="middle" fullscreen="" width="5327" height="2996" attribution="" endorsement="" class="inline"></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 first went hands-on with the Yoga Mini i, Lenovo hadn’t announced its new Qira AI Assistant yet. However, when I went and checked it out again after the announcement, I finally saw the full picture.</p><p>At first glance, the Yoga Mini i looks just like one of the <a href="https://www.tomsguide.com/us/best-smart-speakers,review-4480.html">best smart speakers</a> and it actually kind of is, in a sense. Although you can bring up Lenovo’s new AI assistant from within Windows, you can also tap on the top of the Yoga Mini i to do so as well. While I haven’t gotten a chance to try this out yet, I can already see how useful this could be when working at your desk. </p><p>In addition to opening Qira, you can also tap the top of this mini PC to share files and to turn its RGB underglow light on or off. Speaking of its built-in lighting, you can also have this light sync to music playing from its built-in speaker.</p><p>For its final trick, Lenovo has equipped this mini PC with Wi-Fi sensing capabilities. By constantly monitoring how its wireless signals reflect off of walls and furniture, the Yoga Mini i can detect when a large physical object like a person walks in front of 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:4096px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="e9SoxwQN9BZeECfqsr7EgN" name="IMG_20260106_192209667" alt="Customizing the RGB lighting and lighting effects of the Lenovo Yoga Mini i using Lenovo's AI Turbo Engine app" src="https://cdn.mos.cms.futurecdn.net/e9SoxwQN9BZeECfqsr7EgN.jpg" mos="" align="middle" fullscreen="" width="4096" height="2304" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>By opening the Lenovo AI Turbo Engine app, I was able to customize the color of the Yoga Mini i’s underglow light and pick from several different lighting effects. After setting the light’s color to red and the lighting effect to breathing, I stepped away from the device, and the instant I was back in front of it, it greeted me with a cool little light show.</p><p>Now I don’t know how useful this will be on an everyday basis yet, but I’m excited to try this out for myself in my full review later this year. However, I can already imagine using this feature to quickly see if my PC is still on when I come back into the room.</p><h2 id="lenovo-yoga-mini-i-performance-and-in-use">Lenovo Yoga Mini i: Performance and in use</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4951px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="Qm5HoeZdNergi99TinG99V" name="Lenovo-Yoga-Mini-02" alt="A person placing finger on the Lenovo Yoga Mini i's power button which has a built-in fingerprint reader" src="https://cdn.mos.cms.futurecdn.net/Qm5HoeZdNergi99TinG99V.jpg" mos="" align="middle" fullscreen="" width="4951" height="2784" attribution="" endorsement="" class="inline"></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 I mentioned before, I was only able to briefly go hands-on with the Yoga Mini i, and I won’t know how well it actually performs until we get one into our testing lab. Still, it was quiet, apps opened quickly and it didn’t feel sluggish at all, likely because it’s rocking one of Intel’s new Core Ultra Series 3 chips.</p><p>I can already see myself using this device as my next mini PC, with it front and center on my desk. I really like how there’s a fingerprint reader integrated into its power button, as this will let me quickly log into Windows without having to enter a PIN. Likewise, I won’t have to plug in a pair of speakers to listen to music or to watch videos and its built-in microphone will probably work in a pinch for meetings, though it will probably be more useful for using Lenovo’s Qira AI assistant.</p><p>Even though the Yoga Mini i is small enough to fit in your pocket, it can actually drive up to four high-resolution displays thanks to its dual Thunderbolt 4 ports, HDMI 2.1 port and high-speed USB-C port that supports video out. I’ll have to try this out for myself, but from what I’ve seen so far, the Yoga Mini i already looks like an impressive mini PC.</p><h2 id="lenovo-yoga-mini-i-hands-on-review-outlook">Lenovo Yoga Mini i hands-on review: Outlook</h2><p>The Lenovo Yoga Mini i is far from your typical mini PC, for better or worse. You can’t mount it behind a monitor and I doubt you’ll easily be able to open it up to add another SSD or to swap out its RAM. However, if you’re after a smaller device with a unique design and more than a few features you won’t find anywhere else. </p><p>I’m looking forward to putting the Yoga Mini i through its paces and using it as my daily driver later this year. Hopefully Qira is as impressive as Lenovo has made it out to be but even if it’s not, this sleek mini PC certainly stands out from the crowd. Either way, stay tuned for my full review.</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/peripherals/i-saw-satechis-new-thunderbolt-5-cubedock-at-ces-and-it-felt-like-i-was-holding-a-mac-mini-m4">I saw Satechi’s new Thunderbolt 5 CubeDock at CES and it felt like I was holding a Mac mini M4</a></li><li><a href="https://www.tomsguide.com/opinion/im-glad-i-knew-these-5-things-before-buying-a-mini-pc">The 5 things I'm glad I knew before buying a mini PC</a></li><li><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">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</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 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 ]]></title>
                                                                                                                                                                                                <link>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</link>
                                                                            <description>
                            <![CDATA[ By combining the Khadas Mind 2S with a pair of AR glasses, I created a one-of-a-kind setup that’s as great for working at home as it is for traveling. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">i3dhp9tfvbP38xapq6JeLY</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/bdvf9EiZnYPSSXhktkXvf8-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 30 Dec 2025 07:15:00 +0000</pubDate>                                                                                                                                <updated>Tue, 30 Dec 2025 07:45:46 +0000</updated>
                                                                                                                                            <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/bdvf9EiZnYPSSXhktkXvf8-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A person using the Khadas Mind 2S mini PC with AR glasses at a desk]]></media:description>                                                            <media:text><![CDATA[A person using the Khadas Mind 2S mini PC with AR glasses at a desk]]></media:text>
                                <media:title type="plain"><![CDATA[A person using the Khadas Mind 2S mini PC with AR glasses at a desk]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/bdvf9EiZnYPSSXhktkXvf8-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I never thought I’d head out for a trip and leave my laptop behind, but after spending a year with my <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">pocketable mini PC and AR glasses setup</a>, I finally did.</p><p>Don’t get me wrong, one of the <a href="https://www.tomsguide.com/computing/laptops/best-laptops">best laptops</a> is a much better fit for most people, but then again, I’m not most people. While I love my <a href="https://www.tomsguide.com/opinion/i-love-my-desktop-but-this-thinkpad-convinced-me-to-give-laptops-a-second-chance">trusty ThinkPad</a>, I rarely use it. It’s a great machine, but I’ve been spoiled by my <a href="https://www.tomsguide.com/computing/i-revamped-my-desk-setup-using-the-worlds-most-expensive-cable-management-accessory-this-changes-everything">home office desk setup</a>.</p><p>Being able to write stories like this one with a <a href="https://www.tomsguide.com/computing/i-ditched-my-ultrawide-display-for-this-dual-monitor-setup-heres-what-happened">dual-monitor</a> or even a <a href="https://www.tomsguide.com/computing/i-thought-putting-together-a-triple-monitor-setup-would-be-hard-but-i-did-it-with-three-budget-monitors-and-a-mini-pc">triple-monitor setup</a> gives me more than enough screen real estate for multiple Chrome windows with at least half a dozen tabs open in each one. I also love the feeling of having a <a href="https://www.tomsguide.com/computing/keyboards/i-tried-this-mechanical-keyboard-with-a-built-in-pointing-stick-and-it-almost-convinced-me-to-ditch-my-mouse">mechanical keyboard</a> under my fingers as opposed to the membrane-style ones you find on most laptops. Then I have my <a href="https://www.tomsguide.com/reference/what-is-a-trackball-mouse">trackball mouse</a> with customizable buttons which gives me improved accuracy while putting less strain on my wrist.</p><p>I tried everything to recreate that experience on the road — including using a <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">dual-screen portable monitor</a> — but it wasn’t until I first put on a pair of AR glasses that things finally clicked. Then it just came down to finding one of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a> that was small enough and could be powered by USB-C to bring the whole setup together.</p><p>I did just that at the beginning of this year. At that time, it was just a proof of concept. However, in the months since, I’ve put it to the test while traveling and now, it’s found a permanent place in my carry-on. Here’s how this unconventional combo went from a wild experiment to my biggest surprise of the year.</p><div class="product"><a data-dimension112="5961ffec-9f66-4805-b47b-7e3f978d41fb" data-action="Deal Block" data-label="This pocketable and modular mini PC packs a ton of power into a tiny package. The Mind 2S is powered by an Intel Core Ultra 7 255 H processor, comes with 64GB of LPDDR5X RAM and has a 2TB SSD. It also features a built-in battery for when you want to move from one desk to another without having to shut down your computer and on the bottom, there’s a spare M.2 expansion slot if you want to add even more storage." data-dimension48="This pocketable and modular mini PC packs a ton of power into a tiny package. The Mind 2S is powered by an Intel Core Ultra 7 255 H processor, comes with 64GB of LPDDR5X RAM and has a 2TB SSD. It also features a built-in battery for when you want to move from one desk to another without having to shut down your computer and on the bottom, there’s a spare M.2 expansion slot if you want to add even more storage." data-dimension25="$1599" href="https://www.amazon.com/Khadas-Mind-Mini-Battery%EF%BD%9COnly-435g%EF%BD%9CThunderbolt/dp/B0DWJSPPXF?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1377px;"><p class="vanilla-image-block" style="padding-top:47.64%;"><img id="h5oxK64XFoSp8zSHammYR" name="51ewpC6EtvL._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/h5oxK64XFoSp8zSHammYR.jpg" mos="" align="middle" fullscreen="" width="1377" height="656" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This pocketable and modular mini PC packs a ton of power into a tiny package. The Mind 2S is powered by an Intel Core Ultra 7 255 H processor, comes with 64GB of LPDDR5X RAM and has a 2TB SSD. It also features a built-in battery for when you want to move from one desk to another without having to shut down your computer and on the bottom, there’s a spare M.2 expansion slot if you want to add even more storage.<a class="view-deal button" href="https://www.amazon.com/Khadas-Mind-Mini-Battery%EF%BD%9COnly-435g%EF%BD%9CThunderbolt/dp/B0DWJSPPXF?th=1" target="_blank" rel="nofollow" data-dimension112="5961ffec-9f66-4805-b47b-7e3f978d41fb" data-action="Deal Block" data-label="This pocketable and modular mini PC packs a ton of power into a tiny package. The Mind 2S is powered by an Intel Core Ultra 7 255 H processor, comes with 64GB of LPDDR5X RAM and has a 2TB SSD. It also features a built-in battery for when you want to move from one desk to another without having to shut down your computer and on the bottom, there’s a spare M.2 expansion slot if you want to add even more storage." data-dimension48="This pocketable and modular mini PC packs a ton of power into a tiny package. The Mind 2S is powered by an Intel Core Ultra 7 255 H processor, comes with 64GB of LPDDR5X RAM and has a 2TB SSD. It also features a built-in battery for when you want to move from one desk to another without having to shut down your computer and on the bottom, there’s a spare M.2 expansion slot if you want to add even more storage." data-dimension25="$1599">View Deal</a></p></div><h2 id="from-my-pocket-to-the-plane">From my pocket to the plane</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vwHRxJSD9c6Er7HsCyhMrP" name="Khadas Mind-9.jpg" alt="Slipping the Khadas Mind mini PC into a pocket" src="https://cdn.mos.cms.futurecdn.net/vwHRxJSD9c6Er7HsCyhMrP.jpg" mos="" align="middle" fullscreen="" width="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>Back in 2024, I reviewed the <a href="https://www.tomsguide.com/computing/desktop-computers/khadas-mind-review">Khadas Mind</a> mini PC. Unlike the <a href="https://www.tomsguide.com/computing/desktop-computers/mac-mini-m4-review">Mac mini M4</a> or the <a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/geekom-a9-max-review">Geekom A9 Max</a> though, the Khadas Mind mini PC looks more like a portable hard drive and is small enough to slip into a pocket. </p><p>While the original was impressive, I used the newer, more powerful Khadas Mind 2S for this project. My favorite feature is that it offers full-sized ports — including Thunderbolt 4, USB4, HDMI, and two USB-A ports — so I don't have to lug around separate dongles.</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="kgfdp8RLpzMr8seu87XWiK" name="Khadas Mind x Xreal One-6-LEDE" alt="The Xreal One AR glasses next to the Ugreen Nexode Power Bank and the Khadas Mind 2S on a desk" src="https://cdn.mos.cms.futurecdn.net/kgfdp8RLpzMr8seu87XWiK.jpg" mos="" align="middle" fullscreen="" width="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>Since the Mind 2S (and the Mind) can be powered via USB-C, I’m not tethered to a wall outlet. I can use a standard <a href="https://www.tomsguide.com/computing/peripherals/this-gan-charger-let-me-finally-ditch-my-bulky-laptop-charger-and-its-43-off-right-now">GaN charger</a> or even a high-capacity power bank for a truly mobile workstation. For my display, I use a pair of <a href="https://www.tomsguide.com/computing/vr-ar/xreal-one-ar-glasses-review">Xreal One</a> AR glasses. They have built-in speakers and an ultrawide mode that recreates the side-by-side window experience I love so much with my <a href="https://www.tomsguide.com/opinion/i-switched-monitors-instead-of-upgrading-my-gpu-for-smoother-gameplay-heres-what-happened">ultrawide monitor</a> at home.</p><p>After testing this unique setup out around my home, it was time for my first real test: a trip to NYC for the unveiling of the <a href="https://www.tomsguide.com/gaming/gaming-peripherals/i-tried-the-nintendo-switch-2-pro-controller-and-it-adds-the-one-feature-ive-always-wanted">Nintendo Switch 2</a>. Much to my surprise, after going hands on with Nintendo’s latest console, I managed to write my <a href="https://www.tomsguide.com/gaming/nintendo/nintendo-switch-2-review">entire hands-on review</a> with this mini PC and AR glasses combo.</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="3oFg4yjHhGhwCpoPmX3CX9" name="Khadas Mind x Xreal One-7" alt="Using the Khadas Mind 2S and the Xreal One AR glasses on a tray table on an airplane" src="https://cdn.mos.cms.futurecdn.net/3oFg4yjHhGhwCpoPmX3CX9.jpg" mos="" align="middle" fullscreen="" width="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>Even more surprisingly, I was able to fit my wireless mechanical keyboard, mini trackball mouse, and the rest of this setup on an airplane tray table with everything powered by my Ugreen Nexode Power Bank. Since I managed to pull that off and loved working from my hotel with this mini PC and AR glasses combo, I decided to put my setup to the true test by bringing it with me on an international trip.</p><div class="product"><a data-dimension112="2a089cf7-a573-4e2a-ac40-68fc6f0f1c68" data-action="Deal Block" data-label="This massive power bank comes with enough power to fast charge your laptop at up to 140 watts but it can charge three devices simultaneously. There’s a color display on the front that lets you know how much battery you have left as well as how much power each of the devices you have connected to it are currently using. The Ugreen Nexode Power Bank is also flight-approved which means you can bring it on your next trip without getting hassled by airport security." data-dimension48="This massive power bank comes with enough power to fast charge your laptop at up to 140 watts but it can charge three devices simultaneously. There’s a color display on the front that lets you know how much battery you have left as well as how much power each of the devices you have connected to it are currently using. The Ugreen Nexode Power Bank is also flight-approved which means you can bring it on your next trip without getting hassled by airport security." data-dimension25="$79" href="https://www.amazon.com/dp/B0CXHM5RY2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1050px;"><p class="vanilla-image-block" style="padding-top:136.67%;"><img id="aXNqfDQC5jJ6aMBGayr6X7" name="61PvNe5awFL._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/aXNqfDQC5jJ6aMBGayr6X7.jpg" mos="" align="middle" fullscreen="" width="1050" height="1435" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This massive power bank comes with enough power to fast charge your laptop at up to 140 watts but it can charge three devices simultaneously. There’s a color display on the front that lets you know how much battery you have left as well as how much power each of the devices you have connected to it are currently using. The Ugreen Nexode Power Bank is also flight-approved which means you can bring it on your next trip without getting hassled by airport security. <a class="view-deal button" href="https://www.amazon.com/dp/B0CXHM5RY2" target="_blank" rel="nofollow" data-dimension112="2a089cf7-a573-4e2a-ac40-68fc6f0f1c68" data-action="Deal Block" data-label="This massive power bank comes with enough power to fast charge your laptop at up to 140 watts but it can charge three devices simultaneously. There’s a color display on the front that lets you know how much battery you have left as well as how much power each of the devices you have connected to it are currently using. The Ugreen Nexode Power Bank is also flight-approved which means you can bring it on your next trip without getting hassled by airport security." data-dimension48="This massive power bank comes with enough power to fast charge your laptop at up to 140 watts but it can charge three devices simultaneously. There’s a color display on the front that lets you know how much battery you have left as well as how much power each of the devices you have connected to it are currently using. The Ugreen Nexode Power Bank is also flight-approved which means you can bring it on your next trip without getting hassled by airport security." data-dimension25="$79">View Deal</a></p></div><h2 id="ready-for-prime-time">Ready for prime time</h2><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="cc9oPGsvCg5xxJsD9wakKb" name="Computex 2025" alt="Computex 2025" src="https://cdn.mos.cms.futurecdn.net/cc9oPGsvCg5xxJsD9wakKb.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>Although CES in Las Vegas is the go-to show for new tech and futuristic concepts every year, <a href="https://www.tomsguide.com/computing/best-of-computex-2024-awards">Computex</a> in Taiwan is just as impressive. Instead of being in the city of lights with all that glitz, you’re at the heart of where your favorite laptops, monitors, and gadgets actually get made. For that reason, myself and the rest of the Tom’s Guide computing team have been traveling halfway across the world to see the action in person for the last few years.</p><p>This year, in addition to my laptop (just in case), I also decided to bring my mini PC and AR glasses setup, and I’m glad I did. When I’m out on the show floor, I like to travel light as there’s plenty of walking between the two exhibition halls — TaiNEX 1 and TaiNEX 2 — that make up the Taipei Nangang Exhibition Center. Lugging around a laptop means I need a larger bag, but with the Khadas Mind 2S and the rest of the accessories in my setup, I was able to fit everything plus my camera into a much smaller bag.</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:3028px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="pRrBfiPqnjrcSBcNW2NAjF" name="Mini PC + AR Glasses Travel Edition-2" alt="The Khadas Mind 2S mini PC in hand with a wireless mechanical keyboard and a trackball mouse" src="https://cdn.mos.cms.futurecdn.net/pRrBfiPqnjrcSBcNW2NAjF.jpg" mos="" align="middle" fullscreen="" width="3028" height="1703" attribution="" endorsement="" class="inline"></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 was time to update the live blog or work on a story, I headed to the press room and got to work. As you can see in the picture above, I have the Mind 2S plugged into a <a href="https://www.tomsguide.com/computing/peripherals/this-robot-gan-charger-is-one-of-my-favorite-gadgets-of-2024-and-it-just-got-a-big-upgrade">Ugreen Nexode GaN charger</a>, with the other USB-C port connected to my Xreal One AR glasses. On the table, I have plenty of room for my slim mechanical keyboard and my mini trackball mouse, the Elecom Bitra.</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:2786px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fZLrWypGJg4K9y8CFkN8uL" name="Mini PC + AR Glasses Travel Edition-5" alt="A person working on a mini PC with AR glasses at Computex in Taiwan" src="https://cdn.mos.cms.futurecdn.net/fZLrWypGJg4K9y8CFkN8uL.jpg" mos="" align="middle" fullscreen="" width="2786" height="1567" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Given that my colleagues and I sometimes have to divide and conquer at a big show, I found the Adaptive-Transparency Mode on the Xreal One AR glasses incredibly useful. By default, the shortcut button on top of the right temple is set to switch to Transparency Mode, which turns off the display so I can see my surroundings. This let me keep working while remaining aware of my team, including if someone had just walked into the room.</p><p>Sure, I did get some looks in the press room at Computex, but they weren’t the typical ones I’d get when using a setup like this in public. Instead, everyone was curious about the gear, and I even had a local Taiwanese reporter come up and interview me about it on video. At the end of the day, I’m glad I brought it to Taiwan and plan on doing the same for CES 2026 next week.</p><div class="product"><a data-dimension112="7dd04d21-0e99-409f-ba66-5806e7936bd6" data-action="Deal Block" data-label="These AR glasses feature dual 0.68 micro OLED displays that can put up to a 147 inch screen right in front of your face with a 50 degree field of view. The built-in X1 chip lets you access menus and switch between 3 Degrees of Freedom tracking so that you can have a picture anchored in place or smoothly following your head movements. The Xreal One glasses also have built-in speakers from Bose on either side so you don’t need to use headphones with them. The best part though is that you just plug them into a compatible USB-C equipped device to get started." data-dimension48="These AR glasses feature dual 0.68 micro OLED displays that can put up to a 147 inch screen right in front of your face with a 50 degree field of view. The built-in X1 chip lets you access menus and switch between 3 Degrees of Freedom tracking so that you can have a picture anchored in place or smoothly following your head movements. The Xreal One glasses also have built-in speakers from Bose on either side so you don’t need to use headphones with them. The best part though is that you just plug them into a compatible USB-C equipped device to get started." data-dimension25="$449" href="https://www.amazon.com/XREAL-Glasses-Renowned-Adjustable-Transparency/dp/B0DNFFXG65" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1417px;"><p class="vanilla-image-block" style="padding-top:73.47%;"><img id="xuo4YJrdKLTDKTtkqcoi99" name="Xreal One" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xuo4YJrdKLTDKTtkqcoi99.jpg" mos="" align="middle" fullscreen="" width="1417" height="1041" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>These AR glasses feature dual 0.68 micro OLED displays that can put up to a 147 inch screen right in front of your face with a 50 degree field of view. The built-in X1 chip lets you access menus and switch between 3 Degrees of Freedom tracking so that you can have a picture anchored in place or smoothly following your head movements. The Xreal One glasses also have built-in speakers from Bose on either side so you don’t need to use headphones with them. The best part though is that you just plug them into a compatible USB-C equipped device to get started.<a class="view-deal button" href="https://www.amazon.com/XREAL-Glasses-Renowned-Adjustable-Transparency/dp/B0DNFFXG65" target="_blank" rel="nofollow" data-dimension112="7dd04d21-0e99-409f-ba66-5806e7936bd6" data-action="Deal Block" data-label="These AR glasses feature dual 0.68 micro OLED displays that can put up to a 147 inch screen right in front of your face with a 50 degree field of view. The built-in X1 chip lets you access menus and switch between 3 Degrees of Freedom tracking so that you can have a picture anchored in place or smoothly following your head movements. The Xreal One glasses also have built-in speakers from Bose on either side so you don’t need to use headphones with them. The best part though is that you just plug them into a compatible USB-C equipped device to get started." data-dimension48="These AR glasses feature dual 0.68 micro OLED displays that can put up to a 147 inch screen right in front of your face with a 50 degree field of view. The built-in X1 chip lets you access menus and switch between 3 Degrees of Freedom tracking so that you can have a picture anchored in place or smoothly following your head movements. The Xreal One glasses also have built-in speakers from Bose on either side so you don’t need to use headphones with them. The best part though is that you just plug them into a compatible USB-C equipped device to get started." data-dimension25="$449">View Deal</a></p></div><h2 id="leaving-my-laptop-behind">Leaving my laptop behind </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RwbPbHjFceEobsZBuwjS2Z" name="ThinkPad X13 Gen 4 on table outside.jpg" alt="ThinkPad X13 Gen 4 on wood table outside" src="https://cdn.mos.cms.futurecdn.net/RwbPbHjFceEobsZBuwjS2Z.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Shortly after I returned from Taiwan this summer, my family and I had a trip planned to the south of Texas. In the rush to pack, I still had a bit of unfinished work to attend to. For a moment, I thought about slipping my laptop into my backpack but then it hit me: I didn’t need to.</p><p>Instead, I packed the Khadas Mind 2S, the Xreal One AR glasses, my low-profile mechanical keyboard, and my mini trackball mouse. I only had to catch up on a few things before I could fully enjoy the trip, and I knew this setup would be more than enough. After checking into the hotel and putting my little one down for the night, I got everything set up and got to work.</p><p>While everyone else slept, I sat in the armchair in my hotel room and managed to clear every remaining item off my list. What I really loved about using AR glasses instead of a laptop is that there wasn’t a glow from a screen that might wake up my son. In fact, besides the moment I took the glasses off my face, the entire room remained completely dark.</p><p>In the end, what began as an experiment just to see if it was possible turned into one of my favorite setups of the year. If I hadn’t tried out the original Khadas Mind, I never would have thought of it. </p><p>I don’t know what next year will hold or what new setups I’ll have a chance to build, but I know this mini PC and AR glasses combo is a winner I plan on using for years to come.</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/peripherals/i-finally-added-a-nas-to-my-home-network-and-i-cant-believe-i-waited-this-long">I finally added a NAS to my home network, and I can’t believe I waited this long</a></li><li><a href="https://www.tomsguide.com/opinion/im-glad-i-knew-these-5-things-before-buying-a-mini-pc">The 5 things I'm glad I knew before buying a mini PC</a></li><li><a href="https://www.tomsguide.com/computing/mini-pcs/i-tried-this-ai-powered-mini-pc-for-a-week-and-this-unique-feature-earned-it-a-permanent-spot-on-my-desk">I spent a week with this AI-powered mini PC and the buttons on the front earned it a permanent spot on my desk</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Skip the RGB Tax: boring is better value for money if you want a gaming PC ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/desktop-computers/skip-the-rgb-tax-boring-is-better-value-for-money-if-you-want-a-gaming-pc</link>
                                                                            <description>
                            <![CDATA[ As gaming desktops get more expensive, I'm on the hunt for ways to save yourself some more money. One tip is very clear: go boring. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">yLA3pS5Jt2JX6xpFVeWy74</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/2boVdSZndXCxy6FSETjfZA-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 22 Dec 2025 15:47:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Desktop Computers]]></category>
                                                    <category><![CDATA[PC Gaming]]></category>
                                                    <category><![CDATA[Gaming Desktops]]></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.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/2boVdSZndXCxy6FSETjfZA-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Dell Tower Plus]]></media:description>                                                            <media:text><![CDATA[Dell Tower Plus]]></media:text>
                                <media:title type="plain"><![CDATA[Dell Tower Plus]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/2boVdSZndXCxy6FSETjfZA-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Desktop PCs are getting expensive — you can thank <a href="https://www.tomsguide.com/news/live/ram-price-crisis-updates">the RAM pricing crisis</a> for that. But there are cost efficiencies you can make here and there to get a monster tower for cheaper. The answer? Go boring and ditch the RGB tax.</p><p>I’ve been testing the RTX 5080 version of the <a href="https://www.tomsguide.com/computing/gaming-desktops/dell-tower-plus-2025-review">Dell Tower Plus</a>, which my colleague Alex reviewed and gave 4 stars. One look at Dell’s website (U.K — no points for guessing where I'm from based on my last name), and <a href="https://www.dell.com/en-uk/shop/desktop-computers/dell-tower-plus-desktop/spd/dell-ebt2250-desktop" target="_blank" rel="nofollow">you’ll find it at £2,500.</a> To get a gamer-centric equivalent, the Alienware Aurora R16 with the same spec comes in <a href="https://www.dell.com/en-uk/shop/desktop-computers/alienware-aurora-gaming-desktop/spd/alienware-aurora-act1250-gaming-desktop/act1250_cto10?redirectto=SOC&configurationid=e7eb7cd1-6f2f-4d50-9d41-c7ef1c743e92" target="_blank" rel="nofollow">at well over £3,000</a>.</p><p>And the situation is similar in the U.S. too. The RTX 5060 Ti-armed version of the <a href="https://www.dell.com/en-us/shop/dell-desktop-computers/dell-tower-plus/spd/dell-ebt2250-desktop" target="_blank" rel="nofollow">Dell Tower Plus costs $1,769</a> to the <a href="https://www.dell.com/en-us/shop/cty/pdp/spd/alienware-aurora-act1250-gaming-desktop" target="_blank" rel="nofollow">$2,099 of the Aurora</a></p><p>So in a world where we’re all looking for ways to cut costs and get the maximum bang for our buck, I’m here to defend the dullness. While it’s not as clear cut when you get into the details (cooling being one particular example), it’s proving more cost-effective to get a more basic tower specced out the wazoo over a gaming beast. Let me explain.</p><h2 id="bland-is-the-brand">Bland is the brand</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/kg2UfnZJPfwiLyPWhr7HE4.jpg" alt="Dell Tower Plus" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ywbgcrQDN7rXKCcrmVMBR4.jpg" alt="Dell Tower Plus" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>The Dell Tower Plus is super unassuming — I mean look at it. As Alex said in his review, it is “a breath of forgettable fresh air,” and I agree. The aesthetic is basic and utilitarian in nature, and that’s A-OK with me.</p><p>Now, don’t get me wrong. I am a sucker for good RGB and well-presented components through a tempered glass side (you’ll see as much in Terry the Tom’s Guide test bench). But given the chances your tower will go underneath your desk, all that pizazz would just be wasted on illuminating the floor.</p><p>Instead, this low-key look just kind of fades into the background of your desk nicely, while also keeping its considerable power a secret. Honestly, I’m here for it.</p><h2 id="near-parity-for-less">Near-parity for less</h2><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="TaZ2kCH92LH542RQ3YfXGF" name="Cyberpunk 2077" alt="Cyberpunk 2077" src="https://cdn.mos.cms.futurecdn.net/TaZ2kCH92LH542RQ3YfXGF.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: Future)</span></figcaption></figure><p>And speaking of that “considerable power” I took a look inside to see an Intel Core Ultra 9 285K, 32GB of DDR5 RAM, 1TB of storage and an RTX 5080 GPU. All of it is popped onto a proprietary motherboard, which for those more confident, you could get into and tinker. But it’s meant to be for Dell only to touch under its warranty. This is the cost of affordability.</p><p>But the end result is seriously impressive performance that matches up to its gaming ilk while staying quiet (more on that in a second).</p><div ><table><thead><tr><th class="firstcol " ><p><strong>Benchmark</strong></p></th><th  ><p>Dell Tower Plus (Intel Core Ultra 9 285K, RTX 5080)</p></th><th  ><p>Dell Tower Plus (Intel Core Ultra 7, 265K, RTX 5070)</p></th><th  ><p>Alienware Aurora R16 (Intel Core Ultra 7 265KF, RTX 5070)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Geekbench 6 single-core</strong></p></td><td  ><p>3260</p></td><td  ><p>2985</p></td><td  ><p>3071</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 multi-core</strong></p></td><td  ><p>20596</p></td><td  ><p>19181</p></td><td  ><p>20010</p></td></tr><tr><td class="firstcol " ><p><strong>Blender GPU Benchmark average</strong></p></td><td  ><p>2726</p></td><td  ><p>1979</p></td><td  ><p>2086</p></td></tr></tbody></table></div><iframe allow="" height="600px" width="100%" id="" style="width:100%;height:600px;" data-lazy-priority="low" data-lazy-src="https://flo.uri.sh/visualisation/26909262/embed"></iframe><p>Another thing to point out is the cooling solution here. While the Alienware Aurora R16 does have an all-in-one cooler and a couple 120mm fans to keep everything tip top, the Dell Tower Plus has a far simpler cooling solution with a fan at the back and large CPU cooler.</p><p>When I took the side off and looked at the way it manages thermals, I was shocked by how quiet it had been the entire time. Not only that, but CPU and GPU temperatures never exceeded the maximum (160-degrees Fahrenheit) that we saw in testing the Alienware Aurora R16.</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:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="z2Sfrt87Uw8kYGkhsthqP4" name="Dell Tower Plus" alt="Dell Tower Plus" src="https://cdn.mos.cms.futurecdn.net/z2Sfrt87Uw8kYGkhsthqP4.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>As Alex said, this is “a wolf in corporate sheep’s clothing,” and Dell’s really thought about everything here.</p><h2 id="where-does-the-extra-money-go">Where does the extra money go?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="XbyRceiyn8hDj4vvdy7eL4" name="Dell Tower Plus" alt="Dell Tower Plus" src="https://cdn.mos.cms.futurecdn.net/XbyRceiyn8hDj4vvdy7eL4.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>When it comes to gaming pre-builts, the premium often comes in the flash of it all. The price of all those key components are all relatively fixed — you’re investing in three key things here:</p><ul><li>A fancy case: That unique, flashy case is usually designed and tooled to be eye-catching for gamers. If you don’t need that edginess, you can save some money.</li><li>The brand name: A brand like Alienware or Asus ROG carries a premium cost with it, so opting for Dell here may have chopped some change off the total price too.</li><li>Advanced (and often unnecessary) features: Outside of that premium lighting, you’ve got a more advanced cooling solution, too. But given temperatures weren’t that different at all, skipping it is another cost-saving measure you can make.</li></ul><p>That’s not to say this is all pointless. If you want the flashiness, go right ahead. I won’t deny gaming PCs look cool! But it’s a corner you can cut without sacrificing power but reducing the price you pay.</p><h2 id="should-you-play-it-safe-and-boring">Should you play it safe (and boring)?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="Z9LdwkiR2SSQZ2uFBCwgQ4" name="Dell Tower Plus" alt="Dell Tower Plus" src="https://cdn.mos.cms.futurecdn.net/Z9LdwkiR2SSQZ2uFBCwgQ4.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>So this is my case for choosing an office box over a spaceship — a boring desktop tower over the gaming PC. RG-be damned, because you could take that $200 saving, get yourself a 4K monitor like the <a href="https://www.newegg.com/gigabyte-m27up-sa-27-160hz-uhd-320hz-fhd-m-series-ips-black/p/N82E16824012106" target="_blank" rel="nofollow">Gigabyte M27UP</a> and make the most of that RTX 5080.</p><p>Are there downsides? Sure — the same issues you’d get with any pre-built. Lack of modular customizability and the use of proprietary parts being chief among them. </p><p>But as is becoming clear at the moment, <a href="https://www.tomsguide.com/computing/gaming-desktops/it-is-now-cheaper-to-buy-a-pre-built-gaming-pc-than-building-one-yourself-this-ram-price-crisis-is-only-going-to-get-worse-from-here">it’s now cheaper to go pre-built over building yourself</a> at the moment (thanks RAMageddon). And dodging the RGB-laden options is another way to save yourself some cash while still getting the same sustained performance.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/cpus/cpu-war-2026-intel-panther-lake-vs-snapdragon-x2-elite-vs-amd-gorgon-point">Intel Panther Lake vs Snapdragon X2 Elite vs AMD Gorgon Point — one chip is already pulling ahead in 2026's CPU war</a></li><li><a href="https://www.tomsguide.com/computing/gaming-laptops/lenovo-legion-5i-gen-10-review">I just tested my favorite new gaming laptop, and it’s not from Alienware, Asus or MSI</a></li><li><a href="https://www.tomsguide.com/computing/gpus/nvidia-rtx-60-series-in-early-2027-the-leak-sounds-huge-but-the-numbers-dont-add-up">Nvidia RTX 60-series in early 2027? The leak sounds huge, but the numbers don’t add up</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple is reportedly developing a 24-inch OLED iMac — what we know so far ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/apple-desktops/apple-is-reportedly-developing-a-24-inch-oled-imac-what-we-know-so-far</link>
                                                                            <description>
                            <![CDATA[ The move to OLED could come for Apple's all-in-one desktop, based on a new report. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ubTAWmaaw7WMrgvoEX3ZdZ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mCWPabfQWpMcYuHtwGDNJL-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 18 Dec 2025 18:39:22 +0000</pubDate>                                                                                                                                <updated>Thu, 18 Dec 2025 18:40:31 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ dave.leclair@futurenet.com (Dave LeClair) ]]></author>                    <dc:creator><![CDATA[ Dave LeClair ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/fyx7qYdxPMTNBhdnMfNmaB.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Dave LeClair is the Senior News Editor for Tom&#039;s Guide, keeping his finger on the pulse of all things technology. He loves taking the complicated happenings in the tech world and explaining why they matter. Whether Apple is announcing the next big thing in the mobile space or a small startup advancing generative AI, Dave will apply his experience to help you figure out what&#039;s happening and why it&#039;s relevant to your life.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before Tom&#039;s Guide, Dave worked for publications like PCMag, Pocket-lint, MUO, How-To Geek, Digital Trends, and others. He started writing about technology professionally for MUO in 2011 and hasn&#039;t looked back since. In addition to news, you can find reviews, how-to pieces, shopping guides, and many other types of content with Dave&#039;s name attached.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/mCWPabfQWpMcYuHtwGDNJL-1280-80.png">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[macOS Tahoe running on an iMac]]></media:description>                                                            <media:text><![CDATA[macOS Tahoe running on an iMac]]></media:text>
                                <media:title type="plain"><![CDATA[macOS Tahoe running on an iMac]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mCWPabfQWpMcYuHtwGDNJL-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There's been no shortage of rumors regarding Apple's next iMac. Shortly after a leak suggested that <a href="https://www.tomsguide.com/computing/apple-desktops/apple-is-reportedly-developing-an-imac-pro-powered-by-an-m5-max-chip">Apple would launch an all-in-one desktop with an M5 Max processor</a>, a new leak has emerged suggesting that Apple will switch to an OLED panel for the upcoming iMac.</p><p>Korean publisher <a href="https://www.thelec.kr/news/articleView.html?idxno=45518" target="_blank">The Elec</a> reports that Apple is planning an OLED iMac, which would be a significant departure from the IPS LCD panels currently used in iMac devices. Though if you've ever used the <a href="https://www.tomsguide.com/computing/apple-desktops/apple-imac-m4-review">latest iMac</a>, you know that Apple has made the most of that screen tech to create a solid-looking display, and I expect the company will do the same with its first OLED iMac.  </p><h3 class="article-body__section" id="section-what-we-know-about-the-new-imac-oled"><span>What we know about the new iMac OLED</span></h3><p>Apple is apparently asking Samsung and LG, companies it typically partners with to make displays for its devices, for information on meeting the specs Apple has put forth. </p><p>Presumably, the display makers will be able to handle what Apple wants, and then it'll be a matter of Apple getting quotes to determine which company can meet the demands for a better price.</p><p>And what are those specs? Fortunately, the leak from The Elec contains the specs Apple has requested: "The iMac OLED specifications recently requested by Apple are known to be 24 inches, 600 nits of brightness, and 218PPI (Pixels Per Inch) in pixels," reads the request reported by the Korean publication. </p><p>If the iMac with an OLED display comes out, it would improve the all-in-one computer's brightness. In fact, based on the specs Apple is looking for in the report, the screen could be up to 20% brighter than the existing 24-inch iMac.</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:4837px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="B7LXyPDHqBjD2zE973qXX4" name="IMG_2461.JPG" alt="iMac 2023" src="https://cdn.mos.cms.futurecdn.net/B7LXyPDHqBjD2zE973qXX4.jpg" mos="" align="middle" fullscreen="" width="4837" height="2721" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Before you get too excited, the report also suggests that because this is in the early stages, Apple won't finish the OLED iMac until 2027 or 2028, with a release window sometime after that. </p><p>The other bit of bad news is the 24-inch size mentioned in the specs. Apparently, Apple isn't looking into larger OLED displays for the iMac, as the OLED tech it's considering doesn’t support panels larger than 30 inches. If you've been holding out for a large iMac with an OLED, you might need to keep the hope burning for a while longer.</p><h3 class="article-body__section" id="section-macbook-pro-oled-up-first"><span>MacBook Pro OLED up first </span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6BAyYqjGxwaoY3PmXj2CoL" name="MacBook Pro 14 2024 M4-6.jpg" alt="MacBook Pro 14-inch (2024, M4) shown open on a table" src="https://cdn.mos.cms.futurecdn.net/6BAyYqjGxwaoY3PmXj2CoL.jpg" mos="" align="middle" fullscreen="" width="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>Apple has gradually started switching its devices to OLED, but it hasn't gone all-in yet. First, the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-announced">Apple Watch got the newer screen technology</a>. From there, Apple started adding OLED to its beloved iPhone and <a href="https://www.tomsguide.com/tablets/ipads/ill-only-read-comics-on-an-ipad-pro-oled-from-now-on-heres-why">iPad models</a>. </p><p>On the back of its smartphones, the Cupertino company is expected to put <a href="https://www.tomsguide.com/computing/macbooks/macbook-pro-m6-oled-rumors-everything-we-know-so-far">OLED screens on the MacBook Pro M6</a>. And it could also be the first MacBook with a touch screen display.</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/apples-iphone-roadmap-for-the-next-two-years-just-leaked-everything-you-need-to-know">Apple's iPhone roadmap for the next two years just leaked — everything you need to know</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-26-3-has-a-pleasant-surprise-in-the-form-of-an-updated-iphone-wallpaper-gallery-heres-whats-new">iOS 26.3 has a pleasant surprise in the form of an updated iPhone wallpaper gallery — here's what's new</a></li><li><a href="https://www.tomsguide.com/computing/massive-apple-leak-reveals-over-30-coming-products-iphone-fold-cheap-macbook-smart-glasses-airtag-2-and-more">Massive Apple leak reveals over 30 upcoming products — iPhone Fold, cheap MacBook, smart glasses, AirTag 2 and more</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple is reportedly developing an iMac Pro powered by an M5 Max chip ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/apple-desktops/apple-is-reportedly-developing-an-imac-pro-powered-by-an-m5-max-chip</link>
                                                                            <description>
                            <![CDATA[ A new code leak has reportedly revealed that Apple is working on an iMac Pro powered by an unannounced M5 Max chipset. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JjoKaxbJoaBgKQKFyUrgzU</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/tRhqCUeeXxnaJM4Nt8kdHd-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 17 Dec 2025 00:23:25 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple Desktops]]></category>
                                                    <category><![CDATA[Computing]]></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.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/tRhqCUeeXxnaJM4Nt8kdHd-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iMac Pro discontinued]]></media:description>                                                            <media:text><![CDATA[iMac Pro discontinued]]></media:text>
                                <media:title type="plain"><![CDATA[iMac Pro discontinued]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/tRhqCUeeXxnaJM4Nt8kdHd-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>This week, a massive code leak revealed <a href="https://www.tomsguide.com/computing/massive-apple-leak-reveals-over-30-coming-products-iphone-fold-cheap-macbook-smart-glasses-airtag-2-and-more"><u>more than 30 Apple devices</u></a> could debut in the next couple of years. Surprisingly, though, a separate code leak emerged shortly afterwards, revealing at least one more Apple product on the horizon. </p><p>Apple is reportedly developing a new iMac Pro featuring its M5 Max chipset, according to leaked internal software seen by <a href="https://www.macrumors.com/2025/12/16/apple-developing-imac-with-m5-max/"><u>MacRumors</u></a>. The massive leak was the result of a prototype of iOS 26 that was accidentally sold, which contained a “ kernel debug kit” used by Apple’s engineers. </p><p>Typically, these systems label unreleased Apple devices using codenames or platform names. Sometimes they also include secondary references to chipsets or marketing names. </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.20%;"><img id="n6wNQetob6YAa5F5sEibEC" name="Apple-M5-logo" alt="Apple M5 chip render" src="https://cdn.mos.cms.futurecdn.net/n6wNQetob6YAa5F5sEibEC.jpg" mos="" align="middle" fullscreen="" width="2000" height="1124" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Apple)</span></figcaption></figure><p>According to MacRumors, the software references an iMac codenamed J833c running platform H17C. H17C is a label associated with Sotra C, an alleged codename for the M5 Max chip. This line suggests that Apple is actively testing an iMac featuring the M5 Max.</p><p>There are other devices in the code like iPad minis running tvOS that are probably just used for internal Apple testing. However, the J833c codename <a href="https://www.tomsguide.com/computing/macbooks/apples-entire-mac-lineup-until-2026-revealed-in-leak-heres-every-macbook-mac-pro-and-more-to-expect"><u>appeared earlier this year</u></a> in a different leak.</p><p>That July leak revealed every Mac product that could launch in 2026, including a variety of MacBooks and Mac Studios. However, that leak only showed the iMac featuring a standard M5 chip.</p><p>The M5 Pro and Max chips are expected to debut in 2026, and there have been rumors of Apple developing a high-end “Pro” iMac <a href="https://www.tomsguide.com/news/imac-pro-2022-with-a-mini-led-display-could-arrive-in-june"><u>going all the way back to 2022</u></a>. Bloomberg’s Mark Gurman has reported a few times that Apple is working on an iMac with a bigger screen. </p><h2 id="other-macs">Other Macs</h2><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="AQuqnVrwnhZNhA8m3shFqb" name="M5 MacBook Pro" alt="M5 MacBook Pro" src="https://cdn.mos.cms.futurecdn.net/AQuqnVrwnhZNhA8m3shFqb.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: Apple)</span></figcaption></figure><p>Apparently, the leaked kit also confirmed a few other Mac devices that were highlighted in the July leak. It lists 14 and 16-inch MacBook Pros with M5 Pro and M5 Max chips, a 14-inch MacBook Pro featuring an M6 chip, and 14 and 16-inch MacBook Pro models with  M6 Pro and M6 Max chips. </p><p>Additionally, it also lists <a href="https://www.tomsguide.com/computing/macbooks/m5-macbook-air-reportedly-coming-spring-2026-plus-the-missing-macbook-pros-and-a-new-mac-mini"><u>13 and 15-inch M5 MacBook Air models</u></a>, an M5 and M5 Pro Mac mini, and new <a href="https://www.tomsguide.com/computing/cpus/next-mac-studio-with-m5-ultra-chip-set-to-be-apples-most-powerful-yet-heres-when-it-may-arrive"><u>Mac Studio models,</u></a> which could feature the M5 Ultra chip. The rumored <a href="https://www.tomsguide.com/computing/macbooks/cheap-macbook-a18-pro-everything-we-know-so-far"><u>budget-friendly MacBook</u></a> featuring an A18 Pro chip is also listed.</p><p>We’ll have to wait until next year to find out if some of these leaked Macs turn out to be real products, but for now, take all this info with a grain of salt. If you’re planning to upgrade to one of the <a href="https://www.tomsguide.com/best-picks/best-macbook"><u>best MacBooks,</u></a> though, it might be worth waiting until next year if you want a new laptop with a more powerful M5 Max or Ultra chip inside.</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/apples-iphone-roadmap-for-the-next-two-years-just-leaked-everything-you-need-to-know">Apple's iPhone roadmap for the next two years just leaked — everything you need to know</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-26-3-has-a-pleasant-surprise-in-the-form-of-an-updated-iphone-wallpaper-gallery-heres-whats-new">iOS 26.3 has a pleasant surprise in the form of an updated iPhone wallpaper gallery — here's what's new</a></li><li><a href="https://www.tomsguide.com/computing/massive-apple-leak-reveals-over-30-coming-products-iphone-fold-cheap-macbook-smart-glasses-airtag-2-and-more">Massive Apple leak reveals over 30 upcoming products — iPhone Fold, cheap MacBook, smart glasses, AirTag 2 and more</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Hurry! Huge iBuyPower sale knocks up to $600 off our favorite PCs ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/desktop-computers/hurry-huge-ibuypower-sale-knocks-up-to-usd600-off-our-favorite-pcs</link>
                                                                            <description>
                            <![CDATA[ iBuyPower is knocking up to $600 off select custom and prebuilt PCs. Here are some of the best PC deals we recommend ahead of the holidays. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">J2YtN3bmChLf93Htnd6Ebj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/2bcsRRsY5hPAAti5Jz2S2d-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 12 Dec 2025 21:48:35 +0000</pubDate>                                                                                                                                <updated>Fri, 12 Dec 2025 21:48:52 +0000</updated>
                                                                                                                                            <category><![CDATA[Desktop Computers]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                                                                <author><![CDATA[ louis.ramirez@futurenet.com (Louis Ramirez) ]]></author>                    <dc:creator><![CDATA[ Louis Ramirez ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oYF2xVwCb4pTGhAJi8Yqr5.jpeg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;As deals editor-in-chief at Tom’s Guide, Louis refuses to pay full price for anything. He has over 10 years of experience finding the best deals and coupons to bring readers. Louis price checks&amp;nbsp;against multiple retailers and searches high and low for sales on 4K TVs, Apple devices, streaming services, mattresses, kitchen appliances, and more.&amp;nbsp;He&#039;s also always looking for the the best coupon codes to turn good deals into stellar buys.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;He has covered major retail events like Amazon Prime Day, Black Friday, and Cyber Monday for more than a decade and knows how to spot an epic deal from a fake discount. He&#039;s also great at helping people negotiate better prices on everything from gym memberships to their home internet service. Louis&#039; work has also helped readers find PS5 restock, baby formula, Clorox wipes, and everything in between. For his next major purchase, Louis is hoping to find a killer deal on an M3-based Mac.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;A born-and-bred New Yorker, Louis is always in search of the perfect cup of coffee. On his free time, he enjoys swimming, running, and any workout that pushes his Apple Watch to the max. He&#039;s also a big fan of international films, horror movies, and K-dramas. His work has appeared on Gizmodo, CNET, Digital Trends, Dealnews, and Time Out New York.&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/2bcsRRsY5hPAAti5Jz2S2d-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iBuyPower Y60 desktop shown with monitor]]></media:description>                                                            <media:text><![CDATA[iBuyPower Y60 desktop shown with monitor]]></media:text>
                                <media:title type="plain"><![CDATA[iBuyPower Y60 desktop shown with monitor]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/2bcsRRsY5hPAAti5Jz2S2d-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>iBuyPower makes some of the <a href="https://www.tomsguide.com/us/best-gaming-pc,review-2219.html">best gaming PCs</a> on the market. Now that the holidays are approaching, I'm seeing epic discounts on some of our favorite iBuyPower PCs. </p><p>For example, right now you can get <a href="https://www.ibuypower.com/gaming-deals" target="_blank" rel="nofollow">from $50 to $600 off select iBuyPower PCs</a>. It's one of the biggest sales I've seen from iBuyPower and it includes some of our favorite rigs like the RDY Y70. Below I've rounded up some of my favorite deals in iBuyPower's holiday sale. (For more gift ideas and sales, check out our <a href="https://www.tomsguide.com/sales-events/the-ultimate-holiday-gift-guide-2025">holiday gift guide</a> and best <a href="https://www.tomsguide.com/sales-events/best-christmas-deals-of-2025-save-big-on-holiday-gifts">Christmas deals</a> roundup).</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong></strong><a href="https://www.ibuypower.com/gaming-deals" target="_blank" rel="nofollow"><strong>shop the entire iBuyPower holiday sale</strong></a><strong></strong></li><li><strong>RDY Scale Valorant R02 w/ RTX 5050: </strong><a href="https://www.ibuypower.com/store/rdy-scale-valorant-r02" target="_blank" rel="nofollow"><strong>was $1,299 now $1,149</strong></a><strong></strong></li><li><strong>RDY Element 9 Valorant R02 w/ RTX 5070: </strong><a href="https://www.ibuypower.com/store/rdy-element-9-valorant-r02" target="_blank" rel="nofollow"><strong>was $2,149 now $1,649</strong></a><strong></strong></li><li><strong>Y60 B02 w/ RTX 5070: </strong><a href="https://www.ibuypower.com/store/rdy-y60-b02" target="_blank" rel="nofollow"><strong>was $2,249 now $1,849</strong></a><strong></strong></li><li><strong>RDY Y70 Hoshimachi Suisei Edition w/ RTX 5070: </strong><a href="https://www.ibuypower.com/store/rdy-y70-hoshimachi-suisei-edition" target="_blank" rel="nofollow"><strong>was $2,199 now $1,899</strong></a><strong></strong></li><li><strong>iBuyPower RDY Y70 B01 w/ RTX 5070 Ti: </strong><a href="https://www.ibuypower.com/store/rdy-y70-b01" target="_blank" rel="nofollow"><strong>was $2,699 now $2,099</strong></a></li></ul><h3 class="article-body__section" id="section-best-ibuypower-deals"><span>Best iBuyPower Deals</span></h3><div class="product"><a data-dimension112="6168437d-b27f-43e0-98c1-d85b2d80a561" data-action="Deal Block" data-label="Save $150 on this desktop, which is great for the casual gamer who's just getting into PC gaming. It's got an AMD Ryzen 7 8700F CPU, 16GB of RAM, 1TB SSD, and an RTX 5050 GPU. It's got all the essentials you need and its price is kind on the wallet, too." data-dimension48="Save $150 on this desktop, which is great for the casual gamer who's just getting into PC gaming. It's got an AMD Ryzen 7 8700F CPU, 16GB of RAM, 1TB SSD, and an RTX 5050 GPU. It's got all the essentials you need and its price is kind on the wallet, too." data-dimension25="$1149" href="https://www.ibuypower.com/store/rdy-scale-valorant-r02" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="kM8TyTXQiVsUpoE6phBNUV" name="_0006_Ibuypower Desktop PC.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kM8TyTXQiVsUpoE6phBNUV.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Save $150 on this desktop, which is great for the casual gamer who's just getting into PC gaming. It's got an AMD Ryzen 7 8700F CPU, 16GB of RAM, 1TB SSD, and an RTX 5050 GPU. It's got all the essentials you need and its price is kind on the wallet, too. <a class="view-deal button" href="https://www.ibuypower.com/store/rdy-scale-valorant-r02" target="_blank" rel="nofollow" data-dimension112="6168437d-b27f-43e0-98c1-d85b2d80a561" data-action="Deal Block" data-label="Save $150 on this desktop, which is great for the casual gamer who's just getting into PC gaming. It's got an AMD Ryzen 7 8700F CPU, 16GB of RAM, 1TB SSD, and an RTX 5050 GPU. It's got all the essentials you need and its price is kind on the wallet, too." data-dimension48="Save $150 on this desktop, which is great for the casual gamer who's just getting into PC gaming. It's got an AMD Ryzen 7 8700F CPU, 16GB of RAM, 1TB SSD, and an RTX 5050 GPU. It's got all the essentials you need and its price is kind on the wallet, too." data-dimension25="$1149">View Deal</a></p></div><div class="product"><a data-dimension112="c3a356b4-5620-4874-a21b-935f2bd71a31" data-action="Deal Block" data-label="The Element 9 Valorat is the perfect gaming PC build for someone looking to upgrade their desktop computer system. It packs an AMD Ryzen 7 9700X CPU, 32GB of RAM, 2TB SSD, and an RTX 5070 GPU. That's enough horsepower for casual gaming, streaming, and video editing." data-dimension48="The Element 9 Valorat is the perfect gaming PC build for someone looking to upgrade their desktop computer system. It packs an AMD Ryzen 7 9700X CPU, 32GB of RAM, 2TB SSD, and an RTX 5070 GPU. That's enough horsepower for casual gaming, streaming, and video editing." data-dimension25="$1649" href="https://www.ibuypower.com/store/rdy-element-9-valorant-r02" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:573px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="2Y4EvNWxveKTtfwna7vQJY" name="iBUYPOWER Element SE" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2Y4EvNWxveKTtfwna7vQJY.jpg" mos="" align="middle" fullscreen="" width="573" height="573" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Element 9 Valorat is the perfect gaming PC build for someone looking to upgrade their desktop computer system. It packs an AMD Ryzen 7 9700X CPU, 32GB of RAM, 2TB SSD, and an RTX 5070 GPU. That's enough horsepower for casual gaming, streaming, and video editing. <a class="view-deal button" href="https://www.ibuypower.com/store/rdy-element-9-valorant-r02" target="_blank" rel="nofollow" data-dimension112="c3a356b4-5620-4874-a21b-935f2bd71a31" data-action="Deal Block" data-label="The Element 9 Valorat is the perfect gaming PC build for someone looking to upgrade their desktop computer system. It packs an AMD Ryzen 7 9700X CPU, 32GB of RAM, 2TB SSD, and an RTX 5070 GPU. That's enough horsepower for casual gaming, streaming, and video editing." data-dimension48="The Element 9 Valorat is the perfect gaming PC build for someone looking to upgrade their desktop computer system. It packs an AMD Ryzen 7 9700X CPU, 32GB of RAM, 2TB SSD, and an RTX 5070 GPU. That's enough horsepower for casual gaming, streaming, and video editing." data-dimension25="$1649">View Deal</a></p></div><div class="product"><a data-dimension112="8fe02b1a-d138-4016-89c1-f6fc9375915a" data-action="Deal Block" data-label="Go Pro or go home… or something. This beefy gaming PC is currently $400 off, so it’s well worth looking at. That RTX 5070 is ably supported by an Intel Core i9-14900KF CPU, 32GB of RAM, and a fairly spacious 2TB NVMe SSD." data-dimension48="Go Pro or go home… or something. This beefy gaming PC is currently $400 off, so it’s well worth looking at. That RTX 5070 is ably supported by an Intel Core i9-14900KF CPU, 32GB of RAM, and a fairly spacious 2TB NVMe SSD." data-dimension25="$1849" href="https://www.ibuypower.com/store/rdy-y60-b02" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="2CuCsa8SsZMA4CY6HCf6fm" name="iBuyPower Y40 Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2CuCsa8SsZMA4CY6HCf6fm.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Go Pro or go home… or something. This beefy gaming PC is currently $400 off, so it’s well worth looking at. That RTX 5070 is ably supported by an Intel Core i9-14900KF CPU, 32GB of RAM, and a fairly spacious 2TB NVMe SSD. <a class="view-deal button" href="https://www.ibuypower.com/store/rdy-y60-b02" target="_blank" rel="nofollow" data-dimension112="8fe02b1a-d138-4016-89c1-f6fc9375915a" data-action="Deal Block" data-label="Go Pro or go home… or something. This beefy gaming PC is currently $400 off, so it’s well worth looking at. That RTX 5070 is ably supported by an Intel Core i9-14900KF CPU, 32GB of RAM, and a fairly spacious 2TB NVMe SSD." data-dimension48="Go Pro or go home… or something. This beefy gaming PC is currently $400 off, so it’s well worth looking at. That RTX 5070 is ably supported by an Intel Core i9-14900KF CPU, 32GB of RAM, and a fairly spacious 2TB NVMe SSD." data-dimension25="$1849">View Deal</a></p></div><div class="product"><a data-dimension112="afdfebdc-2301-4bc0-9868-737dab0bb89c" data-action="Deal Block" data-label="GTA 6 probably won’t launch on Steam until 2027 (or beyond), yet in the here and now, you can enjoy amazing games like Cyberpunk 2077 at max settings at well over 60 FPS thanks to that 5070 GPU, AMD Ryzen 7 7800X3D CPU, and 32GB of RAM. 2TB of NVMe storage means you’ll have to be selective with the games you install, yet this is still an enticing deal when you consider the epic design." data-dimension48="GTA 6 probably won’t launch on Steam until 2027 (or beyond), yet in the here and now, you can enjoy amazing games like Cyberpunk 2077 at max settings at well over 60 FPS thanks to that 5070 GPU, AMD Ryzen 7 7800X3D CPU, and 32GB of RAM. 2TB of NVMe storage means you’ll have to be selective with the games you install, yet this is still an enticing deal when you consider the epic design." data-dimension25="$1899" href="https://www.ibuypower.com/store/rdy-y70-hoshimachi-suisei-edition" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:870px;"><p class="vanilla-image-block" style="padding-top:93.45%;"><img id="usJAh6T8iznFVAQFDnXFqV" name="iBuyPower RDY Y70 Hoshimachi Suisei Edition" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/usJAh6T8iznFVAQFDnXFqV.jpg" mos="" align="middle" fullscreen="" width="870" height="813" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>GTA 6 probably won’t launch on Steam until 2027 (or beyond), yet in the here and now, you can enjoy amazing games like Cyberpunk 2077 at max settings at well over 60 FPS thanks to that 5070 GPU, AMD Ryzen 7 7800X3D CPU, and 32GB of RAM. 2TB of NVMe storage means you’ll have to be selective with the games you install, yet this is still an enticing deal when you consider the epic design.<a class="view-deal button" href="https://www.ibuypower.com/store/rdy-y70-hoshimachi-suisei-edition" target="_blank" rel="nofollow" data-dimension112="afdfebdc-2301-4bc0-9868-737dab0bb89c" data-action="Deal Block" data-label="GTA 6 probably won’t launch on Steam until 2027 (or beyond), yet in the here and now, you can enjoy amazing games like Cyberpunk 2077 at max settings at well over 60 FPS thanks to that 5070 GPU, AMD Ryzen 7 7800X3D CPU, and 32GB of RAM. 2TB of NVMe storage means you’ll have to be selective with the games you install, yet this is still an enticing deal when you consider the epic design." data-dimension48="GTA 6 probably won’t launch on Steam until 2027 (or beyond), yet in the here and now, you can enjoy amazing games like Cyberpunk 2077 at max settings at well over 60 FPS thanks to that 5070 GPU, AMD Ryzen 7 7800X3D CPU, and 32GB of RAM. 2TB of NVMe storage means you’ll have to be selective with the games you install, yet this is still an enticing deal when you consider the epic design." data-dimension25="$1899">View Deal</a></p></div><div class="product"><a data-dimension112="88804d50-c04a-418f-bc91-295afab189a0" data-action="Deal Block" data-label="The RDY Y70 B01 is a serious gaming rig that makes no compromises. Inside you'll find a Core i9-14900KF CPU, 32GB of RAM, 2TB SSD, and RTX 5070 Ti GPU. It's a whopping $600 off, which is about as big a Christmas miracle as one could hope for." data-dimension48="The RDY Y70 B01 is a serious gaming rig that makes no compromises. Inside you'll find a Core i9-14900KF CPU, 32GB of RAM, 2TB SSD, and RTX 5070 Ti GPU. It's a whopping $600 off, which is about as big a Christmas miracle as one could hope for." data-dimension25="$2099" href="https://www.ibuypower.com/store/rdy-y70-b01" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:805px;"><p class="vanilla-image-block" style="padding-top:96.77%;"><img id="vkGFEHWz6okMm9oY3k9dcf" name="iBuyPower RDY Y70 B01" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vkGFEHWz6okMm9oY3k9dcf.jpg" mos="" align="middle" fullscreen="" width="805" height="779" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The RDY Y70 B01 is a serious gaming rig that makes no compromises. Inside you'll find a Core i9-14900KF CPU, 32GB of RAM, 2TB SSD, and RTX 5070 Ti GPU. It's a whopping $600 off, which is about as big a Christmas miracle as one could hope for. <a class="view-deal button" href="https://www.ibuypower.com/store/rdy-y70-b01" target="_blank" rel="nofollow" data-dimension112="88804d50-c04a-418f-bc91-295afab189a0" data-action="Deal Block" data-label="The RDY Y70 B01 is a serious gaming rig that makes no compromises. Inside you'll find a Core i9-14900KF CPU, 32GB of RAM, 2TB SSD, and RTX 5070 Ti GPU. It's a whopping $600 off, which is about as big a Christmas miracle as one could hope for." data-dimension48="The RDY Y70 B01 is a serious gaming rig that makes no compromises. Inside you'll find a Core i9-14900KF CPU, 32GB of RAM, 2TB SSD, and RTX 5070 Ti GPU. It's a whopping $600 off, which is about as big a Christmas miracle as one could hope for." data-dimension25="$2099">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Some of the best mini PCs we've tested are on sale after Black Friday: 9 deals I'd buy from $199 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/mini-in-size-mini-in-price-7-mini-pc-deals-id-shop-from-usd199-at-amazon-and-best-buy</link>
                                                                            <description>
                            <![CDATA[ Some of the best mini PCs we’ve tested are on sale after Black Friday! Check out the deals I recommend shopping from top brands like Mac and Geekom. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">jGqX9rB3WVMKBeVSG6Vdhg</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/fh3zYvcbSFNocTP8hGPtH5-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 09 Dec 2025 14:17:19 +0000</pubDate>                                                                                                                                <updated>Wed, 10 Dec 2025 17:30:52 +0000</updated>
                                                                                                                                            <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ millie.daviswilliams@futurenet.com (Millie Davis-Williams) ]]></author>                    <dc:creator><![CDATA[ Millie Davis-Williams ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/WU6pa7hKuxs5ScCoqcXYWA.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Millie is a Deals Editor at Tom&#039;s Guide specializing in tech deals content. Based in London, Millie has spent a lifetime stubbornly refusing to pay full price on any possible purchase. She has years of searching for the best discounts on the latest and greatest phones, TVs and gadgets under her belt, and knows how to sort the best deals from the rest. Helping readers save on the products they want is her mission, whether it’s an Apple Watch or a new tablet.&lt;/p&gt;&lt;p&gt;Since working at Tom’s Guide, Millie has covered retail events like Prime Day, Black Friday and Cyber Monday extensively, meaning she knows the products readers are looking for and the best times of year to hit “purchase.”&lt;/p&gt;&lt;p&gt;When she’s not looking for discounts, Millie covers news and writes how-to articles about everything from phones, streaming devices, and headphones to apps and video games.&lt;/p&gt;&lt;p&gt;In her spare time, Millie enjoys reading, gaming on her Nintendo Switch and creating digital art. She’s also a fan of watching Disney movies and collecting plush (the latter having totally taken over her bedroom.)&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/fh3zYvcbSFNocTP8hGPtH5-1280-80.jpg">
                                                            <media:credit><![CDATA[Geekom]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Geekom mini PC]]></media:description>                                                            <media:text><![CDATA[Geekom mini PC]]></media:text>
                                <media:title type="plain"><![CDATA[Geekom mini PC]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/fh3zYvcbSFNocTP8hGPtH5-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you haven’t stepped into the world of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a> yet, let me try and convert you. For those who are short on desk space, or those who want to travel without leaving their desktop computer behind, mini PCs are the way. And you don’t have to sacrifice on power, either — there are some strong components packed into these mini cases. </p><p>For example, you can get the excellent <a href="https://www.amazon.com/Apple-2024-Desktop-Computer-10%E2%80%91core/dp/B0DLBTPDCS" target="_blank" rel="nofollow">Mac mini M4 on sale for $479</a>. Sure, you have to supply your own monitor, keyboard and mouse, but this is an incredibly cheap way to get access to Apple’s powerful M4 chip and crush your everyday workload. We rank this as the best mini PC you can buy right now, too, so it’s a great one to upgrade to.</p><p>Keep scrolling to see all the mini PC deals I recommend buying ahead of the holidays. I also recommend checking out our <a href="https://www.tomsguide.com/coupons/amazon.com">Amazon promo codes </a>and the <a href="https://www.tomsguide.com/sales-events/these-are-the-best-lego-holiday-deals-15-sets-id-shop-with-up-to-49-percent-off">Lego deals I’d shop from $6 at Amazon</a>.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><a href="https://www.amazon.com/deals" target="_blank" rel="nofollow"><strong>shop all Amazon holiday deals</strong></a></li><li><strong>AceMagic Vista V1 (N150/16GB): </strong><a href="https://www.amazon.com/ACEMAGIC-V1-Computers-Desktop-Display/dp/B0DMCRSBNT" target="_blank" rel="nofollow"><strong>was $229 now $199</strong></a> <strong>[Prime member deal]</strong></li><li><strong>Kamrui E3B (Ryzen 7/32GB): </strong><a href="https://www.amazon.com/KAMRUI-E3B-Computers-Desktop-Computer/dp/B0FM7SXTNV" target="_blank" rel="nofollow"><strong>was $499 now $379</strong></a> <strong>[Prime member deal]</strong></li><li><strong>Geekom A5 (Ryzen 7/16GB): </strong><a href="https://www.bestbuy.com/product/geekom-a5-mini-pc-amd-ryzen-7-5825u-up-to-4-5ghz-16gb-ddr4-ram-512gb-m-2-pcie-nvme-ssd-windows-11-pro-pre-installed-rose-gold/J3GW668X3Y/sku/10152219" target="_blank" rel="nofollow"><strong>was $499 now $399</strong></a><strong></strong></li><li><strong>Mac mini (M4/16GB): </strong><a href="https://www.amazon.com/Apple-2024-Desktop-Computer-10%E2%80%91core/dp/B0DLBTPDCS" target="_blank" rel="nofollow"><strong>was $599 now $479</strong></a><strong></strong></li><li><strong>AceMagic W1 (Ryzen 7/32GB): </strong><a href="https://www.amazon.com/dp/B0FX2RKYZ8" target="_blank" rel="nofollow"><strong>was $759 now $519</strong></a></li><li><strong>AceMagic Mini Gaming PC (i9/32GB): </strong><a href="https://www.amazon.com/dp/B0FQJL21TD" target="_blank" rel="nofollow"><strong>was $856 now $599</strong></a></li><li><strong>GMKtec EVO-T1 (Ultra 9/64GB): </strong><a href="https://www.amazon.com/GMKtec_ultra_285h_ai_mini_pc_evo_t1/dp/B0FH4NZ6DX" target="_blank" rel="nofollow"><strong>was $1,299 now $949</strong></a></li></ul><h3 class="article-body__section" id="section-best-mini-pc-deals"><span>Best mini PC deals</span></h3><div class="product"><a data-dimension112="a1a5c618-1545-46a0-a60a-b7588abfbb6b" data-action="Deal Block" data-label="This mini PC from Acemagic is dirt cheap, but you still get 16GB RAM and 512GB storage. The Intel N150 processor means it won't win any performance contests, but it should handle everyday computing tasks just fine. While we haven't tested this model ourselves, reviewers on Amazon assure that it's a solid buy for the price." data-dimension48="This mini PC from Acemagic is dirt cheap, but you still get 16GB RAM and 512GB storage. The Intel N150 processor means it won't win any performance contests, but it should handle everyday computing tasks just fine. While we haven't tested this model ourselves, reviewers on Amazon assure that it's a solid buy for the price." data-dimension25="$199" href="https://www.amazon.com/ACEMAGIC-V1-Computers-Desktop-Display/dp/B0DMCRSBNT" 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:63.73%;"><img id="pePb9FG3J9bD6e7RCD6nRS" name="Vista V1 Mini PC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/pePb9FG3J9bD6e7RCD6nRS.jpg" mos="" align="middle" fullscreen="" width="1500" height="956" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This mini PC from Acemagic is dirt cheap, but you still get 16GB RAM and 512GB storage. The Intel N150 processor means it won't win any performance contests, but it should handle everyday computing tasks just fine. While we haven't tested this model ourselves, reviewers on Amazon assure that it's a solid buy for the price.<a class="view-deal button" href="https://www.amazon.com/ACEMAGIC-V1-Computers-Desktop-Display/dp/B0DMCRSBNT" target="_blank" rel="nofollow" data-dimension112="a1a5c618-1545-46a0-a60a-b7588abfbb6b" data-action="Deal Block" data-label="This mini PC from Acemagic is dirt cheap, but you still get 16GB RAM and 512GB storage. The Intel N150 processor means it won't win any performance contests, but it should handle everyday computing tasks just fine. While we haven't tested this model ourselves, reviewers on Amazon assure that it's a solid buy for the price." data-dimension48="This mini PC from Acemagic is dirt cheap, but you still get 16GB RAM and 512GB storage. The Intel N150 processor means it won't win any performance contests, but it should handle everyday computing tasks just fine. While we haven't tested this model ourselves, reviewers on Amazon assure that it's a solid buy for the price." data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="3b21ba46-2ec5-4606-8bf3-5e65a75ffec1" data-action="Deal Block" data-label="Kamrui E3B review" data-dimension48="Kamrui E3B review" data-dimension25="$379" href="https://www.amazon.com/KAMRUI-E3B-Computers-Desktop-Computer/dp/B0FM7SXTNV" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1464px;"><p class="vanilla-image-block" style="padding-top:88.25%;"><img id="grRSkC5jNEgiNztNDmzvfS" name="61a962e7+cL._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/grRSkC5jNEgiNztNDmzvfS.jpg" mos="" align="middle" fullscreen="" width="1464" height="1292" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>While it has since lost its spot to a newer model, the Kamrui E3B was a previous pick on our list of the best mini PCs. You get plenty of power for the price with this deal, with an AMD Ryzen 7 5825U processor, 32GB of DDR4 RAM and a 1TB SSD. There are two USB-A ports, a USB-C port with video out and a headphone jack. Around back, you get HDMI and DisplayPort for video out, a Gigabit Ethernet jack and, surprisingly, four more USB-A ports. In our <a href="https://www.tomsguide.com/computing/desktop-computers/kamrui-e3b-review-a-budget-mini-pc-that-punches-above-its-weight" data-dimension112="3b21ba46-2ec5-4606-8bf3-5e65a75ffec1" data-action="Deal Block" data-label="Kamrui E3B review" data-dimension48="Kamrui E3B review" data-dimension25="$379">Kamrui E3B review</a>, we praised its near-silent fan and its sleek, all-black design.<a class="view-deal button" href="https://www.amazon.com/KAMRUI-E3B-Computers-Desktop-Computer/dp/B0FM7SXTNV" target="_blank" rel="nofollow" data-dimension112="3b21ba46-2ec5-4606-8bf3-5e65a75ffec1" data-action="Deal Block" data-label="Kamrui E3B review" data-dimension48="Kamrui E3B review" data-dimension25="$379">View Deal</a></p></div><div class="product"><a data-dimension112="4e8330cd-212c-4104-a3ac-d7182c51bcb1" data-action="Deal Block" data-label="Geekom A5 2025 Edition review" data-dimension48="Geekom A5 2025 Edition review" data-dimension25="$399" href="https://www.bestbuy.com/product/geekom-a5-mini-pc-amd-ryzen-7-5825u-up-to-4-5ghz-16gb-ddr4-ram-512gb-m-2-pcie-nvme-ssd-windows-11-pro-pre-installed-rose-gold/J3GW668X3Y/sku/10152219" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1440px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="C3tjN9QTZGsjMycxjiM7qE" name="Geekom A5 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/C3tjN9QTZGsjMycxjiM7qE.jpg" mos="" align="middle" fullscreen="" width="1440" height="1440" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Geekom A5 (2025 Edition) is our pick for the best budget mini PC. It’s powered by an AMD Ryzen 7 5825U processor and comes with 16GB of DDR4 RAM and a 512GB M.2 SSD. While you don’t get a USB-C port on the front (just two USB-A ports and a headphone jack), around back you get two USB-C ports with video out, two HDMI ports, two USB-A ports and a 2.5 Gbps Ethernet port. There’s also an SD card reader on the side. In our <a href="https://www.tomsguide.com/computing/desktop-computers/geekom-a5-review" data-dimension112="4e8330cd-212c-4104-a3ac-d7182c51bcb1" data-action="Deal Block" data-label="Geekom A5 2025 Edition review" data-dimension48="Geekom A5 2025 Edition review" data-dimension25="$399">Geekom A5 2025 Edition review</a>, we said this affordable mini PC performs even better than it looks with its unique rose gold colorway.<a class="view-deal button" href="https://www.bestbuy.com/product/geekom-a5-mini-pc-amd-ryzen-7-5825u-up-to-4-5ghz-16gb-ddr4-ram-512gb-m-2-pcie-nvme-ssd-windows-11-pro-pre-installed-rose-gold/J3GW668X3Y/sku/10152219" target="_blank" rel="nofollow" data-dimension112="4e8330cd-212c-4104-a3ac-d7182c51bcb1" data-action="Deal Block" data-label="Geekom A5 2025 Edition review" data-dimension48="Geekom A5 2025 Edition review" data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="95bedaaf-5540-43f7-805f-f2cfcb5140f6" data-action="Deal Block" data-label="Mac mini M4 review" data-dimension48="Mac mini M4 review" data-dimension25="$479" href="https://www.amazon.com/Apple-2024-Desktop-Computer-10%E2%80%91core/dp/B0DLBTPDCS" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="L8QA9sZYoSqocSTyVMrAFY" name="Mac mini M4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/L8QA9sZYoSqocSTyVMrAFY.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The base model Mac mini M4 is a big step up from its predecessor and likely enough for most people without any expensive upgrades. It comes with Apple’s powerful M4 chip, 16GB of RAM and 256GB of storage. You also get plenty of ports in a tiny package with three Thunderbolt 4 ports, two USB-C ports, HDMI and Ethernet. If it weren't for the awkward power button placement and the complete lack of USB-A ports, we would have easily given this one 5 stars in our <a href="https://www.tomsguide.com/computing/desktop-computers/mac-mini-m4-review" data-dimension112="95bedaaf-5540-43f7-805f-f2cfcb5140f6" data-action="Deal Block" data-label="Mac mini M4 review" data-dimension48="Mac mini M4 review" data-dimension25="$479">Mac mini M4 review</a>.<a class="view-deal button" href="https://www.amazon.com/Apple-2024-Desktop-Computer-10%E2%80%91core/dp/B0DLBTPDCS" target="_blank" rel="nofollow" data-dimension112="95bedaaf-5540-43f7-805f-f2cfcb5140f6" data-action="Deal Block" data-label="Mac mini M4 review" data-dimension48="Mac mini M4 review" data-dimension25="$479">View Deal</a></p></div><div class="product"><a data-dimension112="a44e2d07-5313-4b49-ac32-d5177ab96030" data-action="Deal Block" data-label="Khadas Mind review" data-dimension48="Khadas Mind review" data-dimension25="$494" href="https://www.amazon.com/Khadas-i7-1360P-Computer-Portable-Business/dp/B0DPMTYQ8Z" 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:77.20%;"><img id="EqippTHHRTWnfyFeqdyB9F" name="61eODiqNLYL._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EqippTHHRTWnfyFeqdyB9F.jpg" mos="" align="middle" fullscreen="" width="1500" height="1158" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The standard Khadas Mind packs an Intel i5-1340p processor, 16GB of DDR5 RAM and a 512GB SSD into an absolutely tiny package. There’s a power button on the front, cooling on the sides and around back, you get two USB-A ports, two USB-C ports (one for power) and an HDMI port. However, there’s also a free M.2 SSD slot on the bottom if you want to add more storage to the base Khadas Mind. In our <a href="https://www.tomsguide.com/computing/desktop-computers/khadas-mind-review" data-dimension112="a44e2d07-5313-4b49-ac32-d5177ab96030" data-action="Deal Block" data-label="Khadas Mind review" data-dimension48="Khadas Mind review" data-dimension25="$494">Khadas Mind review</a>, we praised this pocketable mini PC for its slim profile and the fact that you can add more ports or even a graphics card thanks to Khadas’ first-party docks. This gets a 10% discount calculated at checkout.<a class="view-deal button" href="https://www.amazon.com/Khadas-i7-1360P-Computer-Portable-Business/dp/B0DPMTYQ8Z" target="_blank" rel="nofollow" data-dimension112="a44e2d07-5313-4b49-ac32-d5177ab96030" data-action="Deal Block" data-label="Khadas Mind review" data-dimension48="Khadas Mind review" data-dimension25="$494">View Deal</a></p></div><div class="product"><a data-dimension112="c8fe1f07-5835-444a-adfd-2655ba710ced" data-action="Deal Block" data-label="This option from AceMagic is a powerful mini PC with an AMD Ryzen 7 8745HS CPU at the heart. This is partnered with 32GB of RAM and a 1TB SSD, and it can also support 8K triple display connectivity." data-dimension48="This option from AceMagic is a powerful mini PC with an AMD Ryzen 7 8745HS CPU at the heart. This is partnered with 32GB of RAM and a 1TB SSD, and it can also support 8K triple display connectivity." data-dimension25="$519" href="https://www.amazon.com/dp/B0FX2RKYZ8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1402px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="GawyeDWSQzYmRHC96bQGJM" name="ACEMAGICIAN W1 Mini PC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GawyeDWSQzYmRHC96bQGJM.jpg" mos="" align="middle" fullscreen="" width="1402" height="1402" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This option from AceMagic is a powerful mini PC with an AMD Ryzen 7 8745HS CPU at the heart. This is partnered with 32GB of RAM and a 1TB SSD, and it can also support 8K triple display connectivity.<a class="view-deal button" href="https://www.amazon.com/dp/B0FX2RKYZ8" target="_blank" rel="nofollow" data-dimension112="c8fe1f07-5835-444a-adfd-2655ba710ced" data-action="Deal Block" data-label="This option from AceMagic is a powerful mini PC with an AMD Ryzen 7 8745HS CPU at the heart. This is partnered with 32GB of RAM and a 1TB SSD, and it can also support 8K triple display connectivity." data-dimension48="This option from AceMagic is a powerful mini PC with an AMD Ryzen 7 8745HS CPU at the heart. This is partnered with 32GB of RAM and a 1TB SSD, and it can also support 8K triple display connectivity." data-dimension25="$519">View Deal</a></p></div><div class="product"><a data-dimension112="31453327-99e7-4f9b-b21c-6765bfac9807" data-action="Deal Block" data-label="The Acemagic M1 is a compact mini PC with plenty of power under the hood thanks to its Intel Core i9-11900H processor. It also comes equipped with 32GB of DDR4 memory and a 1 TB SSD and plenty of ports. Up front, you get two USB-A ports and a USB-C 3.2 Gen 2 port with video out and a headphone jack. Then around back, there are four USB-A ports, an HDMI 2.0 port, a DisplayPort 1.4 and a 2.5G Ethernet port. This one gets a 35% discount calculated at checkout." data-dimension48="The Acemagic M1 is a compact mini PC with plenty of power under the hood thanks to its Intel Core i9-11900H processor. It also comes equipped with 32GB of DDR4 memory and a 1 TB SSD and plenty of ports. Up front, you get two USB-A ports and a USB-C 3.2 Gen 2 port with video out and a headphone jack. Then around back, there are four USB-A ports, an HDMI 2.0 port, a DisplayPort 1.4 and a 2.5G Ethernet port. This one gets a 35% discount calculated at checkout." data-dimension25="$519" href="https://www.amazon.com/ACEMAGIC-M1-i9-11900H-Computers-PCIe3-0/dp/B0FG7YD2D8?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:73.07%;"><img id="yXKyXFPdeiZzPbyewJdQ9K" name="M1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yXKyXFPdeiZzPbyewJdQ9K.jpg" mos="" align="middle" fullscreen="" width="1500" height="1096" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Acemagic M1 is a compact mini PC with plenty of power under the hood thanks to its Intel Core i9-11900H processor. It also comes equipped with 32GB of DDR4 memory and a 1 TB SSD and plenty of ports. Up front, you get two USB-A ports and a USB-C 3.2 Gen 2 port with video out and a headphone jack. Then around back, there are four USB-A ports, an HDMI 2.0 port, a DisplayPort 1.4 and a 2.5G Ethernet port. This one gets a 35% discount calculated at checkout.<a class="view-deal button" href="https://www.amazon.com/ACEMAGIC-M1-i9-11900H-Computers-PCIe3-0/dp/B0FG7YD2D8?th=1" target="_blank" rel="nofollow" data-dimension112="31453327-99e7-4f9b-b21c-6765bfac9807" data-action="Deal Block" data-label="The Acemagic M1 is a compact mini PC with plenty of power under the hood thanks to its Intel Core i9-11900H processor. It also comes equipped with 32GB of DDR4 memory and a 1 TB SSD and plenty of ports. Up front, you get two USB-A ports and a USB-C 3.2 Gen 2 port with video out and a headphone jack. Then around back, there are four USB-A ports, an HDMI 2.0 port, a DisplayPort 1.4 and a 2.5G Ethernet port. This one gets a 35% discount calculated at checkout." data-dimension48="The Acemagic M1 is a compact mini PC with plenty of power under the hood thanks to its Intel Core i9-11900H processor. It also comes equipped with 32GB of DDR4 memory and a 1 TB SSD and plenty of ports. Up front, you get two USB-A ports and a USB-C 3.2 Gen 2 port with video out and a headphone jack. Then around back, there are four USB-A ports, an HDMI 2.0 port, a DisplayPort 1.4 and a 2.5G Ethernet port. This one gets a 35% discount calculated at checkout." data-dimension25="$519">View Deal</a></p></div><div class="product"><a data-dimension112="757f989c-6719-459e-a8da-38b5776eb1f3" data-action="Deal Block" data-label="With its Intel Core i9 13900HK CPU and 32GB of RAM, AceMagic has aimed this mini PC at gamers on a budget. It also boasts a 1TB SSD, USB4/HDMI/DP/Wifi 6E connectivity, and Windows 11 Pro. While it won't beat the performance of a gaming PC specced with a high-end GPU like the RTX 5090, AceMagic says it can handle popular multiplayer games like Fortnite, League of Legends and Valorant on medium settings." data-dimension48="With its Intel Core i9 13900HK CPU and 32GB of RAM, AceMagic has aimed this mini PC at gamers on a budget. It also boasts a 1TB SSD, USB4/HDMI/DP/Wifi 6E connectivity, and Windows 11 Pro. While it won't beat the performance of a gaming PC specced with a high-end GPU like the RTX 5090, AceMagic says it can handle popular multiplayer games like Fortnite, League of Legends and Valorant on medium settings." data-dimension25="$599" href="https://www.amazon.com/dp/B0FQJL21TD" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="wpyQvUELw6CfRj4ehTGoKF" name="ACEMAGIC Mini Gaming PC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wpyQvUELw6CfRj4ehTGoKF.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With its Intel Core i9 13900HK CPU and 32GB of RAM, AceMagic has aimed this mini PC at gamers on a budget. It also boasts a 1TB SSD, USB4/HDMI/DP/Wifi 6E connectivity, and Windows 11 Pro. While it won't beat the performance of a gaming PC specced with a high-end GPU like the RTX 5090, AceMagic says it can handle popular multiplayer games like Fortnite, League of Legends and Valorant on medium settings.<a class="view-deal button" href="https://www.amazon.com/dp/B0FQJL21TD" target="_blank" rel="nofollow" data-dimension112="757f989c-6719-459e-a8da-38b5776eb1f3" data-action="Deal Block" data-label="With its Intel Core i9 13900HK CPU and 32GB of RAM, AceMagic has aimed this mini PC at gamers on a budget. It also boasts a 1TB SSD, USB4/HDMI/DP/Wifi 6E connectivity, and Windows 11 Pro. While it won't beat the performance of a gaming PC specced with a high-end GPU like the RTX 5090, AceMagic says it can handle popular multiplayer games like Fortnite, League of Legends and Valorant on medium settings." data-dimension48="With its Intel Core i9 13900HK CPU and 32GB of RAM, AceMagic has aimed this mini PC at gamers on a budget. It also boasts a 1TB SSD, USB4/HDMI/DP/Wifi 6E connectivity, and Windows 11 Pro. While it won't beat the performance of a gaming PC specced with a high-end GPU like the RTX 5090, AceMagic says it can handle popular multiplayer games like Fortnite, League of Legends and Valorant on medium settings." data-dimension25="$599">View Deal</a></p></div><div class="product"><a data-dimension112="17ff7a56-9a20-4fb2-b109-d6e0cbd31072" data-action="Deal Block" data-label="The GMKtec EVO-T1 is powerful enough in its own right, but on the front, in addition to your usual front ports, it has an Oculink port. This can be used to connect this mini PC to an external graphics card dock to transform it into a full-fledged gaming PC. Even if you don’t go that route, the EVO-T1 features a powerful Intel Core Ultra 9 285H processor with built-in Intel Arc 140T integrated graphics. You also get 64GB of RAM, a 1TB SSD and a case that lets you use this mini PC vertically if you don’t want to have it lying flat on your desk. Dual 2.5 Gigabit Ethernet ports also make it a great choice for those with a NAS, and with 50 TOPs, it’s also great for local AI workloads." data-dimension48="The GMKtec EVO-T1 is powerful enough in its own right, but on the front, in addition to your usual front ports, it has an Oculink port. This can be used to connect this mini PC to an external graphics card dock to transform it into a full-fledged gaming PC. Even if you don’t go that route, the EVO-T1 features a powerful Intel Core Ultra 9 285H processor with built-in Intel Arc 140T integrated graphics. You also get 64GB of RAM, a 1TB SSD and a case that lets you use this mini PC vertically if you don’t want to have it lying flat on your desk. Dual 2.5 Gigabit Ethernet ports also make it a great choice for those with a NAS, and with 50 TOPs, it’s also great for local AI workloads." data-dimension25="$949" href="https://www.amazon.com/GMKtec_ultra_285h_ai_mini_pc_evo_t1/dp/B0FH4NZ6DX" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1183px;"><p class="vanilla-image-block" style="padding-top:72.27%;"><img id="oejSmeortLKjZLu3Uj5zCT" name="GMKtec EVO-T1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oejSmeortLKjZLu3Uj5zCT.jpg" mos="" align="middle" fullscreen="" width="1183" height="855" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The GMKtec EVO-T1 is powerful enough in its own right, but on the front, in addition to your usual front ports, it has an Oculink port. This can be used to connect this mini PC to an external graphics card dock to transform it into a full-fledged gaming PC. Even if you don’t go that route, the EVO-T1 features a powerful Intel Core Ultra 9 285H processor with built-in Intel Arc 140T integrated graphics. You also get 64GB of RAM, a 1TB SSD and a case that lets you use this mini PC vertically if you don’t want to have it lying flat on your desk. Dual 2.5 Gigabit Ethernet ports also make it a great choice for those with a NAS, and with 50 TOPs, it’s also great for local AI workloads.<a class="view-deal button" href="https://www.amazon.com/GMKtec_ultra_285h_ai_mini_pc_evo_t1/dp/B0FH4NZ6DX" target="_blank" rel="nofollow" data-dimension112="17ff7a56-9a20-4fb2-b109-d6e0cbd31072" data-action="Deal Block" data-label="The GMKtec EVO-T1 is powerful enough in its own right, but on the front, in addition to your usual front ports, it has an Oculink port. This can be used to connect this mini PC to an external graphics card dock to transform it into a full-fledged gaming PC. Even if you don’t go that route, the EVO-T1 features a powerful Intel Core Ultra 9 285H processor with built-in Intel Arc 140T integrated graphics. You also get 64GB of RAM, a 1TB SSD and a case that lets you use this mini PC vertically if you don’t want to have it lying flat on your desk. Dual 2.5 Gigabit Ethernet ports also make it a great choice for those with a NAS, and with 50 TOPs, it’s also great for local AI workloads." data-dimension48="The GMKtec EVO-T1 is powerful enough in its own right, but on the front, in addition to your usual front ports, it has an Oculink port. This can be used to connect this mini PC to an external graphics card dock to transform it into a full-fledged gaming PC. Even if you don’t go that route, the EVO-T1 features a powerful Intel Core Ultra 9 285H processor with built-in Intel Arc 140T integrated graphics. You also get 64GB of RAM, a 1TB SSD and a case that lets you use this mini PC vertically if you don’t want to have it lying flat on your desk. Dual 2.5 Gigabit Ethernet ports also make it a great choice for those with a NAS, and with 50 TOPs, it’s also great for local AI workloads." data-dimension25="$949">View Deal</a></p></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve tested a lot of mini PCs, but I’ve finally found one with all the ports and power I need ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/desktop-computers/mini-pcs/geekom-a9-max-review</link>
                                                                            <description>
                            <![CDATA[ The Geekom A9 Max is a truly powerful mini PC that you can upgrade to your heart’s content with practically all the ports you could ever need. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ujbLp2stQpPCKfYjxLjruh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DCQyjzAiRH9U4wDGfRRMJB-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 06 Dec 2025 10:45:00 +0000</pubDate>                                                                                                                                <updated>Thu, 26 Mar 2026 10:31:16 +0000</updated>
                                                                                                                                            <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Desktop Computers]]></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.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/DCQyjzAiRH9U4wDGfRRMJB-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Geekom A9 Max upright on a table]]></media:description>                                                            <media:text><![CDATA[The Geekom A9 Max upright on a table]]></media:text>
                                <media:title type="plain"><![CDATA[The Geekom A9 Max upright on a table]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DCQyjzAiRH9U4wDGfRRMJB-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Geekom A9 Max is an incredibly fast mini PC that delivers excellent performance thanks to its AMD Ryzen AI 9 processor. This is paired with powerful components throughout, along with the ability to upgrade its RAM and storage down the line, all in a compact case that’s only slightly wider than the Mac mini M4.</p><p>At $1,199, the A9 Max is on the expensive side. However, this isn’t your typical mini PC, as you’re getting desktop-class power and practically all the ports you could need. In typical Geekom fashion, you have loads of rear ports with the ability to drive up to a quad-monitor setup. However, it was the four USB-A ports around front and the convenient SD card reader on the side that impressed me most.</p><p>Not only is the A9 Max powerful, it’s also very quiet. During the two months I spent using it as my daily driver, its internal fan never made more than a peep while the system stayed cool. This is likely due to the large heatsink under its motherboard, which did make opening its case up a bit more difficult than with the other Geekom mini PCs I’ve tested in the past.</p><p>My Geekom A9 Max review will help you decide if this is the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PC</a> for your needs and whether or not it’s worth spending a bit more on a seriously fast yet compact machine.</p><h3 class="article-body__section" id="section-geekom-a9-max-cheat-sheet"><span>Geekom A9 Max: Cheat Sheet</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="M3nJHVeJaHb8TkP9ch49NH" name="Geekom A9 Max-02" alt="The Geekom A9 Max unboxed with all of its accessories on a table" src="https://cdn.mos.cms.futurecdn.net/M3nJHVeJaHb8TkP9ch49NH.jpg" mos="" align="middle" fullscreen="" width="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><ul><li><strong>What is it? </strong>A compact, silver mini PC that provides desktop-class power and loads of front and rear ports.</li><li><strong>Who is it for? </strong>Those who need a powerful mini PC with desktop-class performance to replace a larger system or their laptop.</li><li><strong>What does it cost? </strong>The A9 Max <a href="https://www.amazon.com/GEEKOM-A9-Max-Windows-Display/dp/B0FJ213R6G?th=1" target="_blank" rel="nofollow">costs $1,199</a>, though it's currently <a href="https://www.geekompc.com/geekom-A9-max-mini-pc/" target="_blank" rel="nofollow">discounted to $1,089</a> on the company’s website.</li><li><strong>What do we like? </strong>The powerful Ryzen AI 9 processor, its compact form factor, the ability to power it via USB-C, the highly generous rear and especially front port selection, and its excellent RAM and storage expandability.</li><li><strong>What don’t we like? </strong>The premium price tag, the more difficult-than-usual case opening process for upgrades, and the easily detached internal Wi-Fi antennas.</li></ul><h3 class="article-body__section" id="section-geekom-a9-max-specs"><span>Geekom A9 Max: Specs</span></h3><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,199</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>AMD Ryzen AI 9 HX 370</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>AMD Radeon 890M</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>32GB DDR5 (upgradeable to 128GB)</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>2TB (upgradeable to 4TB), 1 x M.2 2230 (upgradeable to 4TB)</p></td></tr><tr><td class="firstcol " ><p><strong>OS</strong></p></td><td  ><p>Windows 11 Pro</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>4 x USB-A, 1 x 3.5mm headphone jack (front), 1 x SD card reader, 1 x Kensington Lock (side), 2 x USB-A, 2 x HDMI 2.1, 2 x USB 4 (one with PD-in), 2 x 2.5G Ethernet</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>Size</strong></p></td><td  ><p>5.31 x 5.20 x 1.85 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.56 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-geekom-a9-max-the-ups"><span>Geekom A9 Max: The ups</span></h3><p>The Geekom A9 Max certainly earns its name with plenty of power under the hood, loads of ports at the front and back and a solid upgrade path should you want to add even more memory and storage later on.</p><h2 id="sleek-silver-and-solid">Sleek, silver and solid</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tZpLxmpKmRXPjv3rnLbSZL" name="Geekom A9 Max-04" alt="The front ports of the Geekom A9 Max" src="https://cdn.mos.cms.futurecdn.net/tZpLxmpKmRXPjv3rnLbSZL.jpg" mos="" align="middle" fullscreen="" width="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 5.31 x 5.20 x 1.85 inches, the A9 Max has a slightly larger footprint than the <a href="https://www.tomsguide.com/computing/desktop-computers/mac-mini-m4-review">Mac mini M4</a> on your desk but is slightly shorter. Likewise, you get a VESA mount and screws in the box should you want to mount this mini PC behind your monitor. However, with all those handy front ports, I wouldn’t recommend it but more on that later.</p><p>On the front of the A9 Max, there are four high-speed USB-A ports — one of which is an always-on charging port — and a headphone jack along with the power button. On the left side, you get an SD card reader and on the right, there’s a Kensington Lock to secure this mini PC at your desk.</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="CJLdvw328eytHUDbCxsudN" name="Geekom A9 Max-03" alt="The rear ports of the Geekom A9 Max" src="https://cdn.mos.cms.futurecdn.net/CJLdvw328eytHUDbCxsudN.jpg" mos="" align="middle" fullscreen="" width="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>Around back, you get two more USB-A ports (one of which is high-speed, the other is USB 2.0), two HDMI 2.1 ports, two USB4 ports, dual 2.5 gigabit Ethernet ports and a barrel power connector. If you don’t plan on using the A9 Max with a quad-monitor setup, you can use one of the USB4 ports (the one marked PD-in) and a 100W or higher GaN charger instead of the external power supply, just like on the <a href="https://www.tomsguide.com/computing/desktop-computers/msi-cubi-nuc-ai-plus-2mg-review">MSI Cubi NUC AI+ 2MG</a>.</p><p>Four rubber feet on the underside of the A9 Max kept it firmly planted on my desk and I really like how its aluminum outer shell gives this mini PC a more premium look. However, if you want some color, there’s also a purple version available for the same price.</p><p>While the design and ports are excellent on the A9 Max, it’s the power under the hood that’s really the standout feature of this mini PC.</p><h2 id="mini-but-mighty">Mini but mighty</h2><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="LbLSERD7YjxGJrbjJdynPK" name="Portable Monitor plus Ultrawide-LIST" alt="A picture of a desk setup with a portable monitor mounted next to an ultrawide" src="https://cdn.mos.cms.futurecdn.net/LbLSERD7YjxGJrbjJdynPK.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Geekom definitely didn’t skimp on the A9 Max’s components and this absolutely shows during my day-to-day usage. It’s powered by an AMD Ryzen AI 9 HX 370 processor, which is paired with 32GB of DDR5 memory and you also get plenty of storage thanks to the included 2TB M.2 SSD.</p><p>On the connectivity side, you’re getting Wi-Fi 7 support along with Bluetooth 5.4. I also really liked having not one but two 2.5 gigabit Ethernet ports which can come in handy if you want to connect the A9 Max to one of the <a href="https://www.tomsguide.com/us/best-wifi-routers,review-2498.html">best Wi-Fi routers</a> via Ethernet and use the other port to transfer files to a <a href="https://www.tomsguide.com/computing/peripherals/i-finally-added-a-nas-to-my-home-network-and-i-cant-believe-i-waited-this-long">NAS device</a>.</p><div ><table><caption>Performance Benchmarks</caption><thead><tr><th class="firstcol empty" ></th><th  ><p><strong>Geekom A9 Max</strong></p></th><th  ><p><strong>Geekom IT15</strong></p></th><th  ><p><strong>Geekom A6</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Geekbench 6.4 single-core</strong></p></td><td  ><p>2976</p></td><td  ><p>3080</p></td><td  ><p>2126</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6.4 multi-core</strong></p></td><td  ><p>15140</p></td><td  ><p>15589</p></td><td  ><p>10547</p></td></tr><tr><td class="firstcol " ><p><strong>25GB file copy test (MBps)</strong></p></td><td  ><p>1749.79</p></td><td  ><p>1368.38</p></td><td  ><p>1200</p></td></tr><tr><td class="firstcol " ><p><strong>Handbrake (Mins:Secs)</strong></p></td><td  ><p>3:25</p></td><td  ><p>4:44</p></td><td  ><p>5:44</p></td></tr></tbody></table></div><p>As you can see in the table above, the A9 Max also performed really well in our benchmark tests. While the <a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/geekom-it15-review">Geekom IT15</a> was slightly ahead of it in Geekbench, the A9 Max pulled ahead when it came to moving large files and encoding video. Personally, I found the IT15 to be somewhat on the noisy side under load while the A9 Max never reached more than a slight hum during my real-world 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hCYaiq6SjQwSTq3b7E5EkH" name="Portable Monitor plus Ultrawide-4" alt="A person working on a desk setup with a portable monitor next to an ultrawide display" src="https://cdn.mos.cms.futurecdn.net/hCYaiq6SjQwSTq3b7E5EkH.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I used the A9 Max as my daily driver at a dual-monitor setup for two months and I was seriously impressed with its performance. As a Chrome power user with dozens of tabs open at a time, it never once slowed down and it was just as speedy when editing photos in GIMP. </p><p>Although I didn’t have a chance to test its gaming performance, in our lab, it hit 72 fps in Sid Meier’s Civilization VI: Gathering Storm at 1080p and 37 fps at 4K. With a machine this powerful, you could easily play plenty of modern titles at 1080p with the settings turned up and it will likely handle older titles with ease.</p><p>I primarily used the A9 Max for work and one thing really stood out for me when doing so as it made my workflow a lot simpler.</p><h2 id="ports-at-your-fingertips">Ports at your fingertips</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eJy8onMtUQ4tcjsgxWxXMV" name="Geekom A9 Max-05" alt="A person inserting a 2.4 GHz USB dongle into one of the front ports of the Geekom A9 Max" src="https://cdn.mos.cms.futurecdn.net/eJy8onMtUQ4tcjsgxWxXMV.jpg" mos="" align="middle" fullscreen="" width="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>On most mini PCs, you typically get two USB-A ports, a headphone jack, and maybe a USB-C port up front which is more than enough for most people. However, when you have a USB-C port with video out on the front, you typically don’t have one at the rear. Since Geekom usually gives you not one but two USB4 ports around back, the company decided to go all out on USB-A ports on the front, and this is one of my favorite things about the A9 Max.</p><p>As I switch between computers quite often, I like to use the 2.4 GHz USB dongles that come with most wireless keyboards and<a href="https://www.tomsguide.com/reference/what-is-a-trackball-mouse"> trackball mice</a>. This lets me quickly change computers without having to pair all of my peripherals over Bluetooth. With the A9 Max, I can have my USB adapters plugged in up front and still have two USB-A ports left over for plugging in flash drives or even charging my phone or tablet.</p><p>Another useful feature that you’ll often find on practically every Geekom mini PC is the full-size SD card reader on the left side. This is very convenient for me as it allows me to quickly download photos from my camera like the ones in this review.</p><p>Given that you can absolutely game on the A9 Max, theoretically, you could set it up in your living room and connect four wired controllers for a modern-day, N64-like experience. This is absolutely something I want to try when I get time — maybe over the holidays.</p><h3 class="article-body__section" id="section-geekom-a9-max-the-downs"><span>Geekom A9 Max: The downs</span></h3><p>The A9 Max definitely delivers when it comes to ports, power and upgradeability. However, opening it up and accessing its internals wasn’t as easy on some of the other mini PCs I reviewed. Plus, you’ll need to be very careful with the cables for the Wi-Fi antennas when doing so.</p><h2 id="upgrading-can-be-tricky">Upgrading can be tricky</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NgiQUvr6i2sM5KDQYLfqka" name="Geekom A9 Max-06" alt="A person removing the rubber feet on the bottom of the Geekom A9 Max using a pry tool" src="https://cdn.mos.cms.futurecdn.net/NgiQUvr6i2sM5KDQYLfqka.jpg" mos="" align="middle" fullscreen="" width="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>Just like with the Geekom A6 I reviewed, opening up the A9 Max starts with flipping it over and removing its rubber feet. This time around though, the glue used to attach them to the bottom of the case was quite strong and I needed to use a pry tool to remove them. Fortunately, I had one on hand from installing one of the <a href="https://www.tomsguide.com/best-picks/best-dash-cams">best dash cams</a> in my car.</p><p>One thing that I do like about Geekom’s rubber feet though is that they slot in on either side. This means that if the adhesive does wear off, you’ll still be able to reattach them on the bottom of the A9 Max. With the feet off, I then used a screwdriver to remove four screws to access the A9 Max’s internals. This is normally all you have to do but Geekom did things a bit differently with this mini PC to keep it cool.</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="JsEqvMTqoSxGziffKnUhyd" name="Geekom A9 Max-08" alt="A person removing the heatsink inside the Geekom A9 Max using a screwdriver" src="https://cdn.mos.cms.futurecdn.net/JsEqvMTqoSxGziffKnUhyd.jpg" mos="" align="middle" fullscreen="" width="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 see, underneath the bottom of its case, there’s a large metal heatsink you also have to remove before getting access to its internals. Removing it meant unscrewing four screws on the A9 Max’s corners and two on either side of the heatsink.</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="iPoyQdVTzx34K7iuVdDBig" name="Geekom A9 Max-09" alt="The Geekom A9 Max fully disassembled on a desk" src="https://cdn.mos.cms.futurecdn.net/iPoyQdVTzx34K7iuVdDBig.jpg" mos="" align="middle" fullscreen="" width="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>Now here is where things went slightly awry for me. Do you see the two wires taped down on the backside of the heatsink? Well, those are for the A9 Max’s 3D spatial antennas. They’re designed to help boost the device’s Wi-Fi signal and they were definitely an improvement over the ones on the IT15 before I opened the case up. The problem is that they become detached quite easily, which I didn’t realize until after I put the A9 Max back together.</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="xiN9H3PAVe75xNyvJCeBKk" name="Geekom A9 Max-10" alt="The Geekom A9 Max with its case open and internals exposed on a desk" src="https://cdn.mos.cms.futurecdn.net/xiN9H3PAVe75xNyvJCeBKk.jpg" mos="" align="middle" fullscreen="" width="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 that done, I was able to access the A9 Max’s motherboard where you can swap out the included M.2 SSD for something larger or add a smaller M.2 2230 SSD if you want to have dual drives inside this mini PC. Likewise, you can also swap out the memory and add more RAM too.</p><p>The slightly more difficult disassembly process is by no means a deal breaker. However, if you are going to open the A9 Max up, I’d recommend taking your time and being extra careful when removing the heatsink. That way, you won’t have to reattach those two Wi-Fi antennas which can be quite tedious to do.</p><h3 class="article-body__section" id="section-geekom-a9-max-verdict"><span>Geekom A9 Max: Verdict</span></h3><p>The Geekom A9 Max is one of the most impressive mini PCs I’ve tested yet. From its sleek aluminum case to its powerful internals and conveniently placed front and rear ports, there isn’t anything I’d change about its design. The A9 Max also holds up well under both heavy and light workloads and it served me quite well as my daily driver during the time I spent with this mini PC.</p><p>You also have plenty of upgrade opportunities here from adding a second SSD to swapping out the included one and adding more memory. While the 3D spatial antennas that connect to its Wi-Fi card could be a bit more snug when it comes to their connection, you just have to be careful and take your time when removing the A9 Max’s heatsink.</p><p>The A9 Max delivers and then some, which is why I’d easily recommend this mini PC to anyone looking to downsize from a desktop or those who don’t want to plug in their laptop to a dock when using it at their desk in a more permanent setup.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ It is now cheaper to buy a pre-built gaming PC than building one yourself — this RAM price crisis is only going to get worse from here ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/gaming-desktops/it-is-now-cheaper-to-buy-a-pre-built-gaming-pc-than-building-one-yourself-this-ram-price-crisis-is-only-going-to-get-worse-from-here</link>
                                                                            <description>
                            <![CDATA[ Pre-built gaming PCs are now cheaper than buying the parts, and the RAM price crisis is only going to make things worse. Here's what I found out in my investigation. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">vAMmMcV8A9J4L5nUwyrokJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/NmCBBSQ9Wz9JS2W6a3bj6F-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 05 Dec 2025 12:38:28 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Desktops]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/NmCBBSQ9Wz9JS2W6a3bj6F-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[RTX 5070 vs RTX 5070 Ti]]></media:description>                                                            <media:text><![CDATA[RTX 5070 vs RTX 5070 Ti]]></media:text>
                                <media:title type="plain"><![CDATA[RTX 5070 vs RTX 5070 Ti]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/NmCBBSQ9Wz9JS2W6a3bj6F-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Whenever a friend came to me asking for gaming PC advice, my tip was always the same: build it yourself. Beyond it (normally) being cheaper, there’s just something so therapeutically satisfying about putting it all together yourself and watching it leap into life.</p><p>But we’re in a crisis situation for PC components — <a href="https://www.tomsguide.com/computing/ram-prices-are-exploding-heres-why-and-everything-you-need-to-know-about-surviving-ramageddon">RAM prices have exploded and SSD costs are following</a>, and for the first time since I can remember, it’s actually cheaper to just get a pre-built PC than it is to build it yourself. Let me talk you through my investigation.</p><h2 id="by-the-numbers">By the numbers</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pBxjDZB4ZRfGtEH9meodbQ" name="Acer Predator Orion 7000 (2024)--06.jpg" alt="Acer Predator Orion (2024) review unit on desk" src="https://cdn.mos.cms.futurecdn.net/pBxjDZB4ZRfGtEH9meodbQ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I went to my trusty go-to source whenever I start planning a PC build — PC Part Picker — to figure things out. Let’s start with replicating this modest <a href="https://www.newegg.com/msi-gaming-desktop-pc-geforce-rtx-5060-amd-ryzen-5-8400f-16gb-ddr5-1tb-nvme-ssd-codex-z2-b8nvk-606us/p/N82E16883151755" target="_blank" rel="nofollow">MSI RTX 5050 system on Newegg, which is currently $829</a>.</p><p>Running it through PC Part Picker, matching the exact components where I can, <strong>before even adding a power supply and case, </strong>we’ve already blown past that price at a <a href="https://pcpartpicker.com/list/Yn8Xgn" target="_blank">total cost of $895.07</a>.</p><p>And it’s the same for other systems, too.</p><ul><li>First, let’s start with this Skytech Azure Gaming desktop — coming with AMD Ryzen 7 7700 CPU, RTX 5060 Ti GPU with 16GB of video memory, 32GB DDR5 RAM and a 1TB PCIe Gen 4.0 SSD. Other things to consider are the 650W Gold-rated power supply and the air cooler. Currently, <a href="https://www.newegg.com/skytech-gaming-desktop-pcs-geforce-rtx-5060-ti-amd-ryzen-7-7700-32gb-ddr5-1tb-nvme-ssd-st-azure3-1886-b-al-black/p/3D5-000Z-002J3" target="_blank" rel="nofollow">it’s $1,299 (down from $1,449)</a>. The total cost on PC Part Picker for either identical components or as close as I can get <a href="https://pcpartpicker.com/list/Dxt4Kq" target="_blank">is $1,455.63</a>.</li><li>This AMD variant of the <a href="https://www.newegg.com/skytech-gaming-desktop-pcs-amd-radeon-rx-9070-xt-amd-ryzen-7-9800x3d-32gb-ddr5-2tb-nvme-ssd-st-azure3-1747-w-al-white/p/3D5-000Z-002C5" target="_blank" rel="nofollow">Skytech Azure Gaming desktop</a> packs an AMD Ryzen 7 9800X3D CPU, Radeon RX 9070 XT GPU, 32GB DDR5 RAM and a 2TB SSD. On Newegg, it’s $1,899. On PC Part Picker, a near-identical configuration <a href="https://pcpartpicker.com/list/TRCtcx" target="_blank">is $1,975.65</a>.</li></ul><p>But the one that floored me personally was heading over to the Alienware store. Dell’s pre-builds are cool and all, but they do come with a hefty premium cost. Currently, the company has an <a href="https://www.dell.com/en-us/shop/desktop-computers/alienware-aurora-gaming-desktop/spd/alienware-aurora-act1250-gaming-desktop/useact1250wcto21" target="_blank" rel="nofollow">RTX 5070 Ti build for $1,529</a> — packing Intel Core Ultra 7 265F, 16GB DDR5 RAM and a 1TB SSD.</p><p>Finding the individual parts (I had to do a little poking around to find the cheapest RTX 5070 Ti on Newegg, as it’s not on PC Part Picker), the DIY cost ended up <a href="https://pcpartpicker.com/list/vXhBNz" target="_blank">over $200 more expensive</a>, and that's without a case.</p><p>This is accurate as of the time and date of writing: 7 a.m. ET on Friday, December 5. I followed every spec, but there will be some differences in cases, coolers, component brands and power supplies. In these situations, I opted for the cheapest option I could find.</p><h2 id="why-are-pre-builds-cheaper">Why are pre-builds cheaper?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8ivJ4o8nQN5ya9ETVpZF6S" name="TG_Alienware-A16_2.jpg" alt="Alienware Aurora R16" src="https://cdn.mos.cms.futurecdn.net/8ivJ4o8nQN5ya9ETVpZF6S.jpg" mos="" align="middle" fullscreen="" width="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>It comes down to one key thing: stock. Most retailers and computing brands will have these ready-made and good to go from their warehouses — using the stockpile of RAM and SSDs they already have on their books.</p><p>A lot of companies saw this starting to happen and managed to get their orders in early enough to keep themselves sort of protected from what’s happening now, which is why you see the price differential. If you were to buy parts now, you’re buying at the current market price.</p><p>Going the DIY route used to be the lower-cost way, because the added cost of the company building it is removed (you build it yourself after all). But the massively rising cost of RAM has brought it to the point where the time to build it yourself is actually more expensive than just getting someone else to do it for you.</p><h2 id="but-this-won-t-last-long">But this won’t last long</h2><div class="see-more see-more--clipped"><blockquote class="twitter-tweet hawk-ignore" data-lang="en"><p lang="en" dir="ltr">Price Changes Coming December 7th 2025, Due To Market Conditions 🔔‼️ pic.twitter.com/et0HADhc08<a href="https://twitter.com/cantworkitout/status/1993126805658911041">November 25, 2025</a></p></blockquote><div class="see-more__filter"></div></div><p>Stockpiles dry up, and demand is high. While there are some decent pre-builds you can get right now, they won’t be around for long. You’ve already seen this from PC builders like <a href="https://www.tomsguide.com/computing/brace-yourself-pcs-laptops-and-phones-may-jump-in-price-as-early-as-december-thanks-to-a-500-percent-ram-ssd-surge">CyberPowerPC and Maingear</a>, who have issued start warnings about price changes coming as early as December 7.</p><p>So it’s only a matter of time until bigger retailers start to raise prices, too. As I've said, orders of RAM from the two key fabrication plants still making consumer memory are fully booked throughout 2026. This problem will only get worse.</p><p>Rather than dwell, this is Tom’s Guide, and I’m here to give actionable consumer advice. If you were looking for a new gaming PC and you’re bewildered by the insane cost to build one yourself, here are the pre-built PCs I personally recommend to save you a bit of cash — before things get a whole lot pricier.</p><div class="product"><a data-dimension112="04c6768c-e134-45fe-961d-85673b98b8e7" data-action="Deal Block" data-label="As I said above, this is a modest baseline for a gaming PC that's good enough for 1080p gaming — packing Intel Core i5-14400F, 16GB DDR5 RAM, RTX 5050 and a 1TB SSD." data-dimension48="As I said above, this is a modest baseline for a gaming PC that's good enough for 1080p gaming — packing Intel Core i5-14400F, 16GB DDR5 RAM, RTX 5050 and a 1TB SSD." data-dimension25="$829" href="https://www.newegg.com/msi-gaming-desktop-pc-geforce-rtx-5060-amd-ryzen-5-8400f-16gb-ddr5-1tb-nvme-ssd-codex-z2-b8nvk-606us/p/N82E16883151755" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:75.00%;"><img id="RYEq29eZqKtVFDu5nSEwib" name="83-152-884-V10.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/RYEq29eZqKtVFDu5nSEwib.jpg" mos="" align="middle" fullscreen="" width="1280" height="960" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>As I said above, this is a modest baseline for a gaming PC that's good enough for 1080p gaming — packing Intel Core i5-14400F, 16GB DDR5 RAM, RTX 5050 and a 1TB SSD.<a class="view-deal button" href="https://www.newegg.com/msi-gaming-desktop-pc-geforce-rtx-5060-amd-ryzen-5-8400f-16gb-ddr5-1tb-nvme-ssd-codex-z2-b8nvk-606us/p/N82E16883151755" target="_blank" rel="nofollow" data-dimension112="04c6768c-e134-45fe-961d-85673b98b8e7" data-action="Deal Block" data-label="As I said above, this is a modest baseline for a gaming PC that's good enough for 1080p gaming — packing Intel Core i5-14400F, 16GB DDR5 RAM, RTX 5050 and a 1TB SSD." data-dimension48="As I said above, this is a modest baseline for a gaming PC that's good enough for 1080p gaming — packing Intel Core i5-14400F, 16GB DDR5 RAM, RTX 5050 and a 1TB SSD." data-dimension25="$829">View Deal</a></p></div><div class="product"><a data-dimension112="1549f318-269c-4588-8ebe-1c914896e5d2" data-action="Deal Block" data-label="Skytech's build comes with AMD Ryzen 7 7700 CPU, RTX 5060 Ti GPU (the 16GB model), 32GB DDR5 RAM and a 1TB SSD." data-dimension48="Skytech's build comes with AMD Ryzen 7 7700 CPU, RTX 5060 Ti GPU (the 16GB model), 32GB DDR5 RAM and a 1TB SSD." data-dimension25="$1299" href="https://www.newegg.com/skytech-gaming-desktop-pcs-geforce-rtx-5060-ti-amd-ryzen-7-7700-32gb-ddr5-1tb-nvme-ssd-st-azure3-1886-b-al-black/p/3D5-000Z-002J3" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="dBTZ9kd8gJXUcoKt4hsag4" name="Skytech King 95" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dBTZ9kd8gJXUcoKt4hsag4.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Skytech's build comes with AMD Ryzen 7 7700 CPU, RTX 5060 Ti GPU (the 16GB model), 32GB DDR5 RAM and a 1TB SSD.<a class="view-deal button" href="https://www.newegg.com/skytech-gaming-desktop-pcs-geforce-rtx-5060-ti-amd-ryzen-7-7700-32gb-ddr5-1tb-nvme-ssd-st-azure3-1886-b-al-black/p/3D5-000Z-002J3" target="_blank" rel="nofollow" data-dimension112="1549f318-269c-4588-8ebe-1c914896e5d2" data-action="Deal Block" data-label="Skytech's build comes with AMD Ryzen 7 7700 CPU, RTX 5060 Ti GPU (the 16GB model), 32GB DDR5 RAM and a 1TB SSD." data-dimension48="Skytech's build comes with AMD Ryzen 7 7700 CPU, RTX 5060 Ti GPU (the 16GB model), 32GB DDR5 RAM and a 1TB SSD." data-dimension25="$1299">View Deal</a></p></div><div class="product"><a data-dimension112="92274e7d-b6dd-42cc-8a1a-e0a363ac5278" data-action="Deal Block" data-label="A high-end, liquid-cooled gaming PC that ticks every box when it comes to top-tier level components. Its RTX 5080 GPU has fantastic backup support in the form of an Intel Core Ultra 9 285 Processor, 1000W power supply and 1TB SSD." data-dimension48="A high-end, liquid-cooled gaming PC that ticks every box when it comes to top-tier level components. Its RTX 5080 GPU has fantastic backup support in the form of an Intel Core Ultra 9 285 Processor, 1000W power supply and 1TB SSD." data-dimension25="$2449" href="https://www.dell.com/en-us/shop/desktop-computers/alienware-aurora-gaming-desktop/spd/alienware-aurora-act1250-gaming-desktop/useact1250wcto07" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="s3ecETdbGMpfFfrrJqr5Hj" name="Alienware Aurora" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/s3ecETdbGMpfFfrrJqr5Hj.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>A high-end, liquid-cooled gaming PC that ticks every box when it comes to top-tier level components. Its RTX 5080 GPU has fantastic backup support in the form of an Intel Core Ultra 9 285 Processor, 1000W power supply and 1TB SSD.<a class="view-deal button" href="https://www.dell.com/en-us/shop/desktop-computers/alienware-aurora-gaming-desktop/spd/alienware-aurora-act1250-gaming-desktop/useact1250wcto07" target="_blank" rel="nofollow" data-dimension112="92274e7d-b6dd-42cc-8a1a-e0a363ac5278" data-action="Deal Block" data-label="A high-end, liquid-cooled gaming PC that ticks every box when it comes to top-tier level components. Its RTX 5080 GPU has fantastic backup support in the form of an Intel Core Ultra 9 285 Processor, 1000W power supply and 1TB SSD." data-dimension48="A high-end, liquid-cooled gaming PC that ticks every box when it comes to top-tier level components. Its RTX 5080 GPU has fantastic backup support in the form of an Intel Core Ultra 9 285 Processor, 1000W power supply and 1TB SSD." data-dimension25="$2449">View Deal</a></p></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/gpus/stop-waiting-buying-a-gpu-in-2026-will-cost-you-more-here-are-the-nvidia-amd-and-intel-deals-to-grab-now">Stop waiting: Buying a GPU in 2026 will cost you more — here are the Nvidia, AMD and Intel deals to grab now</a></li><li><a href="https://www.tomsguide.com/gaming/pc-gaming/how-to-enable-xbox-full-screen-experience">How to get Xbox Full Screen Experience on any Windows 11 PC — even if you don't have the option in settings</a></li><li><a href="https://www.tomsguide.com/computing/office-software/think-youre-a-spreadsheet-wizard-you-aint-seen-nothing-til-youve-watched-the-excel-world-championships-heres-how">Think you're a spreadsheet wizard? You ain't seen nothing 'til you've watched the Excel World Championships — here's how</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Score the Mac mini M4 for over $100 off in Cyber Monday deal  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/score-the-mac-mini-m4-for-over-usd100-off-in-cyber-monday-deal</link>
                                                                            <description>
                            <![CDATA[ The Mac mini M4 is one of the best mini PCs you can buy, and right now it's over $100 off in this killer Cyber Monday deal! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">8akyoXgxyDZFXprpviYTAV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/z3MRwpPkmvNQu74rwex6HN-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 02 Dec 2025 00:31:25 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ alex.wawro@futurenet.com (Alex Wawro) ]]></author>                    <dc:creator><![CDATA[ Alex Wawro ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/Y4wW9n7CZrNzgofqVkGA5J.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Alex Wawro is a lifelong tech and games enthusiast with more than a decade of experience covering the movers and shakers in both industries for media outlets like Game Developer, Black Hat and PC World magazine. A lifelong PC builder, he currently serves as a senior editor at Tom&#039;s Guide covering all things computing, from laptops and desktops to printers, keyboards and mice. If you plug it into a PC, he&#039;s probably the person to talk to.&amp;nbsp;&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/z3MRwpPkmvNQu74rwex6HN-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Mac mini M4 on a desk with the Tom&#039;s Guide lowest price deals badge on top]]></media:description>                                                            <media:text><![CDATA[The Mac mini M4 on a desk with the Tom&#039;s Guide lowest price deals badge on top]]></media:text>
                                <media:title type="plain"><![CDATA[The Mac mini M4 on a desk with the Tom&#039;s Guide lowest price deals badge on top]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/z3MRwpPkmvNQu74rwex6HN-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We're late in the day here but you can still score some of the best last-minute Cyber Monday deals on gifts and gadgets for the holidays! </p><p>Case in point: The sun is setting on Monday here in California yet you can still score the excellent Memorial Day may be over, but right now you can score the amazing <a href="https://www.amazon.com/dp/B0DLBTPDCS" target="_blank" rel="nofollow">Mac mini M4 for just $479 at Amazon</a>. </p><div class="product"><a data-dimension112="46d2c6c6-d8d4-49e7-b715-fea5d7b03f56" data-action="Deal Block" data-label="This model of Apple's Mac mini packs an awesome M4 chip along with a doubling of RAM to 16GB and a 256GB SSD. Port array continues to be impressive with Thunderbolt 4, HDMI, Ethernet, and more. We awarded this our Editor's Choice honor and said its the smallest, most powerful Mac you can buy!" data-dimension48="This model of Apple's Mac mini packs an awesome M4 chip along with a doubling of RAM to 16GB and a 256GB SSD. Port array continues to be impressive with Thunderbolt 4, HDMI, Ethernet, and more. We awarded this our Editor's Choice honor and said its the smallest, most powerful Mac you can buy!" data-dimension25="$479" href="https://www.amazon.com/dp/B0DLBTPDCS" 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:39.87%;"><img id="GDTQJVDRrZzfsV3SQkfZB8" name="Apple Mac Mini M4 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GDTQJVDRrZzfsV3SQkfZB8.jpg" mos="" align="middle" fullscreen="" width="1500" height="598" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This model of Apple's Mac mini packs an awesome M4 chip along with a doubling of RAM to 16GB and a 256GB SSD. Port array continues to be impressive with Thunderbolt 4, HDMI, Ethernet, and more. We awarded this our Editor's Choice honor and said its the smallest, most powerful Mac you can buy!<a class="view-deal button" href="https://www.amazon.com/dp/B0DLBTPDCS" target="_blank" rel="nofollow" data-dimension112="46d2c6c6-d8d4-49e7-b715-fea5d7b03f56" data-action="Deal Block" data-label="This model of Apple's Mac mini packs an awesome M4 chip along with a doubling of RAM to 16GB and a 256GB SSD. Port array continues to be impressive with Thunderbolt 4, HDMI, Ethernet, and more. We awarded this our Editor's Choice honor and said its the smallest, most powerful Mac you can buy!" data-dimension48="This model of Apple's Mac mini packs an awesome M4 chip along with a doubling of RAM to 16GB and a 256GB SSD. Port array continues to be impressive with Thunderbolt 4, HDMI, Ethernet, and more. We awarded this our Editor's Choice honor and said its the smallest, most powerful Mac you can buy!" data-dimension25="$479">View Deal</a></p></div><p>That's the lowest price I've seen for the base configuration, which offers more than enough power for most people and is onen of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PC</a>s for folks who love Apple and macOS.</p><p>I help review laptops and desktops for a living here at Tom's Guide and I have to tell you, the latest Mac mini is an amazing PC that runs circles around much of the competition thanks to Apple's powerful M4 chipset. And with 16GB of RAM and 256GB of storage, it's a great PC for a family room, a student's dorm room or an elderly parent who needs a basic Mac to browse the web.</p><p>At 5 inches wide, 5 inches deep and 2 inches tall this is Apple’s smallest Mac yet, which makes it super-easy to fit into any existing desk setup and keeps it subtly out of sight until you want it. You also get a pair of USB-C ports and a headphone jack on the front, with more ports (including an RJ-45 Ethernet jack for wire Internet) on the back.</p><p>Check out our <a href="https://www.tomsguide.com/computing/desktop-computers/mac-mini-m4-review">Mac mini M4 review</a> to see hands-on photos and our lab test scores, which prove the base model is an absolute powerhouse thanks to its M4 chip with a 10-core CPU, 10-core GPU, and a 16-core Neural Engine driving <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>. You can connect up to three external displays for maximum productivity, too, ensuring you won't miss a beat with your most important tasks. </p><p>You have just hours left to score this deal and I doubt the Mac mini M4 will get any cheaper this year, so I'd snag one now if you're interested!</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I've been using mini PCs for over a decade but I've never seen ones this cheap ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/ive-been-using-mini-pcs-for-over-a-decade-but-ive-never-seen-ones-this-cheap</link>
                                                                            <description>
                            <![CDATA[ Save money on an ACEMAGIC mini PC thanks to their Black Friday Sale ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">W8Fuy2KUfkBZsBPiguRVd3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sNmqBWnxgWECurLtMWYRV5-1280-80.webp" type="image/webp" length="0"></enclosure>
                                                                        <pubDate>Mon, 01 Dec 2025 14:14:45 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                                    <dc:creator><![CDATA[ Paul Hatton ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/yFZfUBGGs822CgbDU8DvVF.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/webp" url="https://cdn.mos.cms.futurecdn.net/sNmqBWnxgWECurLtMWYRV5-1280-80.webp">
                                                            <media:credit><![CDATA[Acemagic]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Acemagic promo photo]]></media:description>                                                            <media:text><![CDATA[Acemagic promo photo]]></media:text>
                                <media:title type="plain"><![CDATA[Acemagic promo photo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sNmqBWnxgWECurLtMWYRV5-1280-80.webp" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you're looking for a seriously good deal on one of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a>, then you have to check out this Black Friday Sale from ACEMAGIC.</p><p><a href="https://www.amazon.com/dp/B0FQJL21TD?th=1">Mini Gaming PC, which is now discounted down to just $599 (was $856)</a>. That's an incredible $257 discount on a machine that boasts an Intel Core i9 13900HK CPU and 32GB of RAM. Get it with discount code IB55C5K2.</p><p>If you'd prefer something a little cheaper, then the <a href="https://www.amazon.com/dp/B0FX2RKYZ8?th=1">W1 Mini PC is now only $496.30 (was $709)</a>. You'll need to use the discount code FU3UD26H.</p><p>I've picked out two of my favorite picks, but there are plenty more discounted products to be found at the <a href="https://www.amazon.com/stores/ACEMAGIC/page/5BF995C2-098C-4C87-9DE4-70D955E4C902?lp_asin=B0FG7YD2D8&ref_=ast_bln&store_ref=bl_ast_dp_brandLogo_sto">ACEMAGIC Amazon store</a>.</p><h2 id="today-s-best-acemagic-mini-pc-deals-2">Today's best ACEMAGIC Mini PC deals</h2><div class="product"><a data-dimension112="1ad3be59-4e1b-4326-8e35-0325eb83e15f" data-action="Deal Block" data-label="With its Intel Core i9 13900HK CPU and 32GB of RAM, this is a mini PC designed for gamers. Also boasts a 1TB SSD, USB4/HDMI/DP/Wifi 6E connectivity, and Windows 11 Pro.Discount code IB55C5K2" data-dimension48="With its Intel Core i9 13900HK CPU and 32GB of RAM, this is a mini PC designed for gamers. Also boasts a 1TB SSD, USB4/HDMI/DP/Wifi 6E connectivity, and Windows 11 Pro.Discount code IB55C5K2" data-dimension25="$599" href="https://www.amazon.com/dp/B0FQJL21TD?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="wpyQvUELw6CfRj4ehTGoKF" name="ACEMAGIC Mini Gaming PC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wpyQvUELw6CfRj4ehTGoKF.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With its Intel Core i9 13900HK CPU and 32GB of RAM, this is a mini PC designed for gamers. Also boasts a 1TB SSD, USB4/HDMI/DP/Wifi 6E connectivity, and Windows 11 Pro.</p><p><strong>Discount code</strong> IB55C5K2<a class="view-deal button" href="https://www.amazon.com/dp/B0FQJL21TD?th=1" target="_blank" rel="nofollow" data-dimension112="1ad3be59-4e1b-4326-8e35-0325eb83e15f" data-action="Deal Block" data-label="With its Intel Core i9 13900HK CPU and 32GB of RAM, this is a mini PC designed for gamers. Also boasts a 1TB SSD, USB4/HDMI/DP/Wifi 6E connectivity, and Windows 11 Pro.Discount code IB55C5K2" data-dimension48="With its Intel Core i9 13900HK CPU and 32GB of RAM, this is a mini PC designed for gamers. Also boasts a 1TB SSD, USB4/HDMI/DP/Wifi 6E connectivity, and Windows 11 Pro.Discount code IB55C5K2" data-dimension25="$599">View Deal</a></p></div><div class="product"><a data-dimension112="cc991417-097d-4851-94de-024f2c461bc4" data-action="Deal Block" data-label="A super powerful mini PC with an AMD Ryzen 7 8745HS CPU at the heart. This is partnered with 32GB of RAM, a 1TB SSD, and 8K triple display connectivity.Discount code FU3UD26H" data-dimension48="A super powerful mini PC with an AMD Ryzen 7 8745HS CPU at the heart. This is partnered with 32GB of RAM, a 1TB SSD, and 8K triple display connectivity.Discount code FU3UD26H" data-dimension25="$496.30" href="https://www.amazon.com/dp/B0FX2RKYZ8?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1402px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="GawyeDWSQzYmRHC96bQGJM" name="ACEMAGICIAN W1 Mini PC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GawyeDWSQzYmRHC96bQGJM.jpg" mos="" align="middle" fullscreen="" width="1402" height="1402" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>A super powerful mini PC with an AMD Ryzen 7 8745HS CPU at the heart. This is partnered with 32GB of RAM, a 1TB SSD, and 8K triple display connectivity.</p><p><strong>Discount code</strong> FU3UD26H<a class="view-deal button" href="https://www.amazon.com/dp/B0FX2RKYZ8?th=1" target="_blank" rel="nofollow" data-dimension112="cc991417-097d-4851-94de-024f2c461bc4" data-action="Deal Block" data-label="A super powerful mini PC with an AMD Ryzen 7 8745HS CPU at the heart. This is partnered with 32GB of RAM, a 1TB SSD, and 8K triple display connectivity.Discount code FU3UD26H" data-dimension48="A super powerful mini PC with an AMD Ryzen 7 8745HS CPU at the heart. This is partnered with 32GB of RAM, a 1TB SSD, and 8K triple display connectivity.Discount code FU3UD26H" data-dimension25="$496.30">View Deal</a></p></div><p>Mini PCs are designed to be as small as possible while still packing a whole load of power. This makes them an ideal solution for anyone who works in a compact space or likes to keep their desk free from clutter.</p><p>If you missed out on these excellent deals or would like to explore other ways to save, then we recommend checking out the <a href="https://www.amazon.com/stores/ACEMAGIC/page/5BF995C2-098C-4C87-9DE4-70D955E4C902?lp_asin=B0FG7YD2D8&ref_=ast_bln&store_ref=bl_ast_dp_brandLogo_sto">ACEMAGIC Amazon store</a>.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I love a mini PC, and thanks to ACEMAGIC's Black Friday Sale I'm recommending these two ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/i-love-a-mini-pc-and-thanks-to-acemagics-black-friday-sale-im-recommending-these-two</link>
                                                                            <description>
                            <![CDATA[ Save big on an ACEMAGIC PC thanks to this incredible Black Friday Sale ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">vUKfjvoruNZv482Xs5n3G4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/29bacBgwNtRijQZJWSJg6i-1280-80.webp" type="image/webp" length="0"></enclosure>
                                                                        <pubDate>Mon, 01 Dec 2025 14:13:20 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                                    <dc:creator><![CDATA[ Paul Hatton ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/yFZfUBGGs822CgbDU8DvVF.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/webp" url="https://cdn.mos.cms.futurecdn.net/29bacBgwNtRijQZJWSJg6i-1280-80.webp">
                                                            <media:credit><![CDATA[ACEMAGIC]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Acemagic product range with the earth in the background]]></media:description>                                                            <media:text><![CDATA[Acemagic product range with the earth in the background]]></media:text>
                                <media:title type="plain"><![CDATA[Acemagic product range with the earth in the background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/29bacBgwNtRijQZJWSJg6i-1280-80.webp" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It's Black Friday, and one of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PC</a> manufacturers has a range of incredible deals that make their already affordable machines even cheaper.</p><p>Take, for example, the <a href="https://www.amazon.com/dp/B0FSX2LDPH?th=1">Mini Gaming PC, which is now discounted down to just $379.62 (was $499)</a>. Just enter code ROGDJNT7 to get the discount. With an AMD Ryzen 7 6800H CPU and 32GB RAM, you'll have plenty of power to get your work done efficiently.</p><p>If your budget is even tighter, I'd recommend the <a href="https://www.amazon.com/dp/B0DMCRSBNT?th=1">Vista V1 Mini PC, which is now only $189 (was $229)</a>. It's not the latest CPU, and it only features a 512GB SSD, but if these things don't bother you, this is a truly fantastic deal.</p><p>Interested? Scroll down for more information on these two top picks, or head over to the <a href="https://www.amazon.com/stores/ACEMAGIC/page/5BF995C2-098C-4C87-9DE4-70D955E4C902?lp_asin=B0FG7YD2D8&ref_=ast_bln&store_ref=bl_ast_dp_brandLogo_sto">ACEMAGIC Amazon store</a> to discover the full range of products in the sale. </p><h2 id="today-s-best-acemagic-mini-pc-deals-3">Today's best Acemagic Mini PC deals</h2><div class="product"><a data-dimension112="1ad3be59-4e1b-4326-8e35-0325eb83e15f" data-action="Deal Block" data-label="Powered by an AMD Ryzen 7 6800H CPU with 32GB RAM, this mini gaming PC from ACEMAGIC packs a whole lot of power. Also supports triple 4K displays for the ultimate home desktop setup.Discount code ROGDJNT7" data-dimension48="Powered by an AMD Ryzen 7 6800H CPU with 32GB RAM, this mini gaming PC from ACEMAGIC packs a whole lot of power. Also supports triple 4K displays for the ultimate home desktop setup.Discount code ROGDJNT7" data-dimension25="$379.62" href="https://www.amazon.com/dp/B0FSX2LDPH?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1397px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="J66u6USH9docWYr6JyruUG" name="ACEMAGIC Mini Gaming PC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/J66u6USH9docWYr6JyruUG.jpg" mos="" align="middle" fullscreen="" width="1397" height="1397" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Powered by an AMD Ryzen 7 6800H CPU with 32GB RAM, this mini gaming PC from ACEMAGIC packs a whole lot of power. Also supports triple 4K displays for the ultimate home desktop setup.</p><p><strong>Discount code</strong> ROGDJNT7<a class="view-deal button" href="https://www.amazon.com/dp/B0FSX2LDPH?th=1" target="_blank" rel="nofollow" data-dimension112="1ad3be59-4e1b-4326-8e35-0325eb83e15f" data-action="Deal Block" data-label="Powered by an AMD Ryzen 7 6800H CPU with 32GB RAM, this mini gaming PC from ACEMAGIC packs a whole lot of power. Also supports triple 4K displays for the ultimate home desktop setup.Discount code ROGDJNT7" data-dimension48="Powered by an AMD Ryzen 7 6800H CPU with 32GB RAM, this mini gaming PC from ACEMAGIC packs a whole lot of power. Also supports triple 4K displays for the ultimate home desktop setup.Discount code ROGDJNT7" data-dimension25="$379.62">View Deal</a></p></div><div class="product"><a data-dimension112="3469c627-4b0f-416e-82d5-d29dc20b4e12" data-action="Deal Block" data-label="This incredibly budget-friendly mini PC boasts a Twin Lake N150 CPU, 16GB of RAM, a 512GB SSD, and support for two 4K displays. Now with a $50 saving.No discount code needed" data-dimension48="This incredibly budget-friendly mini PC boasts a Twin Lake N150 CPU, 16GB of RAM, a 512GB SSD, and support for two 4K displays. Now with a $50 saving.No discount code needed" data-dimension25="$189" href="https://www.amazon.com/dp/B0DMCRSBNT?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="F5fx4VZaNFLetReevPjDGo" name="ACEMAGIC Vista V1 Mini PC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/F5fx4VZaNFLetReevPjDGo.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This incredibly budget-friendly mini PC boasts a Twin Lake N150 CPU, 16GB of RAM, a 512GB SSD, and support for two 4K displays. Now with a $50 saving.</p><p><strong>No discount code needed</strong><a class="view-deal button" href="https://www.amazon.com/dp/B0DMCRSBNT?th=1" target="_blank" rel="nofollow" data-dimension112="3469c627-4b0f-416e-82d5-d29dc20b4e12" data-action="Deal Block" data-label="This incredibly budget-friendly mini PC boasts a Twin Lake N150 CPU, 16GB of RAM, a 512GB SSD, and support for two 4K displays. Now with a $50 saving.No discount code needed" data-dimension48="This incredibly budget-friendly mini PC boasts a Twin Lake N150 CPU, 16GB of RAM, a 512GB SSD, and support for two 4K displays. Now with a $50 saving.No discount code needed" data-dimension25="$189">View Deal</a></p></div><p>Mini PCs have been around for a while, but they're not as popular as they should be. Designed to be as small as possible while still packing a whole load of power, mini PCs are the ideal solution for anyone wanting a clutter-free desk space. They're also ideal for anyone working in compact spaces who lacks the room for a large desktop tower.</p><p>If you'd like to explore other ways to save, then we recommend checking out the <a href="https://www.amazon.com/stores/ACEMAGIC/page/5BF995C2-098C-4C87-9DE4-70D955E4C902?lp_asin=B0FG7YD2D8&ref_=ast_bln&store_ref=bl_ast_dp_brandLogo_sto">ACEMAGIC Amazon store</a>.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I found the 12 best Cyber Monday gaming PC deals up to $1,000 off — save big before they sell out ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/gaming-desktops/cyber-monday-gaming-pc-deals</link>
                                                                            <description>
                            <![CDATA[ Whatever your budget, our guide to the best Cyber Monday gaming PC deals has you covered. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">umEkhjAJaKjDPFzCye3mPi</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/hqkEHEzLyhJedH8sXiSt4A-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 01 Dec 2025 11:26:44 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Desktops]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ dave.meikleham@futurenet.com (Dave Meikleham) ]]></author>                    <dc:creator><![CDATA[ Dave Meikleham ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/Rda8e7jGfyTdZLWYJQQ8VY.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Dave is a computing editor at Tom’s Guide and covers everything from cutting-edge laptops, the latest GPU tech, to ultrawide monitors. When he’s not worrying about dead pixels, Dave enjoys regularly rebuilding his PC for absolutely no reason at all. He built his first rig over 20 years ago, and he’s gone through more motherboards than he’s had hot dinners. Probably.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;In a previous life, he worked as a video game journalist during a career spanning the best part of two decades. Over that time he worked across both online and print, with bylines for GamesRadar+, PC Gamer, TechRadar, Edge and the Official UK PlayStation Magazine. He’s almost amassed an immeasurable amount of bad puns.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;An avid PC and console gamer, Dave enjoys breaking out Fraps way too often as he obsesses over frame rates. Despite owning a graphics card that costs roughly the same as your average used car, he still enjoys gaming on the go and is regularly glued to his Switch. Away from tech, most of Dave’s time is taken up by walking his husky, obsessing about his various OLED displays and sweating over the fitness of half a dozen Arsenal players on any given week.&lt;/p&gt; ]]></dc:description>
                                                                                                        <dc:contributor><![CDATA[ Darragh Murphy ]]></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/hqkEHEzLyhJedH8sXiSt4A-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Cyber Monday PC deals]]></media:description>                                                            <media:text><![CDATA[Cyber Monday PC deals]]></media:text>
                                <media:title type="plain"><![CDATA[Cyber Monday PC deals]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/hqkEHEzLyhJedH8sXiSt4A-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If there was ever a time to grab your dream gaming PC, it’s <a href="https://www.tomsguide.com/live/news/cyber-monday-deals-live-2025-from-three-dollars">Cyber Monday</a>. With <a href="https://www.tomsguide.com/computing/gpus/gpu-price-hikes-are-coming-in-2026-so-now-is-the-best-time-to-buy-ive-found-the-best-deals-for-you-to-get-ahead-of-it">GPU and RAM price hikes expected in 2026</a>, now may be the last time as well! So whether you’re after a PS5-level RTX 5060 setup or a full-blown RTX 5090 beast, the Cyber Monday PC gaming deals below can save you serious cash in the long run.</p><p>Right now, you can pick up a the powerful entry level <a href="https://www.newegg.com/abs-cyclone-aqua-gaming-desktop-pc-geforce-rtx-5060-ti-intel-core-i5-14400f-32gb-ddr4-1tb-ssd-ca14400f5060/p/N82E16883360831" target="_blank" rel="nofollow">ABS Cyclone Aqua with RTX 5060 for just $799</a>, or go all-in on an <a href="https://www.dell.com/en-us/shop/desktop-computers/alienware-aurora-gaming-desktop/spd/alienware-aurora-act1250-gaming-desktop/useact1250wcto07" target="_blank" rel="nofollow">Alienware Aurora with RTX 5080 for a massive $950 off</a>! Those alone are standout offers, but there’s plenty more in between — and I’ve rounded up every deal that’s genuinely worth your time.</p><p>Many of the rigs you’ll see below rank among the best gaming PCs you can buy in 2025, so whichever offer catches your eye, you can be confident it’ll handle the latest Steam titles with smooth, steady frame rates.</p><h3 class="article-body__section" id="section-top-picks"><span>Top picks</span></h3><ul><li><strong>ABS Cyclone Aqua (RTX 5060): </strong><a href="https://www.newegg.com/abs-cyclone-aqua-gaming-desktop-pc-geforce-rtx-5060-ti-intel-core-i5-14400f-32gb-ddr4-1tb-ssd-ca14400f5060/p/N82E16883360831" target="_blank" rel="nofollow"><strong>was $1,099 now $799 @ Newegg</strong></a></li><li><strong>iBuyPower Desktop (RTX 5070): </strong><a href="https://www.walmart.com/ip/iBUYPOWER-Y40BI7N5701-Gaming-PC-Desktop-Intel-Ultra-7265F-NVIDIA-RTX-5070-12GB-32GB-DDR5-Non-RGB-RAM-1TB-NVMe-SSD/13510816250" target="_blank" rel="nofollow"><strong>was $1,699 now $1,399 at Walmart</strong></a></li><li><strong>ABS Tempest 4000D (RTX 5070 Ti): </strong><a href="https://www.newegg.com/abs-tempest-ii-aqua-gaming-desktop-pc-geforce-rtx-5070-ti-intel-core-i9-14900kf-32gb-ddr5-2tb-nvme-ssd-ta14900kf5070ti-black/p/N82E16883360934" target="_blank" rel="nofollow"><strong>was $2,699 now $1,849 @ Newegg</strong></a><strong></strong></li><li><strong>Alienware Aurora ACT1250 (RTX 5080): </strong><a href="https://www.dell.com/en-us/shop/desktop-computers/alienware-aurora-gaming-desktop/spd/alienware-aurora-act1250-gaming-desktop/useact1250wcto07" target="_blank" rel="nofollow"><strong>was $3,399 now $2,449 at Dell</strong></a><strong> </strong></li><li><strong>Yeiyan YPA Gaming PC (RTX 5090): </strong><a href="https://www.bestbuy.com/product/yeyian-gaming-pc-amd-ryzen-7-9800x3d-rtx-5090-32gb-gddr7-360mm-aio-2tb-32gb-1000w-platinum-ypa-ms980dc-5901u-black/J3GWPLHV4H" target="_blank" rel="nofollow"><strong>was $4,199 now $3,899 @ Best Buy</strong></a></li></ul><h3 class="article-body__section" id="section-best-cyber-monday-gaming-pc-deals"><span>Best Cyber Monday gaming PC deals</span></h3><div class="product"><a data-dimension112="20d86fb7-fb54-4f3c-9054-71ab79056437" data-action="Deal Block" data-label="For a dirt-cheap gaming PC sporting all that RGB in a clear case, YLZKIX's desktop with a $540 discount has you covered. For 1080p gaming, this will do the trick with its AMD Ryzen 5 5600 CPU, AMD Radeon RX 6600 GPU, 16GB of RAM and a 1TB SSD. For more power down the line, it's always upgradeable, of course." data-dimension48="For a dirt-cheap gaming PC sporting all that RGB in a clear case, YLZKIX's desktop with a $540 discount has you covered. For 1080p gaming, this will do the trick with its AMD Ryzen 5 5600 CPU, AMD Radeon RX 6600 GPU, 16GB of RAM and a 1TB SSD. For more power down the line, it's always upgradeable, of course." data-dimension25="$659" href="https://www.newegg.com/ylzkix-gaming-desktop-pcs-amd-radeon-rx-6600-amd-ryzen-5-5600x-16gb-ddr4-1tb-pcie-ssd-black/p/3D5-007H-00001" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="KKJ6Ay6yA4oweXibUtesMd" name="YLZKIX Gaming PC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/KKJ6Ay6yA4oweXibUtesMd.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>For a dirt-cheap gaming PC sporting all that RGB in a clear case, YLZKIX's desktop with a $540 discount has you covered. For 1080p gaming, this will do the trick with its AMD Ryzen 5 5600 CPU, AMD Radeon RX 6600 GPU, 16GB of RAM and a 1TB SSD. For more power down the line, it's always upgradeable, of course. <a class="view-deal button" href="https://www.newegg.com/ylzkix-gaming-desktop-pcs-amd-radeon-rx-6600-amd-ryzen-5-5600x-16gb-ddr4-1tb-pcie-ssd-black/p/3D5-007H-00001" target="_blank" rel="nofollow" data-dimension112="20d86fb7-fb54-4f3c-9054-71ab79056437" data-action="Deal Block" data-label="For a dirt-cheap gaming PC sporting all that RGB in a clear case, YLZKIX's desktop with a $540 discount has you covered. For 1080p gaming, this will do the trick with its AMD Ryzen 5 5600 CPU, AMD Radeon RX 6600 GPU, 16GB of RAM and a 1TB SSD. For more power down the line, it's always upgradeable, of course." data-dimension48="For a dirt-cheap gaming PC sporting all that RGB in a clear case, YLZKIX's desktop with a $540 discount has you covered. For 1080p gaming, this will do the trick with its AMD Ryzen 5 5600 CPU, AMD Radeon RX 6600 GPU, 16GB of RAM and a 1TB SSD. For more power down the line, it's always upgradeable, of course." data-dimension25="$659">View Deal</a></p></div><div class="product"><a data-dimension112="2bec0158-4e1d-43ee-9cee-442bd4922420" data-action="Deal Block" data-label="For even more power, this tall ABS Cyclone Aqua PC will get you there for just $799! This one comes packed with an Intel Core i5-14400F CPU, an RTX 5060 GPU (8GB), a hefty 32GB of DDR4 RAM and a 1TB SSD. With top-down RGB air coolers, too, expect this machine to stay nice and cool will blazing through games at 1080p." data-dimension48="For even more power, this tall ABS Cyclone Aqua PC will get you there for just $799! This one comes packed with an Intel Core i5-14400F CPU, an RTX 5060 GPU (8GB), a hefty 32GB of DDR4 RAM and a 1TB SSD. With top-down RGB air coolers, too, expect this machine to stay nice and cool will blazing through games at 1080p." data-dimension25="$799" href="https://www.newegg.com/abs-cyclone-aqua-gaming-desktop-pc-geforce-rtx-5060-ti-intel-core-i5-14400f-32gb-ddr4-1tb-ssd-ca14400f5060/p/N82E16883360831" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:125.47%;"><img id="bu3gkzTYAcp3KfwohUzEXo" name="ABS Cyclone Aqua Gaming PC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/bu3gkzTYAcp3KfwohUzEXo.jpg" mos="" align="middle" fullscreen="" width="1280" height="1606" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>For even more power, this tall ABS Cyclone Aqua PC will get you there for just $799! This one comes packed with an Intel Core i5-14400F CPU, an RTX 5060 GPU (8GB), a hefty 32GB of DDR4 RAM and a 1TB SSD. With top-down RGB air coolers, too, expect this machine to stay nice and cool will blazing through games at 1080p. <a class="view-deal button" href="https://www.newegg.com/abs-cyclone-aqua-gaming-desktop-pc-geforce-rtx-5060-ti-intel-core-i5-14400f-32gb-ddr4-1tb-ssd-ca14400f5060/p/N82E16883360831" target="_blank" rel="nofollow" data-dimension112="2bec0158-4e1d-43ee-9cee-442bd4922420" data-action="Deal Block" data-label="For even more power, this tall ABS Cyclone Aqua PC will get you there for just $799! This one comes packed with an Intel Core i5-14400F CPU, an RTX 5060 GPU (8GB), a hefty 32GB of DDR4 RAM and a 1TB SSD. With top-down RGB air coolers, too, expect this machine to stay nice and cool will blazing through games at 1080p." data-dimension48="For even more power, this tall ABS Cyclone Aqua PC will get you there for just $799! This one comes packed with an Intel Core i5-14400F CPU, an RTX 5060 GPU (8GB), a hefty 32GB of DDR4 RAM and a 1TB SSD. With top-down RGB air coolers, too, expect this machine to stay nice and cool will blazing through games at 1080p." data-dimension25="$799">View Deal</a></p></div><div class="product"><a data-dimension112="da7a8ebc-e350-4490-b008-28ed7cc62f30" data-action="Deal Block" data-label="The best upgradable PC with an RTX-5060 for a smidge less than $900? Count me in. That Team Green 50-series GPU is best in class at this price bracket (largely thanks to the super-speedy frame rates DLSS 4 brings into the equation), while its AMD Ryzen 5 8400F CPU and 16GB of DDR5 RAM ensures this is a well-rounded rig for general computing tasks. And not to sound shallow, but that slick white chassis is all kinds of eye-arousing." data-dimension48="The best upgradable PC with an RTX-5060 for a smidge less than $900? Count me in. That Team Green 50-series GPU is best in class at this price bracket (largely thanks to the super-speedy frame rates DLSS 4 brings into the equation), while its AMD Ryzen 5 8400F CPU and 16GB of DDR5 RAM ensures this is a well-rounded rig for general computing tasks. And not to sound shallow, but that slick white chassis is all kinds of eye-arousing." data-dimension25="$879" href="https://www.bestbuy.com/product/hp-omen-35l-gaming-desktop-amd-ryzen-5-8400f-16gb-ddr5-memory-nvidia-geforce-rtx-5060-1tb-ssd-panda-metal/JJGQJH5K5T/sku/6620568" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="JVavtV4EEBndHKqhoikraB" name="HP Omen 35L" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/JVavtV4EEBndHKqhoikraB.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The best upgradable PC with an RTX-5060 for a smidge less than $900? Count me in. That Team Green 50-series GPU is best in class at this price bracket (largely thanks to the super-speedy frame rates DLSS 4 brings into the equation), while its AMD Ryzen 5 8400F CPU and 16GB of DDR5 RAM ensures this is a well-rounded rig for general computing tasks. And not to sound shallow, but that slick white chassis is all kinds of eye-arousing.<a class="view-deal button" href="https://www.bestbuy.com/product/hp-omen-35l-gaming-desktop-amd-ryzen-5-8400f-16gb-ddr5-memory-nvidia-geforce-rtx-5060-1tb-ssd-panda-metal/JJGQJH5K5T/sku/6620568" target="_blank" rel="nofollow" data-dimension112="da7a8ebc-e350-4490-b008-28ed7cc62f30" data-action="Deal Block" data-label="The best upgradable PC with an RTX-5060 for a smidge less than $900? Count me in. That Team Green 50-series GPU is best in class at this price bracket (largely thanks to the super-speedy frame rates DLSS 4 brings into the equation), while its AMD Ryzen 5 8400F CPU and 16GB of DDR5 RAM ensures this is a well-rounded rig for general computing tasks. And not to sound shallow, but that slick white chassis is all kinds of eye-arousing." data-dimension48="The best upgradable PC with an RTX-5060 for a smidge less than $900? Count me in. That Team Green 50-series GPU is best in class at this price bracket (largely thanks to the super-speedy frame rates DLSS 4 brings into the equation), while its AMD Ryzen 5 8400F CPU and 16GB of DDR5 RAM ensures this is a well-rounded rig for general computing tasks. And not to sound shallow, but that slick white chassis is all kinds of eye-arousing." data-dimension25="$879">View Deal</a></p></div><div class="product"><a data-dimension112="c6a3492c-ee2c-409f-b258-d9c3bbb15669" data-action="Deal Block" data-label="Over $900 off a power-packed RTX 5060 gaming PC is always a desktop to keep an eye on, esepcially when it looks this flashy! This AOACE delivering an AMD Ryzen 7 5700X CPU, an Nvidia GeForce RTX 5060 GPU (8GB), 32GB of RAM and a 1TB SSD. Plus, Wi-Fi 6E connectivity and six ARGB fans for good measrue. For under $900, this will breeze through 1080p gaming (and even a big beyond)." data-dimension48="Over $900 off a power-packed RTX 5060 gaming PC is always a desktop to keep an eye on, esepcially when it looks this flashy! This AOACE delivering an AMD Ryzen 7 5700X CPU, an Nvidia GeForce RTX 5060 GPU (8GB), 32GB of RAM and a 1TB SSD. Plus, Wi-Fi 6E connectivity and six ARGB fans for good measrue. For under $900, this will breeze through 1080p gaming (and even a big beyond)." data-dimension25="$889" href="https://www.newegg.com/p/3D5-006G-00042" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:94.30%;"><img id="BNq2asfWxSFARuQ2Btkd9C" name="AOACE Gaming PC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BNq2asfWxSFARuQ2Btkd9C.jpg" mos="" align="middle" fullscreen="" width="1280" height="1207" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Over $900 off a power-packed RTX 5060 gaming PC is always a desktop to keep an eye on, esepcially when it looks this flashy! This AOACE delivering an AMD Ryzen 7 5700X CPU, an Nvidia GeForce RTX 5060 GPU (8GB), 32GB of RAM and a 1TB SSD. Plus, Wi-Fi 6E connectivity and six ARGB fans for good measrue. For under $900, this will breeze through 1080p gaming (and even a big beyond). <a class="view-deal button" href="https://www.newegg.com/p/3D5-006G-00042" target="_blank" rel="nofollow" data-dimension112="c6a3492c-ee2c-409f-b258-d9c3bbb15669" data-action="Deal Block" data-label="Over $900 off a power-packed RTX 5060 gaming PC is always a desktop to keep an eye on, esepcially when it looks this flashy! This AOACE delivering an AMD Ryzen 7 5700X CPU, an Nvidia GeForce RTX 5060 GPU (8GB), 32GB of RAM and a 1TB SSD. Plus, Wi-Fi 6E connectivity and six ARGB fans for good measrue. For under $900, this will breeze through 1080p gaming (and even a big beyond)." data-dimension48="Over $900 off a power-packed RTX 5060 gaming PC is always a desktop to keep an eye on, esepcially when it looks this flashy! This AOACE delivering an AMD Ryzen 7 5700X CPU, an Nvidia GeForce RTX 5060 GPU (8GB), 32GB of RAM and a 1TB SSD. Plus, Wi-Fi 6E connectivity and six ARGB fans for good measrue. For under $900, this will breeze through 1080p gaming (and even a big beyond)." data-dimension25="$889">View Deal</a></p></div><div class="product"><a data-dimension112="2cad6171-75b8-4cfa-b004-90f0aa4e04c1" data-action="Deal Block" data-label="Now $1,300 isn’t chump change, but for that outlay, you can land a very capable gaming PC with a GPU that roughly outdoes the PS5 Pro, without any PSSR upscaling controversy. With all the premium build quality you’d expect from Dell, this attractive mid-tower rocks an Intel Core Ultra 7 265F CPU with 20 cores and 32GB of DDR5 RAM clocked at 5200 MT/s. The 1TB NVMe SSD and 500W PSU are the cherry atop a scrumptious cake." data-dimension48="Now $1,300 isn’t chump change, but for that outlay, you can land a very capable gaming PC with a GPU that roughly outdoes the PS5 Pro, without any PSSR upscaling controversy. With all the premium build quality you’d expect from Dell, this attractive mid-tower rocks an Intel Core Ultra 7 265F CPU with 20 cores and 32GB of DDR5 RAM clocked at 5200 MT/s. The 1TB NVMe SSD and 500W PSU are the cherry atop a scrumptious cake." data-dimension25="$1449" href="https://www.dell.com/en-us/shop/desktop-computers/alienware-aurora-gaming-desktop/spd/alienware-aurora-act1250-gaming-desktop/useact1250wcto14" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="gxNZHv8VDWEhFU22s3ixNG" name="Alienware Aurora R16" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/gxNZHv8VDWEhFU22s3ixNG.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Now $1,300 isn’t chump change, but for that outlay, you can land a very capable gaming PC with a GPU that roughly outdoes the PS5 Pro, without any PSSR upscaling controversy. With all the premium build quality you’d expect from Dell, this attractive mid-tower rocks an Intel Core Ultra 7 265F CPU with 20 cores and 32GB of DDR5 RAM clocked at 5200 MT/s. The 1TB NVMe SSD and 500W PSU are the cherry atop a scrumptious cake. <a class="view-deal button" href="https://www.dell.com/en-us/shop/desktop-computers/alienware-aurora-gaming-desktop/spd/alienware-aurora-act1250-gaming-desktop/useact1250wcto14" target="_blank" rel="nofollow" data-dimension112="2cad6171-75b8-4cfa-b004-90f0aa4e04c1" data-action="Deal Block" data-label="Now $1,300 isn’t chump change, but for that outlay, you can land a very capable gaming PC with a GPU that roughly outdoes the PS5 Pro, without any PSSR upscaling controversy. With all the premium build quality you’d expect from Dell, this attractive mid-tower rocks an Intel Core Ultra 7 265F CPU with 20 cores and 32GB of DDR5 RAM clocked at 5200 MT/s. The 1TB NVMe SSD and 500W PSU are the cherry atop a scrumptious cake." data-dimension48="Now $1,300 isn’t chump change, but for that outlay, you can land a very capable gaming PC with a GPU that roughly outdoes the PS5 Pro, without any PSSR upscaling controversy. With all the premium build quality you’d expect from Dell, this attractive mid-tower rocks an Intel Core Ultra 7 265F CPU with 20 cores and 32GB of DDR5 RAM clocked at 5200 MT/s. The 1TB NVMe SSD and 500W PSU are the cherry atop a scrumptious cake." data-dimension25="$1449">View Deal</a></p></div><div class="product"><a data-dimension112="1a6c42bd-f09d-4ea9-b8c0-de27a2461d35" data-action="Deal Block" data-label="GTA 6 probably won’t launch on Steam until 2027 (or beyond), yet in the here and now, you can enjoy amazing games like Cyberpunk 2077 at max settings at well over 60 FPS thanks to that 5070 GPU, Intel Core Ultra 7 263F CPU and 32GB of DDR5 RAM. 1TB of NVMe storage means you’ll have to be selective with the games you install, yet this is still an enticing deal when you consider what the ROG Xbox Ally X costs." data-dimension48="GTA 6 probably won’t launch on Steam until 2027 (or beyond), yet in the here and now, you can enjoy amazing games like Cyberpunk 2077 at max settings at well over 60 FPS thanks to that 5070 GPU, Intel Core Ultra 7 263F CPU and 32GB of DDR5 RAM. 1TB of NVMe storage means you’ll have to be selective with the games you install, yet this is still an enticing deal when you consider what the ROG Xbox Ally X costs." data-dimension25="$1399" href="https://www.walmart.com/ip/iBUYPOWER-Y40BI7N5701-Gaming-PC-Desktop-Intel-Ultra-7265F-NVIDIA-RTX-5070-12GB-32GB-DDR5-Non-RGB-RAM-1TB-NVMe-SSD/13510816250" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="2CuCsa8SsZMA4CY6HCf6fm" name="iBuyPower Y40 Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2CuCsa8SsZMA4CY6HCf6fm.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>GTA 6 probably won’t launch on Steam until 2027 (or beyond), yet in the here and now, you can enjoy amazing games like Cyberpunk 2077 at max settings at well over 60 FPS thanks to that 5070 GPU, Intel Core Ultra 7 263F CPU and 32GB of DDR5 RAM. 1TB of NVMe storage means you’ll have to be selective with the games you install, yet this is still an enticing deal when you consider what the ROG Xbox Ally X costs. <a class="view-deal button" href="https://www.walmart.com/ip/iBUYPOWER-Y40BI7N5701-Gaming-PC-Desktop-Intel-Ultra-7265F-NVIDIA-RTX-5070-12GB-32GB-DDR5-Non-RGB-RAM-1TB-NVMe-SSD/13510816250" target="_blank" rel="nofollow" data-dimension112="1a6c42bd-f09d-4ea9-b8c0-de27a2461d35" data-action="Deal Block" data-label="GTA 6 probably won’t launch on Steam until 2027 (or beyond), yet in the here and now, you can enjoy amazing games like Cyberpunk 2077 at max settings at well over 60 FPS thanks to that 5070 GPU, Intel Core Ultra 7 263F CPU and 32GB of DDR5 RAM. 1TB of NVMe storage means you’ll have to be selective with the games you install, yet this is still an enticing deal when you consider what the ROG Xbox Ally X costs." data-dimension48="GTA 6 probably won’t launch on Steam until 2027 (or beyond), yet in the here and now, you can enjoy amazing games like Cyberpunk 2077 at max settings at well over 60 FPS thanks to that 5070 GPU, Intel Core Ultra 7 263F CPU and 32GB of DDR5 RAM. 1TB of NVMe storage means you’ll have to be selective with the games you install, yet this is still an enticing deal when you consider what the ROG Xbox Ally X costs." data-dimension25="$1399">View Deal</a></p></div><div class="product"><a data-dimension112="085820ba-cb1e-4000-8771-83c64232bd93" data-action="Deal Block" data-label="Now we're upping that gaming performance. The ABS Stratos Aqua combines an Intel Core Ultra 7 265KF CPU, an RTX 5070 GPU, 32GB of DDR5 RAM and a 2TB SSD to make one powerful desktop for gaming. It will make playing games at 1080p and 1440p shine, and can even manage some 4K settings. Not bad at $900 off!" data-dimension48="Now we're upping that gaming performance. The ABS Stratos Aqua combines an Intel Core Ultra 7 265KF CPU, an RTX 5070 GPU, 32GB of DDR5 RAM and a 2TB SSD to make one powerful desktop for gaming. It will make playing games at 1080p and 1440p shine, and can even manage some 4K settings. Not bad at $900 off!" data-dimension25="$1499" href="https://www.newegg.com/abs-stratos-aqua-gaming-desktop-pc-geforce-rtx-5070-intel-core-ultra-7-265kf-32gb-ddr5-2tb-ssd-sa265kf50703-black/p/N82E16883360915" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="pVjghvX5mqMc6gQ3u4XVAn" name="ABS Stratos Aqua deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/pVjghvX5mqMc6gQ3u4XVAn.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Now we're upping that gaming performance. The ABS Stratos Aqua combines an Intel Core Ultra 7 265KF CPU, an RTX 5070 GPU, 32GB of DDR5 RAM and a 2TB SSD to make one powerful desktop for gaming. It will make playing games at 1080p and 1440p shine, and can even manage some 4K settings. Not bad at $900 off!<a class="view-deal button" href="https://www.newegg.com/abs-stratos-aqua-gaming-desktop-pc-geforce-rtx-5070-intel-core-ultra-7-265kf-32gb-ddr5-2tb-ssd-sa265kf50703-black/p/N82E16883360915" target="_blank" rel="nofollow" data-dimension112="085820ba-cb1e-4000-8771-83c64232bd93" data-action="Deal Block" data-label="Now we're upping that gaming performance. The ABS Stratos Aqua combines an Intel Core Ultra 7 265KF CPU, an RTX 5070 GPU, 32GB of DDR5 RAM and a 2TB SSD to make one powerful desktop for gaming. It will make playing games at 1080p and 1440p shine, and can even manage some 4K settings. Not bad at $900 off!" data-dimension48="Now we're upping that gaming performance. The ABS Stratos Aqua combines an Intel Core Ultra 7 265KF CPU, an RTX 5070 GPU, 32GB of DDR5 RAM and a 2TB SSD to make one powerful desktop for gaming. It will make playing games at 1080p and 1440p shine, and can even manage some 4K settings. Not bad at $900 off!" data-dimension25="$1499">View Deal</a></p></div><div class="product"><a data-dimension112="71ccfc47-3fb8-4c2c-8145-43f1799c9a60" data-action="Deal Block" data-label="Who needs the much-rumored PS6 when you can own an awesome RTX 5070-powered gaming PC right now? Nvidia’s 50-series GPU outstrips the mightily impressive RTX 4080 in terms of raw performance, and once again, DLSS 4 and frame gen help squeeze unbelievable frame rates in even the most demanding games. This rig’s Intel i7 14700F CPU, 32GB of DDR5 RAM, 1TB Gen 4 SSD and 850W PSU means that the aforementioned graphics card isn’t let down by other components." data-dimension48="Who needs the much-rumored PS6 when you can own an awesome RTX 5070-powered gaming PC right now? Nvidia’s 50-series GPU outstrips the mightily impressive RTX 4080 in terms of raw performance, and once again, DLSS 4 and frame gen help squeeze unbelievable frame rates in even the most demanding games. This rig’s Intel i7 14700F CPU, 32GB of DDR5 RAM, 1TB Gen 4 SSD and 850W PSU means that the aforementioned graphics card isn’t let down by other components." data-dimension25="$1599" href="https://www.amazon.com/Skytech-Gaming-Desktop-14700F-5-3GHz/dp/B0DTY34MQX" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="dBTZ9kd8gJXUcoKt4hsag4" name="Skytech King 95" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dBTZ9kd8gJXUcoKt4hsag4.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Who needs the much-rumored PS6 when you can own an awesome RTX 5070-powered gaming PC right now? Nvidia’s 50-series GPU outstrips the mightily impressive RTX 4080 in terms of raw performance, and once again, DLSS 4 and frame gen help squeeze unbelievable frame rates in even the most demanding games. This rig’s Intel i7 14700F CPU, 32GB of DDR5 RAM, 1TB Gen 4 SSD and 850W PSU means that the aforementioned graphics card isn’t let down by other components. <a class="view-deal button" href="https://www.amazon.com/Skytech-Gaming-Desktop-14700F-5-3GHz/dp/B0DTY34MQX" target="_blank" rel="nofollow" data-dimension112="71ccfc47-3fb8-4c2c-8145-43f1799c9a60" data-action="Deal Block" data-label="Who needs the much-rumored PS6 when you can own an awesome RTX 5070-powered gaming PC right now? Nvidia’s 50-series GPU outstrips the mightily impressive RTX 4080 in terms of raw performance, and once again, DLSS 4 and frame gen help squeeze unbelievable frame rates in even the most demanding games. This rig’s Intel i7 14700F CPU, 32GB of DDR5 RAM, 1TB Gen 4 SSD and 850W PSU means that the aforementioned graphics card isn’t let down by other components." data-dimension48="Who needs the much-rumored PS6 when you can own an awesome RTX 5070-powered gaming PC right now? Nvidia’s 50-series GPU outstrips the mightily impressive RTX 4080 in terms of raw performance, and once again, DLSS 4 and frame gen help squeeze unbelievable frame rates in even the most demanding games. This rig’s Intel i7 14700F CPU, 32GB of DDR5 RAM, 1TB Gen 4 SSD and 850W PSU means that the aforementioned graphics card isn’t let down by other components." data-dimension25="$1599">View Deal</a></p></div><div class="product"><a data-dimension112="c296d80e-47bc-42d1-bb3d-6b080c143384" data-action="Deal Block" data-label="A fairly low price for an RTX 5070 Ti gaming rig! Sporting an AMD Ryzen 7 8700F processor combined with 32GB of DDR5 RAM and a 2TB SSD, this MSI Aegis Z2 (which comes in a slick all-black case and all the RGB-lit fans) will push gaming even further than to its top-line 5070 Ti graphics cards. Hard to go wrong here." data-dimension48="A fairly low price for an RTX 5070 Ti gaming rig! Sporting an AMD Ryzen 7 8700F processor combined with 32GB of DDR5 RAM and a 2TB SSD, this MSI Aegis Z2 (which comes in a slick all-black case and all the RGB-lit fans) will push gaming even further than to its top-line 5070 Ti graphics cards. Hard to go wrong here." data-dimension25="$1699" href="https://www.newegg.com/msi-gaming-desktop-pc-geforce-rtx-5070-ti-amd-ryzen-7-8700f-32gb-ddr5-2tb-nvme-ssd-aegis-z2-a8nvr-1611us/p/N82E16883151694" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="bFVkX5h8TJ5VD3riedMvsN" name="MSI Aegis Z2 Gaming PC deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/bFVkX5h8TJ5VD3riedMvsN.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>A fairly low price for an RTX 5070 Ti gaming rig! Sporting an AMD Ryzen 7 8700F processor combined with 32GB of DDR5 RAM and a 2TB SSD, this MSI Aegis Z2 (which comes in a slick all-black case and all the RGB-lit fans) will push gaming even further than to its top-line 5070 Ti graphics cards. Hard to go wrong here. <a class="view-deal button" href="https://www.newegg.com/msi-gaming-desktop-pc-geforce-rtx-5070-ti-amd-ryzen-7-8700f-32gb-ddr5-2tb-nvme-ssd-aegis-z2-a8nvr-1611us/p/N82E16883151694" target="_blank" rel="nofollow" data-dimension112="c296d80e-47bc-42d1-bb3d-6b080c143384" data-action="Deal Block" data-label="A fairly low price for an RTX 5070 Ti gaming rig! Sporting an AMD Ryzen 7 8700F processor combined with 32GB of DDR5 RAM and a 2TB SSD, this MSI Aegis Z2 (which comes in a slick all-black case and all the RGB-lit fans) will push gaming even further than to its top-line 5070 Ti graphics cards. Hard to go wrong here." data-dimension48="A fairly low price for an RTX 5070 Ti gaming rig! Sporting an AMD Ryzen 7 8700F processor combined with 32GB of DDR5 RAM and a 2TB SSD, this MSI Aegis Z2 (which comes in a slick all-black case and all the RGB-lit fans) will push gaming even further than to its top-line 5070 Ti graphics cards. Hard to go wrong here." data-dimension25="$1699">View Deal</a></p></div><div class="product"><a data-dimension112="7dd4b0ec-889c-42d1-b1f6-a1da9e6c4526" data-action="Deal Block" data-label="Now this is one beefy gaming PC. ABS' Tempest 4000D comes with a stunning clear glass side, and you'll find an Intel Core i9-14900Kf CPU, RTX 5070 Ti GPU, 32GB of DDR5 RAM and a 1TB SSD inside its clear case. And lined with RGB fans, no less. It even comes with a mouse and keyboard, and for $850 off, this machine will blaze through the latest PC games at 1440p, and has enough juice for smooth 4K gameplay, too." data-dimension48="Now this is one beefy gaming PC. ABS' Tempest 4000D comes with a stunning clear glass side, and you'll find an Intel Core i9-14900Kf CPU, RTX 5070 Ti GPU, 32GB of DDR5 RAM and a 1TB SSD inside its clear case. And lined with RGB fans, no less. It even comes with a mouse and keyboard, and for $850 off, this machine will blaze through the latest PC games at 1440p, and has enough juice for smooth 4K gameplay, too." data-dimension25="$1849" href="https://www.newegg.com/abs-tempest-ii-aqua-gaming-desktop-pc-geforce-rtx-5070-ti-intel-core-i9-14900kf-32gb-ddr5-2tb-nvme-ssd-ta14900kf5070ti-black/p/N82E16883360934" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="qgV54iFLnpnyYjtoo8YHZN" name="ABS Tempest Aqua deal image" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qgV54iFLnpnyYjtoo8YHZN.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Now this is one beefy gaming PC. ABS' Tempest 4000D comes with a stunning clear glass side, and you'll find an Intel Core i9-14900Kf CPU, RTX 5070 Ti GPU, 32GB of DDR5 RAM and a 1TB SSD inside its clear case. And lined with RGB fans, no less. It even comes with a mouse and keyboard, and for $850 off, this machine will blaze through the latest PC games at 1440p, and has enough juice for smooth 4K gameplay, too. <a class="view-deal button" href="https://www.newegg.com/abs-tempest-ii-aqua-gaming-desktop-pc-geforce-rtx-5070-ti-intel-core-i9-14900kf-32gb-ddr5-2tb-nvme-ssd-ta14900kf5070ti-black/p/N82E16883360934" target="_blank" rel="nofollow" data-dimension112="7dd4b0ec-889c-42d1-b1f6-a1da9e6c4526" data-action="Deal Block" data-label="Now this is one beefy gaming PC. ABS' Tempest 4000D comes with a stunning clear glass side, and you'll find an Intel Core i9-14900Kf CPU, RTX 5070 Ti GPU, 32GB of DDR5 RAM and a 1TB SSD inside its clear case. And lined with RGB fans, no less. It even comes with a mouse and keyboard, and for $850 off, this machine will blaze through the latest PC games at 1440p, and has enough juice for smooth 4K gameplay, too." data-dimension48="Now this is one beefy gaming PC. ABS' Tempest 4000D comes with a stunning clear glass side, and you'll find an Intel Core i9-14900Kf CPU, RTX 5070 Ti GPU, 32GB of DDR5 RAM and a 1TB SSD inside its clear case. And lined with RGB fans, no less. It even comes with a mouse and keyboard, and for $850 off, this machine will blaze through the latest PC games at 1440p, and has enough juice for smooth 4K gameplay, too." data-dimension25="$1849">View Deal</a></p></div><div class="product"><a data-dimension112="107a1460-1800-4786-9da4-3fa010e9e0ad" data-action="Deal Block" data-label="Anyone after peak performance will want to give this ABS Stratos Ruby gaming PC at look. It doesn't pull any punches, with its AMD Ryzen 7 9800X3D CPU, RTX 5080 GPU, 32GB of DDR5 RAM and sizeable 2TB SSD. It's a great-looking tower to boot, fitted with 240mm AIO coolers and Wi-Fi 7 connectivity. Any game at settings cranked up will shine on this machine." data-dimension48="Anyone after peak performance will want to give this ABS Stratos Ruby gaming PC at look. It doesn't pull any punches, with its AMD Ryzen 7 9800X3D CPU, RTX 5080 GPU, 32GB of DDR5 RAM and sizeable 2TB SSD. It's a great-looking tower to boot, fitted with 240mm AIO coolers and Wi-Fi 7 connectivity. Any game at settings cranked up will shine on this machine." data-dimension25="$2299" href="https://www.newegg.com/abs-stratos-ruby-gaming-desktop-pc-geforce-rtx-5080-amd-ryzen-7-9800x3d-32gb-ddr5-2tb-nvme-ssd-sr9800x3d50802-black/p/N82E16883360931" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="RRTvtEud2AavGV4TvBAYYd" name="ABS Stratos Ruby deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/RRTvtEud2AavGV4TvBAYYd.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Anyone after peak performance will want to give this ABS Stratos Ruby gaming PC at look. It doesn't pull any punches, with its AMD Ryzen 7 9800X3D CPU, RTX 5080 GPU, 32GB of DDR5 RAM and sizeable 2TB SSD. It's a great-looking tower to boot, fitted with 240mm AIO coolers and Wi-Fi 7 connectivity. Any game at settings cranked up will shine on this machine. <a class="view-deal button" href="https://www.newegg.com/abs-stratos-ruby-gaming-desktop-pc-geforce-rtx-5080-amd-ryzen-7-9800x3d-32gb-ddr5-2tb-nvme-ssd-sr9800x3d50802-black/p/N82E16883360931" target="_blank" rel="nofollow" data-dimension112="107a1460-1800-4786-9da4-3fa010e9e0ad" data-action="Deal Block" data-label="Anyone after peak performance will want to give this ABS Stratos Ruby gaming PC at look. It doesn't pull any punches, with its AMD Ryzen 7 9800X3D CPU, RTX 5080 GPU, 32GB of DDR5 RAM and sizeable 2TB SSD. It's a great-looking tower to boot, fitted with 240mm AIO coolers and Wi-Fi 7 connectivity. Any game at settings cranked up will shine on this machine." data-dimension48="Anyone after peak performance will want to give this ABS Stratos Ruby gaming PC at look. It doesn't pull any punches, with its AMD Ryzen 7 9800X3D CPU, RTX 5080 GPU, 32GB of DDR5 RAM and sizeable 2TB SSD. It's a great-looking tower to boot, fitted with 240mm AIO coolers and Wi-Fi 7 connectivity. Any game at settings cranked up will shine on this machine." data-dimension25="$2299">View Deal</a></p></div><div class="product"><a data-dimension112="3dc32593-774d-4f52-b111-40c3a5091639" data-action="Deal Block" data-label="Go Pro or go home… or something. Anyway, this beefy gaming PC is currently $300 off, so it’s well worth looking at during Cyber Monday That RTX 5080 (the second fastest GPU on the planet) is ably supported by an Intel Core Ultra 9 285 processor, 32GB of DDR5 RAM and a fairly spacious 2TB NVMe SSD. If the next console generation matches the performance levels this rig is capable of, I’ll be seriously impressed." data-dimension48="Go Pro or go home… or something. Anyway, this beefy gaming PC is currently $300 off, so it’s well worth looking at during Cyber Monday That RTX 5080 (the second fastest GPU on the planet) is ably supported by an Intel Core Ultra 9 285 processor, 32GB of DDR5 RAM and a fairly spacious 2TB NVMe SSD. If the next console generation matches the performance levels this rig is capable of, I’ll be seriously impressed." data-dimension25="$2799" href="https://www.bestbuy.com/product/ibuypower-y40-pro-gaming-desktop-pc-intel-core-ultra-9-285-nvidia-geforce-rtx-5080-16gb-32gb-ddr5-rgb2tb-nvme-black/J3R75JY3T3" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="2CuCsa8SsZMA4CY6HCf6fm" name="iBuyPower Y40 Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2CuCsa8SsZMA4CY6HCf6fm.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Go Pro or go home… or something. Anyway, this beefy gaming PC is currently $300 off, so it’s well worth looking at during Cyber Monday That RTX 5080 (the second fastest GPU on the planet) is ably supported by an Intel Core Ultra 9 285 processor, 32GB of DDR5 RAM and a fairly spacious 2TB NVMe SSD. If the next console generation matches the performance levels this rig is capable of, I’ll be seriously impressed. <a class="view-deal button" href="https://www.bestbuy.com/product/ibuypower-y40-pro-gaming-desktop-pc-intel-core-ultra-9-285-nvidia-geforce-rtx-5080-16gb-32gb-ddr5-rgb2tb-nvme-black/J3R75JY3T3" target="_blank" rel="nofollow" data-dimension112="3dc32593-774d-4f52-b111-40c3a5091639" data-action="Deal Block" data-label="Go Pro or go home… or something. Anyway, this beefy gaming PC is currently $300 off, so it’s well worth looking at during Cyber Monday That RTX 5080 (the second fastest GPU on the planet) is ably supported by an Intel Core Ultra 9 285 processor, 32GB of DDR5 RAM and a fairly spacious 2TB NVMe SSD. If the next console generation matches the performance levels this rig is capable of, I’ll be seriously impressed." data-dimension48="Go Pro or go home… or something. Anyway, this beefy gaming PC is currently $300 off, so it’s well worth looking at during Cyber Monday That RTX 5080 (the second fastest GPU on the planet) is ably supported by an Intel Core Ultra 9 285 processor, 32GB of DDR5 RAM and a fairly spacious 2TB NVMe SSD. If the next console generation matches the performance levels this rig is capable of, I’ll be seriously impressed." data-dimension25="$2799">View Deal</a></p></div><div class="product"><a data-dimension112="aea6152a-0d69-4919-b6f5-70b1c83907e7" data-action="Deal Block" data-label="A high-end, liquid-cooled gaming PC that ticks every box when it comes to top-tier level components. Its RTX 5080 GPU has fantastic backup support in the form of an Intel Core Ultra 9 285 Processor, 1000W power supply and 1TB SSD. The “legend perfected” design houses a clear panel for the case, ensuring you can admire all of these fancy parts whenever you want. Hey, it’s the least a $2,299 investment should provide." data-dimension48="A high-end, liquid-cooled gaming PC that ticks every box when it comes to top-tier level components. Its RTX 5080 GPU has fantastic backup support in the form of an Intel Core Ultra 9 285 Processor, 1000W power supply and 1TB SSD. The “legend perfected” design houses a clear panel for the case, ensuring you can admire all of these fancy parts whenever you want. Hey, it’s the least a $2,299 investment should provide." data-dimension25="$2449" href="https://www.dell.com/en-us/shop/desktop-computers/alienware-aurora-gaming-desktop/spd/alienware-aurora-act1250-gaming-desktop/useact1250wcto07" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="s3ecETdbGMpfFfrrJqr5Hj" name="Alienware Aurora" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/s3ecETdbGMpfFfrrJqr5Hj.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>A high-end, liquid-cooled gaming PC that ticks every box when it comes to top-tier level components. Its RTX 5080 GPU has fantastic backup support in the form of an Intel Core Ultra 9 285 Processor, 1000W power supply and 1TB SSD. The “legend perfected” design houses a clear panel for the case, ensuring you can admire all of these fancy parts whenever you want. Hey, it’s the least a $2,299 investment should provide. <a class="view-deal button" href="https://www.dell.com/en-us/shop/desktop-computers/alienware-aurora-gaming-desktop/spd/alienware-aurora-act1250-gaming-desktop/useact1250wcto07" target="_blank" rel="nofollow" data-dimension112="aea6152a-0d69-4919-b6f5-70b1c83907e7" data-action="Deal Block" data-label="A high-end, liquid-cooled gaming PC that ticks every box when it comes to top-tier level components. Its RTX 5080 GPU has fantastic backup support in the form of an Intel Core Ultra 9 285 Processor, 1000W power supply and 1TB SSD. The “legend perfected” design houses a clear panel for the case, ensuring you can admire all of these fancy parts whenever you want. Hey, it’s the least a $2,299 investment should provide." data-dimension48="A high-end, liquid-cooled gaming PC that ticks every box when it comes to top-tier level components. Its RTX 5080 GPU has fantastic backup support in the form of an Intel Core Ultra 9 285 Processor, 1000W power supply and 1TB SSD. The “legend perfected” design houses a clear panel for the case, ensuring you can admire all of these fancy parts whenever you want. Hey, it’s the least a $2,299 investment should provide." data-dimension25="$2449">View Deal</a></p></div><div class="product"><a data-dimension112="c8b13e5c-e423-4ac5-8eed-c3f8ad4944d4" data-action="Deal Block" data-label="If money is no object, this $300 discount on the Yeyian Gaming PC featuring peak RTX 5090 power won't mean too much. But what will matter is that it's not as pricey as other RTX 5090 machines, and this is no slouch. With an AMD Ryzen 7 9800X3D processor, RTX 5090 GPU, 32GB of RAM and a 2TB SSD, this machine will do it all without fuss." data-dimension48="If money is no object, this $300 discount on the Yeyian Gaming PC featuring peak RTX 5090 power won't mean too much. But what will matter is that it's not as pricey as other RTX 5090 machines, and this is no slouch. With an AMD Ryzen 7 9800X3D processor, RTX 5090 GPU, 32GB of RAM and a 2TB SSD, this machine will do it all without fuss." data-dimension25="$3899" href="https://www.bestbuy.com/product/yeyian-gaming-pc-amd-ryzen-7-9800x3d-rtx-5090-32gb-gddr7-360mm-aio-2tb-32gb-1000w-platinum-ypa-ms980dc-5901u-black/J3GWPLHV4H" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="uNWD74oxX9eB2HdMCewCE" name="Yeyian Gaming PC deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/uNWD74oxX9eB2HdMCewCE.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If money is no object, this $300 discount on the Yeyian Gaming PC featuring peak RTX 5090 power won't mean too much. But what will matter is that it's not as pricey as other RTX 5090 machines, and this is no slouch. With an AMD Ryzen 7 9800X3D processor, RTX 5090 GPU, 32GB of RAM and a 2TB SSD, this machine will do it all without fuss. <a class="view-deal button" href="https://www.bestbuy.com/product/yeyian-gaming-pc-amd-ryzen-7-9800x3d-rtx-5090-32gb-gddr7-360mm-aio-2tb-32gb-1000w-platinum-ypa-ms980dc-5901u-black/J3GWPLHV4H" target="_blank" rel="nofollow" data-dimension112="c8b13e5c-e423-4ac5-8eed-c3f8ad4944d4" data-action="Deal Block" data-label="If money is no object, this $300 discount on the Yeyian Gaming PC featuring peak RTX 5090 power won't mean too much. But what will matter is that it's not as pricey as other RTX 5090 machines, and this is no slouch. With an AMD Ryzen 7 9800X3D processor, RTX 5090 GPU, 32GB of RAM and a 2TB SSD, this machine will do it all without fuss." data-dimension48="If money is no object, this $300 discount on the Yeyian Gaming PC featuring peak RTX 5090 power won't mean too much. But what will matter is that it's not as pricey as other RTX 5090 machines, and this is no slouch. With an AMD Ryzen 7 9800X3D processor, RTX 5090 GPU, 32GB of RAM and a 2TB SSD, this machine will do it all without fuss." data-dimension25="$3899">View Deal</a></p></div><div class="product"><a data-dimension112="48902419-acd0-4474-94b8-b39085623a6e" data-action="Deal Block" data-label="This 4K/120 FPS dream machine can handle even the most demanding of cutting-edge PC titles. This beastly Dell rig hosts a formidable RTX 5090 GPU (the most powerful graphics card in the world), an Intel Core Ultra 9 285K CPU (24 cores) and 32GB of dual-channel DDR5 RAM. The config of the 51 also sports a 2TB NVMe drive and an almighty 1500W PSU, which even Battlefield 6 at 4K won’t overly sweat." data-dimension48="This 4K/120 FPS dream machine can handle even the most demanding of cutting-edge PC titles. This beastly Dell rig hosts a formidable RTX 5090 GPU (the most powerful graphics card in the world), an Intel Core Ultra 9 285K CPU (24 cores) and 32GB of dual-channel DDR5 RAM. The config of the 51 also sports a 2TB NVMe drive and an almighty 1500W PSU, which even Battlefield 6 at 4K won’t overly sweat." data-dimension25="$4249" href="https://www.dell.com/en-us/shop/desktop-computers/alienware-area-51-gaming-desktop/spd/alienware-area-51-aat2250-gaming-desktop/useaat2250wcto11" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="NcFJdoEt5PZvSs7drzH3Rm" name="Alienware Area-51" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NcFJdoEt5PZvSs7drzH3Rm.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This 4K/120 FPS dream machine can handle even the most demanding of cutting-edge PC titles. This beastly Dell rig hosts a formidable RTX 5090 GPU (the most powerful graphics card in the world), an Intel Core Ultra 9 285K CPU (24 cores) and 32GB of dual-channel DDR5 RAM. The config of the 51 also sports a 2TB NVMe drive and an almighty 1500W PSU, which even Battlefield 6 at 4K won’t overly sweat. <a class="view-deal button" href="https://www.dell.com/en-us/shop/desktop-computers/alienware-area-51-gaming-desktop/spd/alienware-area-51-aat2250-gaming-desktop/useaat2250wcto11" target="_blank" rel="nofollow" data-dimension112="48902419-acd0-4474-94b8-b39085623a6e" data-action="Deal Block" data-label="This 4K/120 FPS dream machine can handle even the most demanding of cutting-edge PC titles. This beastly Dell rig hosts a formidable RTX 5090 GPU (the most powerful graphics card in the world), an Intel Core Ultra 9 285K CPU (24 cores) and 32GB of dual-channel DDR5 RAM. The config of the 51 also sports a 2TB NVMe drive and an almighty 1500W PSU, which even Battlefield 6 at 4K won’t overly sweat." data-dimension48="This 4K/120 FPS dream machine can handle even the most demanding of cutting-edge PC titles. This beastly Dell rig hosts a formidable RTX 5090 GPU (the most powerful graphics card in the world), an Intel Core Ultra 9 285K CPU (24 cores) and 32GB of dual-channel DDR5 RAM. The config of the 51 also sports a 2TB NVMe drive and an almighty 1500W PSU, which even Battlefield 6 at 4K won’t overly sweat." data-dimension25="$4249">View Deal</a></p></div><div class="product"><a data-dimension112="38b8a2fc-06be-4277-b738-15c7f8d4aa2b" data-action="Deal Block" data-label="If money is no object, you probably won’t overly care about a $500 discount. Still, even if you’re Scrooge McDuck rich, a saving is still a saving. Putting your hard-earned down on this RTDX 5090/Intel Ultra 9 285K goliath is the equivalent of entering gaming God Mode. With the best of the best hardware at your disposal, even the most demanding of titles should play at 4K/120 FPS. The 2TB SSD also means you won’t have to worry about uninstalling your go-to games all that often." data-dimension48="If money is no object, you probably won’t overly care about a $500 discount. Still, even if you’re Scrooge McDuck rich, a saving is still a saving. Putting your hard-earned down on this RTDX 5090/Intel Ultra 9 285K goliath is the equivalent of entering gaming God Mode. With the best of the best hardware at your disposal, even the most demanding of titles should play at 4K/120 FPS. The 2TB SSD also means you won’t have to worry about uninstalling your go-to games all that often." data-dimension25="$4499" href="https://www.bestbuy.com/product/msi-infinite-rs-ai-gaming-desktop-intel-ultra-9-285k-64gb-memory-nvidia-geforce-rtx-5090-2tb-ssd-black/J3P7TXR72P" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="wySfrGiSZK8YC2U9utiCWf" name="MSI Infinite RS AI" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wySfrGiSZK8YC2U9utiCWf.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If money is no object, you probably won’t overly care about a $500 discount. Still, even if you’re Scrooge McDuck rich, a saving is still a saving. Putting your hard-earned down on this RTDX 5090/Intel Ultra 9 285K goliath is the equivalent of entering gaming God Mode. With the best of the best hardware at your disposal, even the most demanding of titles should play at 4K/120 FPS. The 2TB SSD also means you won’t have to worry about uninstalling your go-to games all that often. <a class="view-deal button" href="https://www.bestbuy.com/product/msi-infinite-rs-ai-gaming-desktop-intel-ultra-9-285k-64gb-memory-nvidia-geforce-rtx-5090-2tb-ssd-black/J3P7TXR72P" target="_blank" rel="nofollow" data-dimension112="38b8a2fc-06be-4277-b738-15c7f8d4aa2b" data-action="Deal Block" data-label="If money is no object, you probably won’t overly care about a $500 discount. Still, even if you’re Scrooge McDuck rich, a saving is still a saving. Putting your hard-earned down on this RTDX 5090/Intel Ultra 9 285K goliath is the equivalent of entering gaming God Mode. With the best of the best hardware at your disposal, even the most demanding of titles should play at 4K/120 FPS. The 2TB SSD also means you won’t have to worry about uninstalling your go-to games all that often." data-dimension48="If money is no object, you probably won’t overly care about a $500 discount. Still, even if you’re Scrooge McDuck rich, a saving is still a saving. Putting your hard-earned down on this RTDX 5090/Intel Ultra 9 285K goliath is the equivalent of entering gaming God Mode. With the best of the best hardware at your disposal, even the most demanding of titles should play at 4K/120 FPS. The 2TB SSD also means you won’t have to worry about uninstalling your go-to games all that often." data-dimension25="$4499">View Deal</a></p></div><div class="product"><a data-dimension112="5e2c0514-3a2a-44ae-83b2-f766f2ed02f5" data-action="Deal Block" data-label="When nothing but the very top of the line will do the job, you need a rig like the Corsair Vengeance i8300. The fastest GPU the world has ever seen in the form of the RTX 5090 is paired with an Intel Core Ultra 9 285K CPU, and a frankly absurd 64GB of DDR5 RAM clocked at 6400 MHz. Add in a 4TB SSD, and you’ll be able to install all of the Steam games on this final level boss-end machine." data-dimension48="When nothing but the very top of the line will do the job, you need a rig like the Corsair Vengeance i8300. The fastest GPU the world has ever seen in the form of the RTX 5090 is paired with an Intel Core Ultra 9 285K CPU, and a frankly absurd 64GB of DDR5 RAM clocked at 6400 MHz. Add in a 4TB SSD, and you’ll be able to install all of the Steam games on this final level boss-end machine." data-dimension25="$6499" href="https://www.bestbuy.com/product/corsair-vengeance-i8300-gaming-desktop-intel-core-ultra-9-285k-64gb-ddr5-6400mhz-nvidia-geforce-5090-2tb-ssd-4tb-ssd-black/J39TSCH45Z" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="kAuL9JuKw5cUVKm8zJ5AtY" name="Corsair Vengeance i8300" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kAuL9JuKw5cUVKm8zJ5AtY.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>When nothing but the very top of the line will do the job, you need a rig like the Corsair Vengeance i8300. The fastest GPU the world has ever seen in the form of the RTX 5090 is paired with an Intel Core Ultra 9 285K CPU, and a frankly absurd 64GB of DDR5 RAM clocked at 6400 MHz. Add in a 4TB SSD, and you’ll be able to install <em>all</em> of the Steam games on this final level boss-end machine. <a class="view-deal button" href="https://www.bestbuy.com/product/corsair-vengeance-i8300-gaming-desktop-intel-core-ultra-9-285k-64gb-ddr5-6400mhz-nvidia-geforce-5090-2tb-ssd-4tb-ssd-black/J39TSCH45Z" target="_blank" rel="nofollow" data-dimension112="5e2c0514-3a2a-44ae-83b2-f766f2ed02f5" data-action="Deal Block" data-label="When nothing but the very top of the line will do the job, you need a rig like the Corsair Vengeance i8300. The fastest GPU the world has ever seen in the form of the RTX 5090 is paired with an Intel Core Ultra 9 285K CPU, and a frankly absurd 64GB of DDR5 RAM clocked at 6400 MHz. Add in a 4TB SSD, and you’ll be able to install all of the Steam games on this final level boss-end machine." data-dimension48="When nothing but the very top of the line will do the job, you need a rig like the Corsair Vengeance i8300. The fastest GPU the world has ever seen in the form of the RTX 5090 is paired with an Intel Core Ultra 9 285K CPU, and a frankly absurd 64GB of DDR5 RAM clocked at 6400 MHz. Add in a 4TB SSD, and you’ll be able to install all of the Steam games on this final level boss-end machine." data-dimension25="$6499">View Deal</a></p></div><h3 class="article-body__section" id="section-shop-today-s-best-cyber-monday-deals"><span>Shop today's best Cyber Monday deals</span></h3><ul><li><strong>Amazon: </strong><a href="https://www.amazon.com/b?node=210998206011" target="_blank" rel="nofollow"><strong>50% off Ring, Ninja, AirPods and more</strong></a><strong></strong></li><li><strong>Walmart Plus: </strong><a href="https://www.walmart.com/plus" target="_blank" rel="nofollow"><strong>50% off @ Walmart</strong></a></li><li><strong>REI: </strong><a href="https://www.rei.com/f/scd-deals" target="_blank" rel="nofollow"><strong>half-off Arc'teryx, Patagonia, more</strong></a><strong></strong></li><li><strong>Dell: </strong><a href="https://www.dell.com/en-us/shop/deals?sortBy=price-ascending" target="_blank" rel="nofollow"><strong>monitors from $69, laptops from $299</strong></a><strong></strong></li><li><strong>Nectar: </strong><a href="https://www.nectarsleep.com/" target="_blank" rel="nofollow"><strong>50% off mattresses + bundles</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/site/all-electronics-on-sale/all-computers-tablets-on-sale/pcmcat1632941704767.c?id=pcmcat1632941704767" target="_blank" rel="nofollow"><strong>laptops from $149</strong></a><strong></strong></li><li><strong>Lenovo: </strong><a href="https://www.lenovo.com/us/en/d/deals/laptops/?IPromoID=LEN380027&sortBy=priceUp" target="_blank" rel="nofollow"><strong>doorbuster deals from $319</strong></a><strong></strong></li><li><strong>Wayfair: </strong><a href="https://www.wayfair.com/daily-sales" target="_blank" rel="nofollow"><strong>up to 80% off home decor</strong></a><strong></strong></li><li><strong>Lululemon: </strong><a href="https://shop.lululemon.com/c/we-made-too-much/n18mhd?Ns=price%7C0" target="_blank" rel="nofollow"><strong>top picks from $9</strong></a><strong></strong></li><li><strong>Newegg: </strong><a href="https://www.newegg.com/Black-November-Early-Access/EventSaleStore/ID-1132" target="_blank" rel="nofollow"><strong>Doorbuster deals from $6</strong></a></li><li><strong>Walmart: </strong><a href="https://www.walmart.com/cp/gifts/3131907" target="_blank" rel="nofollow"><strong>holiday gifts from $15</strong></a></li><li><strong>Birkenstock: </strong><a href="https://www.nordstrom.com/browse/sale?sort=PercentOff&filterByBrand=birkenstock" target="_blank" rel="nofollow"><strong>deals from $20 @ Nordstrom</strong></a><strong></strong></li><li><strong>Saatva: </strong><a href="https://www.saatva.com/mattresses/saatva-classic?utm_source=futurepublishing&utm_medium=affiliate&coupon=awyqqgzvxqicebab" target="_blank" rel="nofollow"><strong>luxury mattresses from $1,099</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Save up to 48% on mini PCs thanks to an incredible ACEMAGIC Black Friday ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/save-up-to-48-percent-on-mini-pcs-thanks-to-an-incredible-acemagic-black-friday</link>
                                                                            <description>
                            <![CDATA[ ACEMAGIC Black Friday! Save up to 48% on mini PCs - Get the Mini Gaming PC for a record-low $588 ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">EvS3p2vnP52Rt53T8QNRJd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ThzTgCDLKk2WVAagRpb8Xg-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 26 Nov 2025 16:24:38 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                                    <dc:creator><![CDATA[ Paul Hatton ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/yFZfUBGGs822CgbDU8DvVF.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/ThzTgCDLKk2WVAagRpb8Xg-1280-80.jpg">
                                                            <media:credit><![CDATA[Acemagic]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Acemagic]]></media:description>                                                            <media:text><![CDATA[Acemagic]]></media:text>
                                <media:title type="plain"><![CDATA[Acemagic]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ThzTgCDLKk2WVAagRpb8Xg-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Not only does Acemagic manufacture some of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a> around, but right now they're running a <a href="https://www.amazon.co.uk/stores/page/2D0D2CCA-C37D-4AC6-A2F3-0B8B5EEFEEE0/?_encoding=UTF8&aref=Apm0xaqa2b&pd_rd_plhdr=t&pd_rd_i=B0D5Y92DWS&ref_=sbx_be_s_sparkle_ssd_logo&store_ref=SBV_A05553152Q7XOQ7KZ4UL6-A07811962DJ0Y2ZU1LB1R&lp_asins=B0D5Y92DWS&pd_rd_w=kBjRc&content-id=amzn1.sym.7d8787df-7d4c-460d-ab31-21b0ba272b2f%3Aamzn1.sym.7d8787df-7d4c-460d-ab31-21b0ba272b2f&pf_rd_p=7d8787df-7d4c-460d-ab31-21b0ba272b2f&pf_rd_r=FTM9V6NZKBGHYRK2NDR2&pd_rd_wg=IDRh0&pd_rd_r=f78a8ee1-110b-48d9-9c4d-f8d12928cdc6">Black Friday Sale that gives customers up to 48% off</a>. That means you're guaranteed to get top performance for a fraction of the price you'd normally be expect to pay.</p><p>One of our top picks is the <a href="https://www.amazon.com/dp/B0FQJL21TD?th=1">Mini Gaming PC, which is now available for just $588 (was $856)</a>. That's a record-low price and an ideal solution for gamers. To get the discounted price, you'll need to enter our exclusive code: <strong>P7GHSI9S</strong>.</p><p>We also want to highlight the <a href="https://www.amazon.com/dp/B0FG7YD2D8?th=1">M1 Mini PC, which is on sale for only $413.90 (was $799.99)</a>. This is also a lifetime low price, but again you'll need our exclusive code, <strong>O9WQI9VY</strong>, to secure the deal.</p><p>These are limited-time deals that won't be around for long, so if you're looking to invest in your next PC and want something super compact, these deals are worthy of your consideration.</p><h2 id="today-s-best-acemagic-mini-pc-deals-4">Today's best Acemagic Mini PC deals</h2><div class="product"><a data-dimension112="6ddf22cc-e490-4342-9beb-9e4e255caae2" data-action="Deal Block" data-label="A mini PC with an Intel i9 13900HK processor and 32GB of RAM. It also boasts a generous 1TB SSD for storing all your files locally. With it being a mini PC, you're getting a whole lot of power in a super compact size.Use our exclusive code: P7GHSI9S" data-dimension48="A mini PC with an Intel i9 13900HK processor and 32GB of RAM. It also boasts a generous 1TB SSD for storing all your files locally. With it being a mini PC, you're getting a whole lot of power in a super compact size.Use our exclusive code: P7GHSI9S" data-dimension25="$588" href="https://www.amazon.com/dp/B0FQJL21TD?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="7u8wZfUNU7vHNBqE9G4XUo" name="ACEMAGIC Mini Gaming PC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7u8wZfUNU7vHNBqE9G4XUo.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>A mini PC with an Intel i9 13900HK processor and 32GB of RAM. It also boasts a generous 1TB SSD for storing all your files locally. With it being a mini PC, you're getting a whole lot of power in a super compact size.</p><p><strong>Use our exclusive code: </strong>P7GHSI9S<a class="view-deal button" href="https://www.amazon.com/dp/B0FQJL21TD?th=1" target="_blank" rel="nofollow" data-dimension112="6ddf22cc-e490-4342-9beb-9e4e255caae2" data-action="Deal Block" data-label="A mini PC with an Intel i9 13900HK processor and 32GB of RAM. It also boasts a generous 1TB SSD for storing all your files locally. With it being a mini PC, you're getting a whole lot of power in a super compact size.Use our exclusive code: P7GHSI9S" data-dimension48="A mini PC with an Intel i9 13900HK processor and 32GB of RAM. It also boasts a generous 1TB SSD for storing all your files locally. With it being a mini PC, you're getting a whole lot of power in a super compact size.Use our exclusive code: P7GHSI9S" data-dimension25="$588">View Deal</a></p></div><div class="product"><a data-dimension112="1ad3be59-4e1b-4326-8e35-0325eb83e15f" data-action="Deal Block" data-label="Boasting a super-fast Intel Core i9-11900H processor with 32GB of RAM, the M1 Mini PC guarantees desktop-class performance despite being housed in a highly compact form factor. Additionally, the inclusion of a 1TB SSD will enable users to store all their files, photos, and videos locally. Get all this and more for an unbelievable 46% off.Use our exclusive code: O9WQI9VY" data-dimension48="Boasting a super-fast Intel Core i9-11900H processor with 32GB of RAM, the M1 Mini PC guarantees desktop-class performance despite being housed in a highly compact form factor. Additionally, the inclusion of a 1TB SSD will enable users to store all their files, photos, and videos locally. Get all this and more for an unbelievable 46% off.Use our exclusive code: O9WQI9VY" data-dimension25="$413.90" href="https://www.amazon.com/dp/B0FG7YD2D8?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="q27ziRkMpjuusvYapZxyV6" name="ACEMAGIC M1 Mini PC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/q27ziRkMpjuusvYapZxyV6.jpg" mos="" align="middle" fullscreen="" width="679" height="679" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Boasting a super-fast Intel Core i9-11900H processor with 32GB of RAM, the M1 Mini PC guarantees desktop-class performance despite being housed in a highly compact form factor. Additionally, the inclusion of a 1TB SSD will enable users to store all their files, photos, and videos locally. Get all this and more for an unbelievable 46% off.</p><p><strong>Use our exclusive code: </strong>O9WQI9VY<a class="view-deal button" href="https://www.amazon.com/dp/B0FG7YD2D8?th=1" target="_blank" rel="nofollow" data-dimension112="1ad3be59-4e1b-4326-8e35-0325eb83e15f" data-action="Deal Block" data-label="Boasting a super-fast Intel Core i9-11900H processor with 32GB of RAM, the M1 Mini PC guarantees desktop-class performance despite being housed in a highly compact form factor. Additionally, the inclusion of a 1TB SSD will enable users to store all their files, photos, and videos locally. Get all this and more for an unbelievable 46% off.Use our exclusive code: O9WQI9VY" data-dimension48="Boasting a super-fast Intel Core i9-11900H processor with 32GB of RAM, the M1 Mini PC guarantees desktop-class performance despite being housed in a highly compact form factor. Additionally, the inclusion of a 1TB SSD will enable users to store all their files, photos, and videos locally. Get all this and more for an unbelievable 46% off.Use our exclusive code: O9WQI9VY" data-dimension25="$413.90">View Deal</a></p></div><p>Mini PCs are designed to be as small as possible while still packing a whole load of performance. This makes them an ideal solution for a wide range of tasks, including office work, web browsing, and carrying out school work.</p><p>Aside from their performance, one of their biggest selling points is their size. Thanks to their small form factor, they're ideal for anyone working in compact spaces who lacks the room for a large desktop tower. They're also oftentimes more affordable than an equivalent laptop, which is definitely the case with these two deals.</p><p>If you'd like to explore other ways to save, then we recommend checking out the <a href="https://www.amazon.com/stores/ACEMAGIC/page/5BF995C2-098C-4C87-9DE4-70D955E4C902?lp_asin=B0FG7YD2D8&ref_=ast_bln&store_ref=bl_ast_dp_brandLogo_sto">ACEMAGIC Amazon store</a>.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ A major RAM price rise will impact laptops, PCs and GPUs in 2026 — Black Friday is your only chance to survive the surge ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/a-major-memory-price-surge-is-coming-for-laptops-pcs-gpus-and-ram-in-2026-black-friday-is-your-only-chance-to-survive-the-surge</link>
                                                                            <description>
                            <![CDATA[ With RAM and SSD chip prices set to skyrocket in 2026, Black Friday could be your last chance to get a laptop or PC for a reasonable price. Let me explain why. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">a23u47hVMx44iDnnEFiuqR</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/w3S2DDGreTPqZKVHeWN6ZY-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 26 Nov 2025 09:30:00 +0000</pubDate>                                                                                                                                <updated>Wed, 03 Dec 2025 20:34:07 +0000</updated>
                                                                                                                                            <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[GPUs]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                    <category><![CDATA[Computing Hardware]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/w3S2DDGreTPqZKVHeWN6ZY-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[memory price increase]]></media:description>                                                            <media:text><![CDATA[memory price increase]]></media:text>
                                <media:title type="plain"><![CDATA[memory price increase]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/w3S2DDGreTPqZKVHeWN6ZY-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The price of laptops, tablets, GPUs and PC components has already been under pressure this year. But now, thanks to the skyrocketing cost of RAM and SSD storage chips, it's looking like retail prices for tech could moon in 2026.</p><p>Look, I know you're hearing a whole lot about <a href="https://www.tomsguide.com/sales-events/black-friday-sales-from-usd10-at-amazon-walmart-and-best-buy-49-best-deals-to-shop-right-now">Black Friday deals</a> right now, so I'll try to not make this sound too dramatic. But this year's sales season could be the last chance you get computing tech at these prices before huge increase next year.</p><p>...well the whole not sounding "too dramatic" didn't last long. But the point stands! Let me explain.</p><h2 id="what-s-happening">What’s happening?</h2><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="TthW87j4P6tWoGmEg6GGFh" name="GTC October 2025 Keynote with NVIDIA CEO Jensen Huang 1-57-9 screenshot" alt="Nvidia GTC" src="https://cdn.mos.cms.futurecdn.net/TthW87j4P6tWoGmEg6GGFh.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The problem has been quietly growing throughout 2026, but now it's here with a bang thanks to the AI boom. You see, to run the likes of <a href="https://www.tomsguide.com/news/chatgpt">ChatGPT</a> and <a href="https://www.tomsguide.com/ai/google-gemini/gemini-3-is-here-googles-most-powerful-ai-model-yet-is-crushing-benchmarks-improving-search-and-outperforming-chatgpt">Gemini</a>, AI companies need to buy a whole lot of silicon for its data centers to handle all of your prompts. The critical chips in all of this are DRAM (Dynamic Random-Access Memory) and NAND flash, but you may know them by their other names: RAM and SSD storage respectively.</p><p>As the demand for these chips started to skyrocket because of this boom, two things have happened:</p><ul><li>The companies that manufacture these types of chips are seeing demand for cheaper, older memory chips vanish, given their biggest customers (companies behind the AI boom) are throwing handfuls of cash at them for the latest stuff. So these older options are being phased out.</li><li>Smaller NAND flash chips are being deprioritized in favor of the highest bidders looking to pack their AI data centers with tons of memory.</li></ul><p>Both of these together are leading to drastic silicon shortages, which are in turn leading to higher manufacturing costs for PC and smartphone brands, and inevitably, price jumps for us.</p><h2 id="how-bad-could-it-be">How bad could it be?</h2><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="aoBZKALhPXEmmddqALGdtG" name="Asus Zenbook A14" alt="Asus Zenbook A14" src="https://cdn.mos.cms.futurecdn.net/aoBZKALhPXEmmddqALGdtG.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>In one word: bad. In two words: real bad.</p><p>One place we can already see it happening in real-time is with DDR5 RAM kits you can buy for your desktop PC. People are finding prices are <a href="https://www.guru3d.com/story/dram-prices-surge-roughly-as-global-memory-shortage-deepens/" target="_blank">up to 171% higher compared to 2024</a>. Looking at what I’ve been tracking to buy — the <a href="https://www.amazon.com/Crucial-6400MHz-Overclocking-Desktop-Compatible/dp/B0FQMLKVLS" target="_blank" rel="nofollow">Crucial Pro 32GB DDR5 kit</a> was $174.99, and it’s now $300 in just over one month. That is astonishing.</p><p>As for laptops, TrendForce’s latest investigation (reported by <a href="https://www.techpowerup.com/342971/rising-memory-prices-weigh-on-consumer-markets-affecting-smartphones-and-notebooks-in-2026" target="_blank">TechPowerUp</a>) has this pinned at a predicted 5-15% price rise in 2026. Meanwhile, AMD and Nvidia are already signaling price hikes for their GPUs, and this could be by at least 10%. Combine GPU and RAM jumps, and that could be a massive increase for prebuilt PCs.</p><h2 id="but-there-is-a-small-window-of-hope">But there is a small window of hope</h2><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="6eoMxSqtbMGRdHK3cHaoGm" name="Asus zenbook a14" alt="Asus zenbook a14" src="https://cdn.mos.cms.futurecdn.net/6eoMxSqtbMGRdHK3cHaoGm.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Luckily, a lot of companies do pay attention to this stuff and plan ahead — stockpiling the chips they need to prepare for high demand moments (like Black Friday).</p><p>That is why I can confidently say that this is your last chance to grab a laptop, GPU or PC before the big old price surge takes effect. The only one to <a href="https://www.bloomberg.com/news/articles/2025-11-24/lenovo-stockpiling-pc-memory-due-to-unprecedented-ai-squeeze" target="_blank">publicly acknowledge this is happening is Lenovo</a>, but I know other companies are too.</p><p>So what you have between now and the end of Cyber Monday is a final chance to grab a laptop at MSRP, a GPU at slightly below MSRP, and a desktop at a reasonable price before the memory surge sends those prices up in smoke.</p><h2 id="surge-proof-black-friday-tech-deals">Surge-proof Black Friday tech deals</h2><h3 class="article-body__section" id="section-laptop-deals"><span>Laptop deals</span></h3><div class="product"><a data-dimension112="b5ea1257-7fd7-4024-8e04-e634caf9990d" data-action="Deal Block" data-label="13-inch MacBook Air M4" data-dimension48="13-inch MacBook Air M4" data-dimension25="$749" href="https://www.amazon.com/Apple-2025-MacBook-13-inch-Laptop/dp/B0DZD9S5GC" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="jaozhA6DUqwVKiykJv3KGG" name="macbook air m4  13inch" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/jaozhA6DUqwVKiykJv3KGG.png" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is the lowest price I've ever seen for the <a href="https://www.tomsguide.com/computing/laptops/macbook-air-m4-review" data-dimension112="b5ea1257-7fd7-4024-8e04-e634caf9990d" data-action="Deal Block" data-label="13-inch MacBook Air M4" data-dimension48="13-inch MacBook Air M4" data-dimension25="$749">13-inch MacBook Air M4</a>, making this remarkably fast and long-lasting ultraportable far more affordable. This is the entry-level model with 16GB of RAM and a 256GB SSD, but the more powerful models are also on sale if you'd rather have more memory!<br><strong>MacBook Air 13" M4 (16GB/512GB): </strong><a href="https://www.amazon.com/Apple-2025-MacBook-13-inch-Laptop/dp/B0DZD96R5S" target="_blank" rel="nofollow"><strong>was $1,199 now $949</strong></a><br><strong>MacBook Air 13" M4 (24GB/512GB): </strong><a href="https://www.amazon.com/Apple-2025-MacBook-13-inch-Laptop/dp/B0DZDBHQPQ" target="_blank" rel="nofollow"><strong>was $1,399 now $1,149</strong></a><a class="view-deal button" href="https://www.amazon.com/Apple-2025-MacBook-13-inch-Laptop/dp/B0DZD9S5GC" target="_blank" rel="nofollow" data-dimension112="b5ea1257-7fd7-4024-8e04-e634caf9990d" data-action="Deal Block" data-label="13-inch MacBook Air M4" data-dimension48="13-inch MacBook Air M4" data-dimension25="$749">View Deal</a></p></div><div class="product"><a data-dimension112="ad2833d9-9d48-48da-aff6-0695928eaaa1" data-action="Deal Block" data-label="Looking for plenty of heat under the hood? Then you'll want to save $400 on this Acer Predator Helios Neo 16S AI. Why? Because it boasts an Intel Core Ultra 9 275HX CPU, RTX 5070 Ti GPU, 32GB of RAM and a 1TB SSD. And that display? Expect a 16-inch QHD+ (2560 x 1600) OLED panel with a whopping 240Hz refresh rate. Worthwhile? You know it." data-dimension48="Looking for plenty of heat under the hood? Then you'll want to save $400 on this Acer Predator Helios Neo 16S AI. Why? Because it boasts an Intel Core Ultra 9 275HX CPU, RTX 5070 Ti GPU, 32GB of RAM and a 1TB SSD. And that display? Expect a 16-inch QHD+ (2560 x 1600) OLED panel with a whopping 240Hz refresh rate. Worthwhile? You know it." data-dimension25="$1499" href="https://www.bestbuy.com/product/acer-predator-helios-neo-16s-ai-gaming-laptop-16-oled-240hz-intel-core-ultra-9-nvidia-geforce-rtx-5070ti-32gb-1tb-obsidian-black/JJ8V8H38XT" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1146px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="nH4QZDnHdDupUwLhE6eFpj" name="Acer Predator Helios Neo 16S AI" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/nH4QZDnHdDupUwLhE6eFpj.jpg" mos="" align="middle" fullscreen="" width="1146" height="1146" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Looking for plenty of heat under the hood? Then you'll want to save $400 on this Acer Predator Helios Neo 16S AI. Why? Because it boasts an Intel Core Ultra 9 275HX CPU, RTX 5070 Ti GPU, 32GB of RAM and a 1TB SSD. And that display? Expect a 16-inch QHD+ (2560 x 1600) OLED panel with a whopping 240Hz refresh rate. Worthwhile? You know it. <a class="view-deal button" href="https://www.bestbuy.com/product/acer-predator-helios-neo-16s-ai-gaming-laptop-16-oled-240hz-intel-core-ultra-9-nvidia-geforce-rtx-5070ti-32gb-1tb-obsidian-black/JJ8V8H38XT" target="_blank" rel="nofollow" data-dimension112="ad2833d9-9d48-48da-aff6-0695928eaaa1" data-action="Deal Block" data-label="Looking for plenty of heat under the hood? Then you'll want to save $400 on this Acer Predator Helios Neo 16S AI. Why? Because it boasts an Intel Core Ultra 9 275HX CPU, RTX 5070 Ti GPU, 32GB of RAM and a 1TB SSD. And that display? Expect a 16-inch QHD+ (2560 x 1600) OLED panel with a whopping 240Hz refresh rate. Worthwhile? You know it." data-dimension48="Looking for plenty of heat under the hood? Then you'll want to save $400 on this Acer Predator Helios Neo 16S AI. Why? Because it boasts an Intel Core Ultra 9 275HX CPU, RTX 5070 Ti GPU, 32GB of RAM and a 1TB SSD. And that display? Expect a 16-inch QHD+ (2560 x 1600) OLED panel with a whopping 240Hz refresh rate. Worthwhile? You know it." data-dimension25="$1499">View Deal</a></p></div><div class="product"><a data-dimension112="e7c5914e-d000-4c54-913e-dd43fe24a1e0" data-action="Deal Block" data-label="The discount is minor on paper, but this is actually a drop from $899 and the lowest price on this MacBook Air competitor — packing a gorgeous OLED display, Snapdragon X, 16GB DDR5 RAM and a 512GB SSD in a slim body that weighs just under a kilogram." data-dimension48="The discount is minor on paper, but this is actually a drop from $899 and the lowest price on this MacBook Air competitor — packing a gorgeous OLED display, Snapdragon X, 16GB DDR5 RAM and a 512GB SSD in a slim body that weighs just under a kilogram." data-dimension25="$699" href="https://www.amazon.com/ASUS-Ultrathin-Snapdragon%C2%AE-Processor-UX3407QA-DS52-CB/dp/B0DV9YB8PP" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:69.80%;"><img id="uCD8EBfqp8eebEzDPju39f" name="Asus Zenbook 14 OLED.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/uCD8EBfqp8eebEzDPju39f.jpg" mos="" align="middle" fullscreen="" width="1000" height="698" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The discount is minor on paper, but this is actually a drop from $899 and the lowest price on this MacBook Air competitor — packing a gorgeous OLED display, Snapdragon X, 16GB DDR5 RAM and a 512GB SSD in a slim body that weighs just under a kilogram.<a class="view-deal button" href="https://www.amazon.com/ASUS-Ultrathin-Snapdragon%C2%AE-Processor-UX3407QA-DS52-CB/dp/B0DV9YB8PP" target="_blank" rel="nofollow" data-dimension112="e7c5914e-d000-4c54-913e-dd43fe24a1e0" data-action="Deal Block" data-label="The discount is minor on paper, but this is actually a drop from $899 and the lowest price on this MacBook Air competitor — packing a gorgeous OLED display, Snapdragon X, 16GB DDR5 RAM and a 512GB SSD in a slim body that weighs just under a kilogram." data-dimension48="The discount is minor on paper, but this is actually a drop from $899 and the lowest price on this MacBook Air competitor — packing a gorgeous OLED display, Snapdragon X, 16GB DDR5 RAM and a 512GB SSD in a slim body that weighs just under a kilogram." data-dimension25="$699">View Deal</a></p></div><h3 class="article-body__section" id="section-desktop-pc-deals"><span>Desktop PC deals</span></h3><div class="product"><a data-dimension112="22445684-dc61-4f92-8175-f2b71b4863a3" data-action="Deal Block" data-label="Over $900 off a power-packed RTX 5060 gaming PC is always a desktop to keep an eye on, esepcially when it looks this flashy! This AOACE delivering an AMD Ryzen 7 5700X CPU, an Nvidia GeForce RTX 5060 GPU (8GB), 32GB of RAM and a 1TB SSD. Plus, Wi-Fi 6E connectivity and six ARGB fans for good measrue. For under $900, this will breeze through 1080p gaming (and even a big beyond)." data-dimension48="Over $900 off a power-packed RTX 5060 gaming PC is always a desktop to keep an eye on, esepcially when it looks this flashy! This AOACE delivering an AMD Ryzen 7 5700X CPU, an Nvidia GeForce RTX 5060 GPU (8GB), 32GB of RAM and a 1TB SSD. Plus, Wi-Fi 6E connectivity and six ARGB fans for good measrue. For under $900, this will breeze through 1080p gaming (and even a big beyond)." data-dimension25="$889" href="https://www.newegg.com/p/3D5-006G-00042" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:94.30%;"><img id="BNq2asfWxSFARuQ2Btkd9C" name="AOACE Gaming PC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BNq2asfWxSFARuQ2Btkd9C.jpg" mos="" align="middle" fullscreen="" width="1280" height="1207" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Over $900 off a power-packed RTX 5060 gaming PC is always a desktop to keep an eye on, esepcially when it looks this flashy! This AOACE delivering an AMD Ryzen 7 5700X CPU, an Nvidia GeForce RTX 5060 GPU (8GB), 32GB of RAM and a 1TB SSD. Plus, Wi-Fi 6E connectivity and six ARGB fans for good measrue. For under $900, this will breeze through 1080p gaming (and even a big beyond). <a class="view-deal button" href="https://www.newegg.com/p/3D5-006G-00042" target="_blank" rel="nofollow" data-dimension112="22445684-dc61-4f92-8175-f2b71b4863a3" data-action="Deal Block" data-label="Over $900 off a power-packed RTX 5060 gaming PC is always a desktop to keep an eye on, esepcially when it looks this flashy! This AOACE delivering an AMD Ryzen 7 5700X CPU, an Nvidia GeForce RTX 5060 GPU (8GB), 32GB of RAM and a 1TB SSD. Plus, Wi-Fi 6E connectivity and six ARGB fans for good measrue. For under $900, this will breeze through 1080p gaming (and even a big beyond)." data-dimension48="Over $900 off a power-packed RTX 5060 gaming PC is always a desktop to keep an eye on, esepcially when it looks this flashy! This AOACE delivering an AMD Ryzen 7 5700X CPU, an Nvidia GeForce RTX 5060 GPU (8GB), 32GB of RAM and a 1TB SSD. Plus, Wi-Fi 6E connectivity and six ARGB fans for good measrue. For under $900, this will breeze through 1080p gaming (and even a big beyond)." data-dimension25="$889">View Deal</a></p></div><div class="product"><a data-dimension112="16cf463d-3ed2-4ad6-b711-25d355ae5133" data-action="Deal Block" data-label="GTA 6 probably won’t launch on Steam until 2027 (or beyond), yet in the here and now, you can enjoy amazing games like Cyberpunk 2077 at max settings at well over 60 FPS thanks to that 5070 GPU, Intel Core Ultra 7 263F CPU and 32GB of DDR5 RAM. 1TB of NVMe storage means you’ll have to be selective with the games you install, yet this is still an enticing deal when you consider what the ROG Xbox Ally X costs." data-dimension48="GTA 6 probably won’t launch on Steam until 2027 (or beyond), yet in the here and now, you can enjoy amazing games like Cyberpunk 2077 at max settings at well over 60 FPS thanks to that 5070 GPU, Intel Core Ultra 7 263F CPU and 32GB of DDR5 RAM. 1TB of NVMe storage means you’ll have to be selective with the games you install, yet this is still an enticing deal when you consider what the ROG Xbox Ally X costs." data-dimension25="$1399" href="https://www.walmart.com/ip/iBUYPOWER-Y40BI7N5701-Gaming-PC-Desktop-Intel-Ultra-7265F-NVIDIA-RTX-5070-12GB-32GB-DDR5-Non-RGB-RAM-1TB-NVMe-SSD/13510816250" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="2CuCsa8SsZMA4CY6HCf6fm" name="iBuyPower Y40 Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2CuCsa8SsZMA4CY6HCf6fm.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>GTA 6 probably won’t launch on Steam until 2027 (or beyond), yet in the here and now, you can enjoy amazing games like Cyberpunk 2077 at max settings at well over 60 FPS thanks to that 5070 GPU, Intel Core Ultra 7 263F CPU and 32GB of DDR5 RAM. 1TB of NVMe storage means you’ll have to be selective with the games you install, yet this is still an enticing deal when you consider what the ROG Xbox Ally X costs. <a class="view-deal button" href="https://www.walmart.com/ip/iBUYPOWER-Y40BI7N5701-Gaming-PC-Desktop-Intel-Ultra-7265F-NVIDIA-RTX-5070-12GB-32GB-DDR5-Non-RGB-RAM-1TB-NVMe-SSD/13510816250" target="_blank" rel="nofollow" data-dimension112="16cf463d-3ed2-4ad6-b711-25d355ae5133" data-action="Deal Block" data-label="GTA 6 probably won’t launch on Steam until 2027 (or beyond), yet in the here and now, you can enjoy amazing games like Cyberpunk 2077 at max settings at well over 60 FPS thanks to that 5070 GPU, Intel Core Ultra 7 263F CPU and 32GB of DDR5 RAM. 1TB of NVMe storage means you’ll have to be selective with the games you install, yet this is still an enticing deal when you consider what the ROG Xbox Ally X costs." data-dimension48="GTA 6 probably won’t launch on Steam until 2027 (or beyond), yet in the here and now, you can enjoy amazing games like Cyberpunk 2077 at max settings at well over 60 FPS thanks to that 5070 GPU, Intel Core Ultra 7 263F CPU and 32GB of DDR5 RAM. 1TB of NVMe storage means you’ll have to be selective with the games you install, yet this is still an enticing deal when you consider what the ROG Xbox Ally X costs." data-dimension25="$1399">View Deal</a></p></div><div class="product"><a data-dimension112="cf3f0d6d-a579-4560-b05a-5fba2383cb9c" data-action="Deal Block" data-label="A fairly low price for an RTX 5070 Ti gaming rig! Sporting an AMD Ryzen 7 8700F processor combined with 32GB of DDR5 RAM and a 2TB SSD, this MSI Aegis Z2 (which comes in a slick all-black case and all the RGB-lit fans) will push gaming even further than to its top-line 5070 Ti graphics cards. Hard to go wrong here." data-dimension48="A fairly low price for an RTX 5070 Ti gaming rig! Sporting an AMD Ryzen 7 8700F processor combined with 32GB of DDR5 RAM and a 2TB SSD, this MSI Aegis Z2 (which comes in a slick all-black case and all the RGB-lit fans) will push gaming even further than to its top-line 5070 Ti graphics cards. Hard to go wrong here." data-dimension25="$1699" href="https://www.newegg.com/msi-gaming-desktop-pc-geforce-rtx-5070-ti-amd-ryzen-7-8700f-32gb-ddr5-2tb-nvme-ssd-aegis-z2-a8nvr-1611us/p/N82E16883151694" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="bFVkX5h8TJ5VD3riedMvsN" name="MSI Aegis Z2 Gaming PC deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/bFVkX5h8TJ5VD3riedMvsN.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>A fairly low price for an RTX 5070 Ti gaming rig! Sporting an AMD Ryzen 7 8700F processor combined with 32GB of DDR5 RAM and a 2TB SSD, this MSI Aegis Z2 (which comes in a slick all-black case and all the RGB-lit fans) will push gaming even further than to its top-line 5070 Ti graphics cards. Hard to go wrong here. <a class="view-deal button" href="https://www.newegg.com/msi-gaming-desktop-pc-geforce-rtx-5070-ti-amd-ryzen-7-8700f-32gb-ddr5-2tb-nvme-ssd-aegis-z2-a8nvr-1611us/p/N82E16883151694" target="_blank" rel="nofollow" data-dimension112="cf3f0d6d-a579-4560-b05a-5fba2383cb9c" data-action="Deal Block" data-label="A fairly low price for an RTX 5070 Ti gaming rig! Sporting an AMD Ryzen 7 8700F processor combined with 32GB of DDR5 RAM and a 2TB SSD, this MSI Aegis Z2 (which comes in a slick all-black case and all the RGB-lit fans) will push gaming even further than to its top-line 5070 Ti graphics cards. Hard to go wrong here." data-dimension48="A fairly low price for an RTX 5070 Ti gaming rig! Sporting an AMD Ryzen 7 8700F processor combined with 32GB of DDR5 RAM and a 2TB SSD, this MSI Aegis Z2 (which comes in a slick all-black case and all the RGB-lit fans) will push gaming even further than to its top-line 5070 Ti graphics cards. Hard to go wrong here." data-dimension25="$1699">View Deal</a></p></div><h3 class="article-body__section" id="section-tablet-deals"><span>Tablet deals</span></h3><div class="product"><a data-dimension112="be4207c0-8068-4a1e-8eb3-654fd7af914f" data-action="Deal Block" data-label="iPad 11 review" data-dimension48="iPad 11 review" data-dimension25="$274" href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="oi25obYHzoyNfMHoycGamh" name="iPad 2022 Blue.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oi25obYHzoyNfMHoycGamh.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is a nice discount on the base iPad with 128GB of storage, and it's one of the best iPads yet. In our <a href="https://www.tomsguide.com/computing/ipads/ipad-11-2025-review" data-dimension112="be4207c0-8068-4a1e-8eb3-654fd7af914f" data-action="Deal Block" data-label="iPad 11 review" data-dimension48="iPad 11 review" data-dimension25="$274">iPad 11 review</a> we lauded this tablet for its improved speed, longer battery life and the fact Apple finally bumped it up to 128GB of storage by default. <a class="view-deal button" href="https://www.amazon.com/dp/B0DZ75TN5F" target="_blank" rel="nofollow" data-dimension112="be4207c0-8068-4a1e-8eb3-654fd7af914f" data-action="Deal Block" data-label="iPad 11 review" data-dimension48="iPad 11 review" data-dimension25="$274">View Deal</a></p></div><div class="product"><a data-dimension112="3776d297-dedb-4947-8232-6b952f48087e" data-action="Deal Block" data-label="iPad Air M3 review" data-dimension48="iPad Air M3 review" data-dimension25="$449" href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ76BN5D" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1325px;"><p class="vanilla-image-block" style="padding-top:113.21%;"><img id="NVZkwX7FuVd3CYdiYHdsgm" name="iPad Air 11 2024 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NVZkwX7FuVd3CYdiYHdsgm.jpg" mos="" align="middle" fullscreen="" width="1325" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Here's a sweet discount on the latest 11" iPad Air packing Apple's M3 processor, an 11-inch LED (2360 x 1640) display and 128GB of storage. I think this is generally the best iPad for most people because it's better than the basic iPad but doesn't cost as much as the iPad Pro, yet offers nearly all the same features. Check out our <a href="https://www.tomsguide.com/tablets/ipads/ipad-air-m3-review" data-dimension112="3776d297-dedb-4947-8232-6b952f48087e" data-action="Deal Block" data-label="iPad Air M3 review" data-dimension48="iPad Air M3 review" data-dimension25="$449">iPad Air M3 review</a> to see what I mean!<a class="view-deal button" href="https://www.amazon.com/Apple-11-inch-Intelligence-Display-All-Day/dp/B0DZ76BN5D" target="_blank" rel="nofollow" data-dimension112="3776d297-dedb-4947-8232-6b952f48087e" data-action="Deal Block" data-label="iPad Air M3 review" data-dimension48="iPad Air M3 review" data-dimension25="$449">View Deal</a></p></div><div class="product"><a data-dimension112="8608f239-be5d-418d-8b00-ad2b4ad8bf90" data-action="Deal Block" data-label="Samsung Galaxy Tab S10 FE+ review" data-dimension48="Samsung Galaxy Tab S10 FE+ review" data-dimension25="$359" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="6MtzjCmXKf5yE6GBQhiVZK" name="Samsung Galaxy Tab S10 FE deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6MtzjCmXKf5yE6GBQhiVZK.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Save a nice chunk of change on Samsung's Galaxy Tab S10 FE+, a mid-range tablet that just launched this year and offers a big, beautiful 13.1-inch LCD panel and a 15+ hours of tested battery life. Read all about it in our <a href="https://www.tomsguide.com/computing/android-tablets/samsung-galaxy-tab-s10-fe-plus-review" data-dimension112="8608f239-be5d-418d-8b00-ad2b4ad8bf90" data-action="Deal Block" data-label="Samsung Galaxy Tab S10 FE+ review" data-dimension48="Samsung Galaxy Tab S10 FE+ review" data-dimension25="$359">Samsung Galaxy Tab S10 FE+ review</a>!<a class="view-deal button" href="https://www.amazon.com/Samsung-Processor-Note-Taking-Manufacturer-Warranty/dp/B0DVZSRJ8Q" target="_blank" rel="nofollow" data-dimension112="8608f239-be5d-418d-8b00-ad2b4ad8bf90" data-action="Deal Block" data-label="Samsung Galaxy Tab S10 FE+ review" data-dimension48="Samsung Galaxy Tab S10 FE+ review" data-dimension25="$359">View Deal</a></p></div><h3 class="article-body__section" id="section-gpu-deals"><span>GPU deals</span></h3><div class="product"><a data-dimension112="d95d68cf-41b0-414e-ae55-e178a9a679bc" data-action="Deal Block" data-label="This upper-mid range option is my current top-rated best graphics card for its stellar 1440p and 4K gaming performance, and zippy speeds in creative pro workloads and AI. It's a small but important dip beneath that $749 MSRP. Make sure you use the rebate to get that discount!" data-dimension48="This upper-mid range option is my current top-rated best graphics card for its stellar 1440p and 4K gaming performance, and zippy speeds in creative pro workloads and AI. It's a small but important dip beneath that $749 MSRP. Make sure you use the rebate to get that discount!" data-dimension25="$729" href="https://www.walmart.com/ip/Gigabyte-GeForce-RTX-5060-AERO-OC-8G-Graphics-Card/16933250096" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:42.89%;"><img id="PUdR38VJRamX93sB5tHCKX" name="RTX 5070 Ti" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PUdR38VJRamX93sB5tHCKX.jpg" mos="" align="middle" fullscreen="" width="1280" height="549" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This upper-mid range option is my current top-rated best graphics card for its stellar 1440p and 4K gaming performance, and zippy speeds in creative pro workloads and AI. It's a small but important dip beneath that $749 MSRP. Make sure you use the rebate to get that discount!<a class="view-deal button" href="https://www.walmart.com/ip/Gigabyte-GeForce-RTX-5060-AERO-OC-8G-Graphics-Card/16933250096" target="_blank" rel="nofollow" data-dimension112="d95d68cf-41b0-414e-ae55-e178a9a679bc" data-action="Deal Block" data-label="This upper-mid range option is my current top-rated best graphics card for its stellar 1440p and 4K gaming performance, and zippy speeds in creative pro workloads and AI. It's a small but important dip beneath that $749 MSRP. Make sure you use the rebate to get that discount!" data-dimension48="This upper-mid range option is my current top-rated best graphics card for its stellar 1440p and 4K gaming performance, and zippy speeds in creative pro workloads and AI. It's a small but important dip beneath that $749 MSRP. Make sure you use the rebate to get that discount!" data-dimension25="$729">View Deal</a></p></div><div class="product"><a data-dimension112="eee19e2d-336d-40c9-89c0-93bd938bfffc" data-action="Deal Block" data-label="Now this is the RTX 5060 Ti you'll want to bag, as it comes with 16GB of GDDR7 video memory, which is more than enough to handle games like Indiana Jones and the Great Circle, Cyberpunk 2077 and more. Expect smooth 1080/1440p gameplay, and with Nvidia's multi-frame gen, frame rates going well beyond 120 FPS." data-dimension48="Now this is the RTX 5060 Ti you'll want to bag, as it comes with 16GB of GDDR7 video memory, which is more than enough to handle games like Indiana Jones and the Great Circle, Cyberpunk 2077 and more. Expect smooth 1080/1440p gameplay, and with Nvidia's multi-frame gen, frame rates going well beyond 120 FPS." data-dimension25="$399" href="https://www.newegg.com/msi-rtx-5060-ti-16g-ventus-2x-oc-black-plus-geforce-rtx-5060-ti-16gb-graphics-card-double-fans/p/N82E16814137992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:58.36%;"><img id="bCHCrRvUtqyoddPYAkj53A" name="rtx 5060 ti" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/bCHCrRvUtqyoddPYAkj53A.jpg" mos="" align="middle" fullscreen="" width="1280" height="747" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Now this is the RTX 5060 Ti you'll want to bag, as it comes with 16GB of GDDR7 video memory, which is more than enough to handle games like Indiana Jones and the Great Circle, Cyberpunk 2077 and more. Expect smooth 1080/1440p gameplay, and with Nvidia's multi-frame gen, frame rates going well beyond 120 FPS. <a class="view-deal button" href="https://www.newegg.com/msi-rtx-5060-ti-16g-ventus-2x-oc-black-plus-geforce-rtx-5060-ti-16gb-graphics-card-double-fans/p/N82E16814137992" target="_blank" rel="nofollow" data-dimension112="eee19e2d-336d-40c9-89c0-93bd938bfffc" data-action="Deal Block" data-label="Now this is the RTX 5060 Ti you'll want to bag, as it comes with 16GB of GDDR7 video memory, which is more than enough to handle games like Indiana Jones and the Great Circle, Cyberpunk 2077 and more. Expect smooth 1080/1440p gameplay, and with Nvidia's multi-frame gen, frame rates going well beyond 120 FPS." data-dimension48="Now this is the RTX 5060 Ti you'll want to bag, as it comes with 16GB of GDDR7 video memory, which is more than enough to handle games like Indiana Jones and the Great Circle, Cyberpunk 2077 and more. Expect smooth 1080/1440p gameplay, and with Nvidia's multi-frame gen, frame rates going well beyond 120 FPS." data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="8ab3d376-f836-4591-a881-acc0f388a0ef" data-action="Deal Block" data-label="The budget GPU killer is back down to MSRP after this $20 saving — Intel's Arc B580 is plentiful in video memory and packs solid 1080p and 1440p gaming performance." data-dimension48="The budget GPU killer is back down to MSRP after this $20 saving — Intel's Arc B580 is plentiful in video memory and packs solid 1080p and 1440p gaming performance." data-dimension25="$249" href="https://www.newegg.com/asrock-challenger-b580-cl-12go-arc-b580-12gb-graphics-card-double-fans/p/N82E16814930131" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:52.89%;"><img id="g26APvbiU84B8fZTSt2dZ7" name="Intel Arc B580" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g26APvbiU84B8fZTSt2dZ7.jpg" mos="" align="middle" fullscreen="" width="1280" height="677" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The budget GPU killer is back down to MSRP after this $20 saving — Intel's Arc B580 is plentiful in video memory and packs solid 1080p and 1440p gaming performance.<a class="view-deal button" href="https://www.newegg.com/asrock-challenger-b580-cl-12go-arc-b580-12gb-graphics-card-double-fans/p/N82E16814930131" target="_blank" rel="nofollow" data-dimension112="8ab3d376-f836-4591-a881-acc0f388a0ef" data-action="Deal Block" data-label="The budget GPU killer is back down to MSRP after this $20 saving — Intel's Arc B580 is plentiful in video memory and packs solid 1080p and 1440p gaming performance." data-dimension48="The budget GPU killer is back down to MSRP after this $20 saving — Intel's Arc B580 is plentiful in video memory and packs solid 1080p and 1440p gaming performance." data-dimension25="$249">View Deal</a></p></div><h3 class="article-body__section" id="section-ram-deals"><span>RAM deals</span></h3><div class="product"><a data-dimension112="ab2f3217-bf32-4789-953c-87549bc67c4b" data-action="Deal Block" data-label="As they always say in PC building: when in doubt, bundle it. This isn't the all-time lowest price (you won't find anything like that for a while given the shortage). But in the context of the wider problem we're facing, a bundle with a 4TB PCIe Gen 5 SSD and zippy DDR5 RAM at this price is a steal." data-dimension48="As they always say in PC building: when in doubt, bundle it. This isn't the all-time lowest price (you won't find anything like that for a while given the shortage). But in the context of the wider problem we're facing, a bundle with a 4TB PCIe Gen 5 SSD and zippy DDR5 RAM at this price is a steal." data-dimension25="$538" href="https://www.amazon.com/Crucial-T710-900MB-2x16GB-6400MHz-Black/dp/B0FZDBJ3RL" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1030px;"><p class="vanilla-image-block" style="padding-top:59.13%;"><img id="PRYmnc9hoSaBKamz5EQN4E" name="Crucial T710 SSD Plus DDR5 RAM" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PRYmnc9hoSaBKamz5EQN4E.jpg" mos="" align="middle" fullscreen="" width="1030" height="609" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>As they always say in PC building: when in doubt, bundle it. This isn't the all-time lowest price (you won't find anything like that for a while given the shortage). But in the context of the wider problem we're facing, a bundle with a 4TB PCIe Gen 5 SSD and zippy DDR5 RAM at this price is a steal.<a class="view-deal button" href="https://www.amazon.com/Crucial-T710-900MB-2x16GB-6400MHz-Black/dp/B0FZDBJ3RL" target="_blank" rel="nofollow" data-dimension112="ab2f3217-bf32-4789-953c-87549bc67c4b" data-action="Deal Block" data-label="As they always say in PC building: when in doubt, bundle it. This isn't the all-time lowest price (you won't find anything like that for a while given the shortage). But in the context of the wider problem we're facing, a bundle with a 4TB PCIe Gen 5 SSD and zippy DDR5 RAM at this price is a steal." data-dimension48="As they always say in PC building: when in doubt, bundle it. This isn't the all-time lowest price (you won't find anything like that for a while given the shortage). But in the context of the wider problem we're facing, a bundle with a 4TB PCIe Gen 5 SSD and zippy DDR5 RAM at this price is a steal." data-dimension25="$538">View Deal</a></p></div><div class="product"><a data-dimension112="7029d23c-d769-4ee0-814d-506174b602f9" data-action="Deal Block" data-label="A modest but warmly welcome price cut on 16GB of DDR5 RAM — more than enough for builds sporting the likes of the RTX 5060 Ti and a mid-range CPU." data-dimension48="A modest but warmly welcome price cut on 16GB of DDR5 RAM — more than enough for builds sporting the likes of the RTX 5060 Ti and a mid-range CPU." data-dimension25="$128" href="https://www.newegg.com/team-group-16gb-ddr5-6000-cas-latency-cl38-memory-black/p/N82E16820985307" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:32.81%;"><img id="zJhfHkwK4C2WcHeSesvhWi" name="Team Group RAM" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zJhfHkwK4C2WcHeSesvhWi.jpg" mos="" align="middle" fullscreen="" width="1280" height="420" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>A modest but warmly welcome price cut on 16GB of DDR5 RAM — more than enough for builds sporting the likes of the RTX 5060 Ti and a mid-range CPU.<a class="view-deal button" href="https://www.newegg.com/team-group-16gb-ddr5-6000-cas-latency-cl38-memory-black/p/N82E16820985307" target="_blank" rel="nofollow" data-dimension112="7029d23c-d769-4ee0-814d-506174b602f9" data-action="Deal Block" data-label="A modest but warmly welcome price cut on 16GB of DDR5 RAM — more than enough for builds sporting the likes of the RTX 5060 Ti and a mid-range CPU." data-dimension48="A modest but warmly welcome price cut on 16GB of DDR5 RAM — more than enough for builds sporting the likes of the RTX 5060 Ti and a mid-range CPU." data-dimension25="$128">View Deal</a></p></div><div class="product"><a data-dimension112="7e64e2f7-d807-42e7-8af4-942ce38b3abe" data-action="Deal Block" data-label="Make sure you use the code "BFAE525" on this one. It's super rare that you'll find a 32GB DDR5 Kit on its own for less than $200 at the moment, so hurry!" data-dimension48="Make sure you use the code "BFAE525" on this one. It's super rare that you'll find a 32GB DDR5 Kit on its own for less than $200 at the moment, so hurry!" data-dimension25="$197" href="https://www.newegg.com/v-color-32gb-2-x-16gb-ddr5-6000-pc5-48000-cas-latency-cl36-memory-desktop-memory/p/0RN-00MB-000V0" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:71.09%;"><img id="mgApcBc5bAKcrXjZ6bat3" name="V-COLOR Manta Sky RAM" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mgApcBc5bAKcrXjZ6bat3.jpg" mos="" align="middle" fullscreen="" width="1280" height="910" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Make sure you use the code "BFAE525" on this one. It's super rare that you'll find a 32GB DDR5 Kit on its own for less than $200 at the moment, so hurry!<a class="view-deal button" href="https://www.newegg.com/v-color-32gb-2-x-16gb-ddr5-6000-pc5-48000-cas-latency-cl36-memory-desktop-memory/p/0RN-00MB-000V0" target="_blank" rel="nofollow" data-dimension112="7e64e2f7-d807-42e7-8af4-942ce38b3abe" data-action="Deal Block" data-label="Make sure you use the code "BFAE525" on this one. It's super rare that you'll find a 32GB DDR5 Kit on its own for less than $200 at the moment, so hurry!" data-dimension48="Make sure you use the code "BFAE525" on this one. It's super rare that you'll find a 32GB DDR5 Kit on its own for less than $200 at the moment, so hurry!" data-dimension25="$197">View Deal</a></p></div><h2 id="don-t-wait-for-something-new">Don’t wait for something new</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NSYr6nsP63PRbdJFMNL5pT" name="RAM sticks.jpg" alt="Two RAM sticks" src="https://cdn.mos.cms.futurecdn.net/NSYr6nsP63PRbdJFMNL5pT.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>To sum up what my chats have been like with people in the industry over the past couple of months in one word, it would be nervous. There’s a lot of new stuff coming down the line like Intel Panther Lake and Snapdragon X2 Elite, and I’m definitely excited to try them out. </p><p>But what if it's way too expensive to even consider an upgrade? And at that point, the prices of those older systems have probably gone up with reduced supply anyway. You’re damned if you do and damned if you don’t.</p><p>One thing I’m noticing from seeing what are the most clicked Black Friday deals on our site is that value for money is <strong>so </strong>critical. And if this trend continues, that feeling of value is going to evaporate quickly from the tech of 2026.</p><p><em>For more discounts, check out our </em><a href="https://www.tomsguide.com/live/news/black-friday-deals-ultimate-guide-my-top-picks-2025"><em>Black Friday deals live blog</em></a><em>.</em></p><h3 class="article-body__section" id="section-shop-today-s-best-black-friday-deals"><span>Shop today's best Black Friday deals</span></h3><ul><li><strong>Amazon: </strong><a href="https://www.amazon.com/b?node=210998206011" target="_blank" rel="nofollow"><strong>50% off Ring, Ninja, AirPods and more</strong></a><strong></strong></li><li><strong>Walmart Plus: </strong><a href="https://www.walmart.com/plus" target="_blank" rel="nofollow"><strong>50% off @ Walmart</strong></a></li><li><strong>REI: </strong><a href="https://www.rei.com/f/scd-deals" target="_blank" rel="nofollow"><strong>half-off Arc'teryx, Patagonia, more</strong></a><strong></strong></li><li><strong>Dell: </strong><a href="https://www.dell.com/en-us/shop/deals?sortBy=price-ascending" target="_blank" rel="nofollow"><strong>monitors from $69, laptops from $299</strong></a><strong></strong></li><li><strong>Nectar: </strong><a href="https://www.nectarsleep.com/" target="_blank" rel="nofollow"><strong>50% off mattresses + bundles</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/site/all-electronics-on-sale/all-computers-tablets-on-sale/pcmcat1632941704767.c?id=pcmcat1632941704767" target="_blank" rel="nofollow"><strong>laptops from $149</strong></a><strong></strong></li><li><strong>Lenovo: </strong><a href="https://www.lenovo.com/us/en/d/deals/laptops/?IPromoID=LEN380027&sortBy=priceUp" target="_blank" rel="nofollow"><strong>doorbuster deals from $319</strong></a><strong></strong></li><li><strong>Wayfair: </strong><a href="https://www.wayfair.com/daily-sales" target="_blank" rel="nofollow"><strong>up to 80% off home decor</strong></a><strong></strong></li><li><strong>Lululemon: </strong><a href="https://shop.lululemon.com/c/we-made-too-much/n18mhd?Ns=price%7C0" target="_blank" rel="nofollow"><strong>top picks from $9</strong></a><strong></strong></li><li><strong>Newegg: </strong><a href="https://www.newegg.com/Black-November-Early-Access/EventSaleStore/ID-1132" target="_blank" rel="nofollow"><strong>Doorbuster deals from $6</strong></a></li><li><strong>Walmart: </strong><a href="https://www.walmart.com/cp/gifts/3131907" target="_blank" rel="nofollow"><strong>holiday gifts from $15</strong></a></li><li><strong>Birkenstock: </strong><a href="https://www.nordstrom.com/browse/sale?sort=PercentOff&filterByBrand=birkenstock" target="_blank" rel="nofollow"><strong>deals from $20 @ Nordstrom</strong></a><strong></strong></li><li><strong>Saatva: </strong><a href="https://www.saatva.com/mattresses/saatva-classic?utm_source=futurepublishing&utm_medium=affiliate&coupon=awyqqgzvxqicebab" target="_blank" rel="nofollow"><strong>luxury mattresses from $1,099</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I review mini PCs for a living and these 15 Black Friday deals let you downsize for less ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/best-black-friday-mini-pc-deals-2025</link>
                                                                            <description>
                            <![CDATA[ Ditch your bulky desktop and say goodbye to charging your laptop with these awesome mini PC deals from Apple, Asus, Geekom,  Khadas and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">bGfftvspK5ZbjSFhJUCFJC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/KQThjyKz5RyuDxx9JTuqTB-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 21 Nov 2025 12:00:00 +0000</pubDate>                                                                                                                                <updated>Fri, 28 Nov 2025 03:16:42 +0000</updated>
                                                                                                                                            <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/KQThjyKz5RyuDxx9JTuqTB-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Geekom A5 mini PC on a desk with a Tom&#039;s Guide Black Friday deals badge]]></media:description>                                                            <media:text><![CDATA[The Geekom A5 mini PC on a desk with a Tom&#039;s Guide Black Friday deals badge]]></media:text>
                                <media:title type="plain"><![CDATA[The Geekom A5 mini PC on a desk with a Tom&#039;s Guide Black Friday deals badge]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/KQThjyKz5RyuDxx9JTuqTB-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>You don’t have to give up precious desk space to have a powerful computer. In fact, many of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a> aren’t that much larger than a stack of coasters. With these <a href="https://www.tomsguide.com/live/news/best-black-friday-deals-sales-picked-by-experts">Black Friday deals</a> on some of my favorite mini PCs, you can get a fast computer with a small footprint for even less. I've scoured the early sales and found deals covering every need, from high-end workstations to budget-friendly gaming rigs.</p><p>If you’ve always wanted to try out macOS or your old MacBook is starting to show its age, the <a href="https://www.amazon.com/Apple-2024-Desktop-Computer-10%E2%80%91core/dp/B0DLBTPDCS" target="_blank" rel="nofollow">Mac mini M4 is $120 off</a> right now. Likewise, if you’re not quite ready to build a gaming PC but are tired of playing on a console, you can pick up the <a href="https://www.amazon.com/GMKtec_ultra_285h_ai_mini_pc_evo_t1/dp/B0FH4NZ6DX" target="_blank" rel="nofollow">GMKtec EVO-T1 for $300 off</a>, and thanks to its OCulink Port, you can always hook up an external graphics card. There are also some great deals on more budget-friendly systems, like <a href="https://www.bestbuy.com/product/geekom-a5-mini-pc-amd-ryzen-7-5825u-up-to-4-5ghz-16gb-ddr4-ram-512gb-m-2-pcie-nvme-ssd-windows-11-pro-pre-installed-rose-gold/J3GW668X3Y/sku/10152219" target="_blank" rel="nofollow">$120 off the Geekom A5 2025 Edition</a>.</p><p>There are plenty of other mini PCs I personally recommend on sale below, so keep scrolling to see the best deals I’ve found so far. And if you don’t see anything you like right now, keep checking back as I plan on updating my list of the best Black Friday mini PC deals all the way up until Cyber Monday and beyond.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><h2 id="u-s-mini-pc-deals">U.S. mini PC deals</h2><ul><li><strong>Kamrui E3B: </strong><a href="https://www.amazon.com/KAMRUI-E3B-Computers-Desktop-Computer/dp/B0FLDXVLCT" target="_blank" rel="nofollow"><strong>was $497 now $309 @ Amazon</strong></a><strong></strong></li><li><strong>MSI Cubi NUC 1MG: </strong><a href="https://www.bestbuy.com/product/msi-cubi-nuc-1mg-mini-desktop-intel-core-3-100u-16gb-memory-intel-graphics-500gb-ssd-black/J3P7TXQ8KX" target="_blank" rel="nofollow"><strong>was $499 now $349 @ Best Buy</strong></a><strong></strong></li><li><strong>Geekom A5: </strong><a href="https://www.bestbuy.com/product/geekom-a5-mini-pc-amd-ryzen-7-5825u-up-to-4-5ghz-16gb-ddr4-ram-512gb-m-2-pcie-nvme-ssd-windows-11-pro-pre-installed-rose-gold/J3GW668X3Y/sku/10152219" target="_blank" rel="nofollow"><strong>was $499 now $379 @ Best Buy</strong></a></li><li><strong>Acemagic M1: </strong><a href="https://www.amazon.com/ACEMAGIC-M1-i9-11900H-Computers-PCIe3-0/dp/B0FG7YD2D8" target="_blank" rel="nofollow"><strong>was $799 now $459 @ Amazon</strong></a></li><li><strong>Khadas Mind: </strong><a href="https://www.amazon.com/Khadas-i7-1360P-Computer-Portable-Business/dp/B0DPMTYQ8Z" target="_blank" rel="nofollow"><strong>was $549 now $494 @ Amazon</strong></a><strong></strong></li><li><strong>Mac mini M4: </strong><a href="https://www.amazon.com/Apple-2024-Desktop-Computer-10%E2%80%91core/dp/B0DLBTPDCS" target="_blank" rel="nofollow"><strong>was $599 now $479 @ Amazon</strong></a><strong></strong></li><li><strong>Geekom A8: </strong><a href="https://www.amazon.com/GEEKOM-A8-Computers-5600MHz-Windows/dp/B0D22FYFL4" target="_blank" rel="nofollow"><strong>was $859 now $679 @ Amazon</strong></a><strong></strong></li><li><strong>GMKtec EVO-T1: </strong><a href="https://www.amazon.com/GMKtec_ultra_285h_ai_mini_pc_evo_t1/dp/B0FH4NZ6DX" target="_blank" rel="nofollow"><strong>was $1,299 now $949 @ Amazon</strong></a></li><li><strong>Asus NUC 14 Pro+: </strong><a href="https://www.amazon.com/ASUS-Thunderbolt-Aluminum-Chassis-Included/dp/B0DBBDGD6J" target="_blank" rel="nofollow"><strong>was $1,099 now $899 @ Amazon</strong></a><strong></strong></li><li><strong>Geekom IT15: </strong><a href="https://www.amazon.com/GEEKOM-IT15-Powerful-Display-Windows11Pro/dp/B0F8QKDY2S" target="_blank" rel="nofollow"><strong>was $1,199 now $999 @ Amazon</strong></a></li><li><strong>Khadas Mind 2S: </strong><a href="https://www.amazon.com/Khadas-Mind-Mini-Battery%EF%BD%9COnly-435g%EF%BD%9CThunderbolt/dp/B0DWJSPPXF" target="_blank" rel="nofollow"><strong>was $1,599 now $1,439 @ Amazon</strong></a></li></ul><h2 id="u-k-mini-pc-deals">U.K. mini PC deals</h2><ul><li><strong>M4 Mac mini: </strong><a href="https://www.amazon.co.uk/Apple-Mac-mini-Computer-M4/dp/B0DLBSGKWV" target="_blank" rel="nofollow"><strong>was £599 now £529 @ Amazon</strong></a><strong></strong></li><li><strong>Geekom A8 max: </strong><a href="https://www.geekom.co.uk/geekom-a8-max-mini-pc" target="_blank" rel="nofollow"><strong>was £799 now £559 </strong></a><strong></strong></li><li><strong></strong><a href="https://www.geekom.co.uk/geekom-a8-max-mini-pc" target="_blank" rel="nofollow"><strong>@ Geekom</strong></a><strong></strong></li><li><strong>Minisforum A1 X1 Pro: </strong><a href="https://www.minisforum.uk/products/ai-x1-pro" target="_blank" rel="nofollow"><strong>was £1079 now £869 </strong></a><strong></strong></li><li><strong></strong><a href="https://www.minisforum.uk/products/ai-x1-pro" target="_blank" rel="nofollow"><strong>@ Minisforum</strong></a><strong></strong></li><li><strong>M4 pro Mac mini: </strong><a href="https://www.amazon.co.uk/Apple-Mac-mini-M4-Pro/dp/B0DLC7G8BN" target="_blank" rel="nofollow"><strong>was £1399 now £1269 </strong></a><strong></strong></li><li><strong></strong><a href="https://www.amazon.co.uk/Apple-Mac-mini-M4-Pro/dp/B0DLC7G8BN" target="_blank" rel="nofollow"><strong>@ Amazon</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-best-mini-pc-deals"><span>Best mini PC deals</span></h3><div class="product"><a data-dimension112="3b21ba46-2ec5-4606-8bf3-5e65a75ffec1" data-action="Deal Block" data-label="Kamrui E3B review" data-dimension48="Kamrui E3B review" data-dimension25="$309" href="https://www.amazon.com/KAMRUI-E3B-Computers-Desktop-Computer/dp/B0FLDXVLCT" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1464px;"><p class="vanilla-image-block" style="padding-top:88.25%;"><img id="grRSkC5jNEgiNztNDmzvfS" name="61a962e7+cL._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/grRSkC5jNEgiNztNDmzvfS.jpg" mos="" align="middle" fullscreen="" width="1464" height="1292" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Kamrui E3B was my previous pick for the best budget mini PC as you get plenty of power for the price. However, this deal gets you the upgraded version that comes with a more powerful AMD Ryzen 7 7730U processor, 16GB of DDR4 RAM and a 512GB M.2 SSD. On the front of the E3B, you get two USB-A ports, a USB-C port with video out and a headphone jack. Around back, you get HDMI and DisplayPort for video out, a Gigabit Ethernet jack and, surprisingly, four more USB-A ports. In my <a href="https://www.tomsguide.com/computing/desktop-computers/kamrui-e3b-review-a-budget-mini-pc-that-punches-above-its-weight" data-dimension112="3b21ba46-2ec5-4606-8bf3-5e65a75ffec1" data-action="Deal Block" data-label="Kamrui E3B review" data-dimension48="Kamrui E3B review" data-dimension25="$309">Kamrui E3B review</a>, I praised its near-silent fan and its sleek, all-black design.<a class="view-deal button" href="https://www.amazon.com/KAMRUI-E3B-Computers-Desktop-Computer/dp/B0FLDXVLCT" target="_blank" rel="nofollow" data-dimension112="3b21ba46-2ec5-4606-8bf3-5e65a75ffec1" data-action="Deal Block" data-label="Kamrui E3B review" data-dimension48="Kamrui E3B review" data-dimension25="$309">View Deal</a></p></div><div class="product"><a data-dimension112="0df1ccc2-35b5-4c05-a472-58e2594098b8" data-action="Deal Block" data-label="MSI Cubi NUC AI+ 2MG" data-dimension48="MSI Cubi NUC AI+ 2MG" data-dimension25="$349" href="https://www.bestbuy.com/product/msi-cubi-nuc-1mg-mini-desktop-intel-core-3-100u-16gb-memory-intel-graphics-500gb-ssd-black/J3P7TXQ8KX" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1284px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="mGYgaheqBuuWDVL7yTNyUd" name="msi-cubi-nuc-1m-quick-grid" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mGYgaheqBuuWDVL7yTNyUd.jpg" mos="" align="middle" fullscreen="" width="1284" height="1284" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The MSI Cubi NUC 1MG may not be the most powerful version of this mini desktop, but it's still at a fantastic price thanks to the discount. Expect an Intel Core 3-100U processor with 16GB of RAM and a 500GB SSD, which will power through everyday tasks to keep up with your workflow. It also comes equipped with a handy microSD Card Reader, two HDMI ports and plenty of USB-A 3.2 ports. I reviewed the latest <a href="https://www.tomsguide.com/computing/desktop-computers/msi-cubi-nuc-ai-plus-2mg-review" data-dimension112="0df1ccc2-35b5-4c05-a472-58e2594098b8" data-action="Deal Block" data-label="MSI Cubi NUC AI+ 2MG" data-dimension48="MSI Cubi NUC AI+ 2MG" data-dimension25="$349">MSI Cubi NUC AI+ 2MG</a>, and was a big fan of its whisper-quiet design and convenient front ports. And this model keeps that trend. <a class="view-deal button" href="https://www.bestbuy.com/product/msi-cubi-nuc-1mg-mini-desktop-intel-core-3-100u-16gb-memory-intel-graphics-500gb-ssd-black/J3P7TXQ8KX" target="_blank" rel="nofollow" data-dimension112="0df1ccc2-35b5-4c05-a472-58e2594098b8" data-action="Deal Block" data-label="MSI Cubi NUC AI+ 2MG" data-dimension48="MSI Cubi NUC AI+ 2MG" data-dimension25="$349">View Deal</a></p></div><div class="product"><a data-dimension112="4e8330cd-212c-4104-a3ac-d7182c51bcb1" data-action="Deal Block" data-label="Geekom A5 2025 Edition review" data-dimension48="Geekom A5 2025 Edition review" data-dimension25="$379" href="https://www.bestbuy.com/product/geekom-a5-mini-pc-amd-ryzen-7-5825u-up-to-4-5ghz-16gb-ddr4-ram-512gb-m-2-pcie-nvme-ssd-windows-11-pro-pre-installed-rose-gold/J3GW668X3Y/sku/10152219" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1440px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="C3tjN9QTZGsjMycxjiM7qE" name="Geekom A5 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/C3tjN9QTZGsjMycxjiM7qE.jpg" mos="" align="middle" fullscreen="" width="1440" height="1440" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Geekom A5 (2025 Edition) is my new pick for the best budget mini PC. It’s powered by an AMD Ryzen 7 5825U processor and comes with 16GB of DDR4 RAM and a 512GB M.2 SSD. While you don’t get a USB-C port on the front (just two USB-A ports and a headphone jack), around back you get two USB-C ports with video out, two HDMI ports, two USB-A ports and a 2.5 Gbps Ethernet port. Oh, and did I mention there’s an SD card reader on the side? In my <a href="https://www.tomsguide.com/computing/desktop-computers/geekom-a5-review" data-dimension112="4e8330cd-212c-4104-a3ac-d7182c51bcb1" data-action="Deal Block" data-label="Geekom A5 2025 Edition review" data-dimension48="Geekom A5 2025 Edition review" data-dimension25="$379">Geekom A5 2025 Edition review</a>, I said this affordable mini PC performs even better than it looks with its unique rose gold colorway.<a class="view-deal button" href="https://www.bestbuy.com/product/geekom-a5-mini-pc-amd-ryzen-7-5825u-up-to-4-5ghz-16gb-ddr4-ram-512gb-m-2-pcie-nvme-ssd-windows-11-pro-pre-installed-rose-gold/J3GW668X3Y/sku/10152219" target="_blank" rel="nofollow" data-dimension112="4e8330cd-212c-4104-a3ac-d7182c51bcb1" data-action="Deal Block" data-label="Geekom A5 2025 Edition review" data-dimension48="Geekom A5 2025 Edition review" data-dimension25="$379">View Deal</a></p></div><div class="product"><a data-dimension112="bfd05574-8b21-4e49-8151-a75618e9f73f" data-action="Deal Block" data-label="The Acemagic M1 is a compact mini PC with plenty of power under the hood thanks to its Intel Core i9-11900H processor. It also comes equipped with 32GB of DDR4 memory and a 1 TB SSD and plenty of ports. Up front, you get two USB-A ports and a USB-C 3.2 Gen 2 port with video out and a headphone jack. Then around back, there are four USB-A ports, an HDMI 2.0 port, a DisplayPort 1.4 and a 2.5G Ethernet port. I'm in the process of reviewing this one and based on my testing so far, I'm very impressed." data-dimension48="The Acemagic M1 is a compact mini PC with plenty of power under the hood thanks to its Intel Core i9-11900H processor. It also comes equipped with 32GB of DDR4 memory and a 1 TB SSD and plenty of ports. Up front, you get two USB-A ports and a USB-C 3.2 Gen 2 port with video out and a headphone jack. Then around back, there are four USB-A ports, an HDMI 2.0 port, a DisplayPort 1.4 and a 2.5G Ethernet port. I'm in the process of reviewing this one and based on my testing so far, I'm very impressed." data-dimension25="$459" href="https://www.amazon.com/ACEMAGIC-M1-i9-11900H-Computers-PCIe3-0/dp/B0FG7YD2D8?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:73.07%;"><img id="yXKyXFPdeiZzPbyewJdQ9K" name="M1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yXKyXFPdeiZzPbyewJdQ9K.jpg" mos="" align="middle" fullscreen="" width="1500" height="1096" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Acemagic M1 is a compact mini PC with plenty of power under the hood thanks to its Intel Core i9-11900H processor. It also comes equipped with 32GB of DDR4 memory and a 1 TB SSD and plenty of ports. Up front, you get two USB-A ports and a USB-C 3.2 Gen 2 port with video out and a headphone jack. Then around back, there are four USB-A ports, an HDMI 2.0 port, a DisplayPort 1.4 and a 2.5G Ethernet port. I'm in the process of reviewing this one and based on my testing so far, I'm very impressed.<a class="view-deal button" href="https://www.amazon.com/ACEMAGIC-M1-i9-11900H-Computers-PCIe3-0/dp/B0FG7YD2D8?th=1" target="_blank" rel="nofollow" data-dimension112="bfd05574-8b21-4e49-8151-a75618e9f73f" data-action="Deal Block" data-label="The Acemagic M1 is a compact mini PC with plenty of power under the hood thanks to its Intel Core i9-11900H processor. It also comes equipped with 32GB of DDR4 memory and a 1 TB SSD and plenty of ports. Up front, you get two USB-A ports and a USB-C 3.2 Gen 2 port with video out and a headphone jack. Then around back, there are four USB-A ports, an HDMI 2.0 port, a DisplayPort 1.4 and a 2.5G Ethernet port. I'm in the process of reviewing this one and based on my testing so far, I'm very impressed." data-dimension48="The Acemagic M1 is a compact mini PC with plenty of power under the hood thanks to its Intel Core i9-11900H processor. It also comes equipped with 32GB of DDR4 memory and a 1 TB SSD and plenty of ports. Up front, you get two USB-A ports and a USB-C 3.2 Gen 2 port with video out and a headphone jack. Then around back, there are four USB-A ports, an HDMI 2.0 port, a DisplayPort 1.4 and a 2.5G Ethernet port. I'm in the process of reviewing this one and based on my testing so far, I'm very impressed." data-dimension25="$459">View Deal</a></p></div><div class="product"><a data-dimension112="c9854e35-7f4b-4dec-a0bb-d5969eb568ac" data-action="Deal Block" data-label="Khadas Mind review" data-dimension48="Khadas Mind review" data-dimension25="$494" href="https://www.amazon.com/Khadas-i7-1360P-Computer-Portable-Business/dp/B0DPMTYQ8Z" 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:77.20%;"><img id="EqippTHHRTWnfyFeqdyB9F" name="61eODiqNLYL._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EqippTHHRTWnfyFeqdyB9F.jpg" mos="" align="middle" fullscreen="" width="1500" height="1158" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The standard Khadas Mind packs an Intel i5-1340p processor, 16GB of DDR5 RAM and a 512GB SSD into an absolutely tiny package. There’s a power button on the front, cooling on the sides and around back, you get two USB-A ports, two USB-C ports (one for power) and an HDMI port. However, there’s also a free M.2 SSD slot on the bottom if you want to add more storage to the base Khadas Mind. In my <a href="https://www.tomsguide.com/computing/desktop-computers/khadas-mind-review" data-dimension112="c9854e35-7f4b-4dec-a0bb-d5969eb568ac" data-action="Deal Block" data-label="Khadas Mind review" data-dimension48="Khadas Mind review" data-dimension25="$494">Khadas Mind review</a>, I praised this pocketable mini PC for its slim profile and the fact that you can add more ports or even a graphics card thanks to Khadas’ first-party docks.<a class="view-deal button" href="https://www.amazon.com/Khadas-i7-1360P-Computer-Portable-Business/dp/B0DPMTYQ8Z" target="_blank" rel="nofollow" data-dimension112="c9854e35-7f4b-4dec-a0bb-d5969eb568ac" data-action="Deal Block" data-label="Khadas Mind review" data-dimension48="Khadas Mind review" data-dimension25="$494">View Deal</a></p></div><div class="product"><a data-dimension112="95bedaaf-5540-43f7-805f-f2cfcb5140f6" data-action="Deal Block" data-label="Mac mini M4 review" data-dimension48="Mac mini M4 review" data-dimension25="$479" href="https://www.amazon.com/Apple-2024-Desktop-Computer-10%E2%80%91core/dp/B0DLBTPDCS" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="L8QA9sZYoSqocSTyVMrAFY" name="Mac mini M4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/L8QA9sZYoSqocSTyVMrAFY.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The base model Mac mini M4 is a big step up from its predecessor and likely enough for most people without any expensive upgrades. It comes with Apple’s powerful M4 chip, 16GB of RAM and 256GB of storage. You also get plenty of ports in a tiny package with three Thunderbolt 4 ports, two USB-C ports, HDMI and Ethernet. If it weren't for the awkward power button placement and the complete lack of USB-A ports, I would have easily given this one 5 stars in my <a href="https://www.tomsguide.com/computing/desktop-computers/mac-mini-m4-review" data-dimension112="95bedaaf-5540-43f7-805f-f2cfcb5140f6" data-action="Deal Block" data-label="Mac mini M4 review" data-dimension48="Mac mini M4 review" data-dimension25="$479">Mac mini M4 review</a>.<a class="view-deal button" href="https://www.amazon.com/Apple-2024-Desktop-Computer-10%E2%80%91core/dp/B0DLBTPDCS" target="_blank" rel="nofollow" data-dimension112="95bedaaf-5540-43f7-805f-f2cfcb5140f6" data-action="Deal Block" data-label="Mac mini M4 review" data-dimension48="Mac mini M4 review" data-dimension25="$479">View Deal</a></p></div><div class="product"><a data-dimension112="a737a8ca-aef2-4d13-99d5-9888fed92e0c" data-action="Deal Block" data-label="The Beelink SER8 comes fully equipped with 32GB of RAM and a 1TB SSD along with plenty of ports. In fact, the SER8 can be used in a triple-monitor setup as around the back; you get an HDMI 2.1 port, DisplayPort 1.4 and a USB4 port along with three USB-A ports and a 2.5 Gigabit Ethernet port, which is perfect for multi-gig internet plans. Powered by a Ryzen 7 8745HS processor, this mini PC is perfect for work and can even handle some light gaming thanks to its built-in Radeon 780M graphics. You can also upgrade the SER8 with up to 64TB of DDR5 RAM and 2TB of storage if you need even more power later on." data-dimension48="The Beelink SER8 comes fully equipped with 32GB of RAM and a 1TB SSD along with plenty of ports. In fact, the SER8 can be used in a triple-monitor setup as around the back; you get an HDMI 2.1 port, DisplayPort 1.4 and a USB4 port along with three USB-A ports and a 2.5 Gigabit Ethernet port, which is perfect for multi-gig internet plans. Powered by a Ryzen 7 8745HS processor, this mini PC is perfect for work and can even handle some light gaming thanks to its built-in Radeon 780M graphics. You can also upgrade the SER8 with up to 64TB of DDR5 RAM and 2TB of storage if you need even more power later on." data-dimension25="$589" href="https://www.amazon.com/Beelink-PCle4-0-Computer-Support-Display/dp/B0DKF15XQJ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1144px;"><p class="vanilla-image-block" style="padding-top:123.34%;"><img id="AeDBLTkGHNNGo5vYQvqWWB" name="Beelink SER8" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AeDBLTkGHNNGo5vYQvqWWB.jpg" mos="" align="middle" fullscreen="" width="1144" height="1411" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Beelink SER8 comes fully equipped with 32GB of RAM and a 1TB SSD along with plenty of ports. In fact, the SER8 can be used in a triple-monitor setup as around the back; you get an HDMI 2.1 port, DisplayPort 1.4 and a USB4 port along with three USB-A ports and a 2.5 Gigabit Ethernet port, which is perfect for multi-gig internet plans. Powered by a Ryzen 7 8745HS processor, this mini PC is perfect for work and can even handle some light gaming thanks to its built-in Radeon 780M graphics. You can also upgrade the SER8 with up to 64TB of DDR5 RAM and 2TB of storage if you need even more power later on.<a class="view-deal button" href="https://www.amazon.com/Beelink-PCle4-0-Computer-Support-Display/dp/B0DKF15XQJ" target="_blank" rel="nofollow" data-dimension112="a737a8ca-aef2-4d13-99d5-9888fed92e0c" data-action="Deal Block" data-label="The Beelink SER8 comes fully equipped with 32GB of RAM and a 1TB SSD along with plenty of ports. In fact, the SER8 can be used in a triple-monitor setup as around the back; you get an HDMI 2.1 port, DisplayPort 1.4 and a USB4 port along with three USB-A ports and a 2.5 Gigabit Ethernet port, which is perfect for multi-gig internet plans. Powered by a Ryzen 7 8745HS processor, this mini PC is perfect for work and can even handle some light gaming thanks to its built-in Radeon 780M graphics. You can also upgrade the SER8 with up to 64TB of DDR5 RAM and 2TB of storage if you need even more power later on." data-dimension48="The Beelink SER8 comes fully equipped with 32GB of RAM and a 1TB SSD along with plenty of ports. In fact, the SER8 can be used in a triple-monitor setup as around the back; you get an HDMI 2.1 port, DisplayPort 1.4 and a USB4 port along with three USB-A ports and a 2.5 Gigabit Ethernet port, which is perfect for multi-gig internet plans. Powered by a Ryzen 7 8745HS processor, this mini PC is perfect for work and can even handle some light gaming thanks to its built-in Radeon 780M graphics. You can also upgrade the SER8 with up to 64TB of DDR5 RAM and 2TB of storage if you need even more power later on." data-dimension25="$589">View Deal</a></p></div><div class="product"><a data-dimension112="6a1300f2-de7c-47f5-a898-9553581ed792" data-action="Deal Block" data-label="Geekom A6 review" data-dimension48="Geekom A6 review" data-dimension25="$679" href="https://www.amazon.com/GEEKOM-A8-Computers-5600MHz-Windows/dp/B0D22FYFL4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:60.73%;"><img id="9Dcj8rdHg5JFJ2jJpNkUE7" name="71C-iB0N+TL._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9Dcj8rdHg5JFJ2jJpNkUE7.jpg" mos="" align="middle" fullscreen="" width="1500" height="911" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Geekom A8 could be the perfect mini PC for you. It has a full aluminum design, a great selection of front and rear ports, and Geekom’s IceBlast 1.5 tech, which keeps it cool in use. The A8 can even power a quad-monitor setup around the back; there are two HDMI 2.0 ports, a USB-C port capable of video out and a USB 4 port. While I haven’t reviewed the A8 yet, I did review its smaller sibling, the A6. In my <a href="https://www.tomsguide.com/computing/desktop-computers/geekom-a6-review" data-dimension112="6a1300f2-de7c-47f5-a898-9553581ed792" data-action="Deal Block" data-label="Geekom A6 review" data-dimension48="Geekom A6 review" data-dimension25="$679">Geekom A6 review</a>, I couldn’t believe that it was smaller than both the Mac mini M4 and even the very tiny <a href="https://www.tomsguide.com/computing/desktop-computers/asus-NUC-14-pro-review">Asus NUC 14 Pro</a>. The A8 gives you even more power than the A6 as it packs a Ryzen 9 8945HS processor into the same small case.<a class="view-deal button" href="https://www.amazon.com/GEEKOM-A8-Computers-5600MHz-Windows/dp/B0D22FYFL4" target="_blank" rel="nofollow" data-dimension112="6a1300f2-de7c-47f5-a898-9553581ed792" data-action="Deal Block" data-label="Geekom A6 review" data-dimension48="Geekom A6 review" data-dimension25="$679">View Deal</a></p></div><div class="product"><a data-dimension112="17ff7a56-9a20-4fb2-b109-d6e0cbd31072" data-action="Deal Block" data-label="The GMKtec EVO-T1 is powerful enough in its own right, but on the front, in addition to your usual front ports, it has an Oculink port. This can be used to connect this mini PC to an external graphics card dock to transform it into a full-fledged gaming PC. Even if you don’t go that route, the EVO-T1 features a powerful Intel Core Ultra 9 285H processor with built-in Intel Arc 140T integrated graphics. You also get 64GB of RAM, a 1TB SSD and a case that lets you use this mini PC vertically if you don’t want to have it lying flat on your desk. Dual 2.5 Gigabit Ethernet ports also make it a great choice for those with a NAS, and with 50 TOPs, it’s also great for local AI workloads." data-dimension48="The GMKtec EVO-T1 is powerful enough in its own right, but on the front, in addition to your usual front ports, it has an Oculink port. This can be used to connect this mini PC to an external graphics card dock to transform it into a full-fledged gaming PC. Even if you don’t go that route, the EVO-T1 features a powerful Intel Core Ultra 9 285H processor with built-in Intel Arc 140T integrated graphics. You also get 64GB of RAM, a 1TB SSD and a case that lets you use this mini PC vertically if you don’t want to have it lying flat on your desk. Dual 2.5 Gigabit Ethernet ports also make it a great choice for those with a NAS, and with 50 TOPs, it’s also great for local AI workloads." data-dimension25="$949" href="https://www.amazon.com/GMKtec_ultra_285h_ai_mini_pc_evo_t1/dp/B0FH4NZ6DX" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1183px;"><p class="vanilla-image-block" style="padding-top:72.27%;"><img id="oejSmeortLKjZLu3Uj5zCT" name="GMKtec EVO-T1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oejSmeortLKjZLu3Uj5zCT.jpg" mos="" align="middle" fullscreen="" width="1183" height="855" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The GMKtec EVO-T1 is powerful enough in its own right, but on the front, in addition to your usual front ports, it has an Oculink port. This can be used to connect this mini PC to an external graphics card dock to transform it into a full-fledged gaming PC. Even if you don’t go that route, the EVO-T1 features a powerful Intel Core Ultra 9 285H processor with built-in Intel Arc 140T integrated graphics. You also get 64GB of RAM, a 1TB SSD and a case that lets you use this mini PC vertically if you don’t want to have it lying flat on your desk. Dual 2.5 Gigabit Ethernet ports also make it a great choice for those with a NAS, and with 50 TOPs, it’s also great for local AI workloads.<a class="view-deal button" href="https://www.amazon.com/GMKtec_ultra_285h_ai_mini_pc_evo_t1/dp/B0FH4NZ6DX" target="_blank" rel="nofollow" data-dimension112="17ff7a56-9a20-4fb2-b109-d6e0cbd31072" data-action="Deal Block" data-label="The GMKtec EVO-T1 is powerful enough in its own right, but on the front, in addition to your usual front ports, it has an Oculink port. This can be used to connect this mini PC to an external graphics card dock to transform it into a full-fledged gaming PC. Even if you don’t go that route, the EVO-T1 features a powerful Intel Core Ultra 9 285H processor with built-in Intel Arc 140T integrated graphics. You also get 64GB of RAM, a 1TB SSD and a case that lets you use this mini PC vertically if you don’t want to have it lying flat on your desk. Dual 2.5 Gigabit Ethernet ports also make it a great choice for those with a NAS, and with 50 TOPs, it’s also great for local AI workloads." data-dimension48="The GMKtec EVO-T1 is powerful enough in its own right, but on the front, in addition to your usual front ports, it has an Oculink port. This can be used to connect this mini PC to an external graphics card dock to transform it into a full-fledged gaming PC. Even if you don’t go that route, the EVO-T1 features a powerful Intel Core Ultra 9 285H processor with built-in Intel Arc 140T integrated graphics. You also get 64GB of RAM, a 1TB SSD and a case that lets you use this mini PC vertically if you don’t want to have it lying flat on your desk. Dual 2.5 Gigabit Ethernet ports also make it a great choice for those with a NAS, and with 50 TOPs, it’s also great for local AI workloads." data-dimension25="$949">View Deal</a></p></div><div class="product"><a data-dimension112="f6cb1019-fc41-4a38-aa6c-98644a793176" data-action="Deal Block" data-label="Asus Nuc 14 Pro" data-dimension48="Asus Nuc 14 Pro" data-dimension25="$899" href="https://www.amazon.com/ASUS-Thunderbolt-Aluminum-Chassis-Included/dp/B0DBBDGD6J" 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:37.93%;"><img id="ym8kjxuwi4FWY8N2fcKnEU" name="NUC 14 Pro+" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ym8kjxuwi4FWY8N2fcKnEU.jpg" mos="" align="middle" fullscreen="" width="1500" height="569" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Asus NUC 14 Pro+ is a slim, two-tone mini PC with an aluminum top and a white base. Its wider, more rectangular design, innovative cooling system and toolless chassis help set it apart. Another great thing about the NUC 14 Pro+ is that you have six different processor configurations to choose from but you can also save quite a lot by picking up a barebones version where you’ll need to provide your own storage, memory and operating system. On the front, you get two high-speed USB-A ports and a USB-C port capable of video out. Then around back, you get two more USB-A ports, dual HDMI 2.1 ports, dual Thunderbolt 4 ports and a 2.5G Ethernet port. While I haven’t reviewed this upgraded model I did review the <a href="https://www.tomsguide.com/computing/desktop-computers/asus-NUC-14-pro-review" data-dimension112="f6cb1019-fc41-4a38-aa6c-98644a793176" data-action="Deal Block" data-label="Asus Nuc 14 Pro" data-dimension48="Asus Nuc 14 Pro" data-dimension25="$899">Asus Nuc 14 Pro</a> which stood out for being smaller than the Mac mini M4 and like the NUC 14 Pro+, how there are multiple configuration options to pick from.<a class="view-deal button" href="https://www.amazon.com/ASUS-Thunderbolt-Aluminum-Chassis-Included/dp/B0DBBDGD6J" target="_blank" rel="nofollow" data-dimension112="f6cb1019-fc41-4a38-aa6c-98644a793176" data-action="Deal Block" data-label="Asus Nuc 14 Pro" data-dimension48="Asus Nuc 14 Pro" data-dimension25="$899">View Deal</a></p></div><div class="product"><a data-dimension112="5532e003-edb5-4b5d-b02e-f5195d7d2be7" data-action="Deal Block" data-label="Geekom IT15 review" data-dimension48="Geekom IT15 review" data-dimension25="$999" href="https://www.amazon.com/GEEKOM-IT15-Powerful-Display-Windows11Pro/dp/B0F8QKDY2S?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:60.80%;"><img id="WNesSShGSgURHCLdpPtcnb" name="IT15" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WNesSShGSgURHCLdpPtcnb.jpg" mos="" align="middle" fullscreen="" width="1500" height="912" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Geekom IT15 is a sleek, all-black mini PC in a tiny chassis that’s an absolute powerhouse. Equipped with Intel’s latest Core Ultra 5 or 9 processors, 32GB of DDR5 RAM, a 1 or 2TB SSD and Wi-Fi 7, this is a futureproof mini PC designed for more heavy workloads and thanks to its integrated Intel Arc 130T or 140T graphics, even some light gaming. Up front, you get two high-speed USB-A ports and a headphone jack while there’s an SD card reader on the side. Around back though, the port selection is even more impressive with dual HDMI 2.0 ports, two more USB-A ports, a 2.5G Ethernet port and dual USB-4 ports, one of which can be used for power if you don’t want to lug around its external power supply. In my <a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/geekom-it15-review" data-dimension112="5532e003-edb5-4b5d-b02e-f5195d7d2be7" data-action="Deal Block" data-label="Geekom IT15 review" data-dimension48="Geekom IT15 review" data-dimension25="$999">Geekom IT15 review</a>, I praised its excellent upgradability and its futureproof connectivity thanks to the inclusion of Wi-Fi 7 and a 2.5G wired port.<a class="view-deal button" href="https://www.amazon.com/GEEKOM-IT15-Powerful-Display-Windows11Pro/dp/B0F8QKDY2S?th=1" target="_blank" rel="nofollow" data-dimension112="5532e003-edb5-4b5d-b02e-f5195d7d2be7" data-action="Deal Block" data-label="Geekom IT15 review" data-dimension48="Geekom IT15 review" data-dimension25="$999">View Deal</a></p></div><div class="product"><a data-dimension112="7adfdca9-2a98-41f6-89e4-e47a8a28c58d" data-action="Deal Block" data-label="If you like the portability of the original Khadas Mind but wish it was faster, than the Mind 2S is exactly what you're looking for. Equipped with an Intel Core Ultra 7 255H processor, 64GB of LPDDR5X RAM and a 2TB SSD, this is a powerful yet pocketable mini PC. You can also add more ports with the Mind Dock or even play the latest PC games with the Mind Graphics Dock." data-dimension48="If you like the portability of the original Khadas Mind but wish it was faster, than the Mind 2S is exactly what you're looking for. Equipped with an Intel Core Ultra 7 255H processor, 64GB of LPDDR5X RAM and a 2TB SSD, this is a powerful yet pocketable mini PC. You can also add more ports with the Mind Dock or even play the latest PC games with the Mind Graphics Dock." data-dimension25="$1439" href="https://www.amazon.com/Khadas-Mind-Mini-Battery%EF%BD%9COnly-435g%EF%BD%9CThunderbolt/dp/B0DWJSPPXF?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1377px;"><p class="vanilla-image-block" style="padding-top:47.64%;"><img id="cWR4HR7LkrZw4gQSigAfmR" name="Mind 2S" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/cWR4HR7LkrZw4gQSigAfmR.jpg" mos="" align="middle" fullscreen="" width="1377" height="656" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you like the portability of the original Khadas Mind but wish it was faster, than the Mind 2S is exactly what you're looking for. Equipped with an Intel Core Ultra 7 255H processor, 64GB of LPDDR5X RAM and a 2TB SSD, this is a powerful yet pocketable mini PC. You can also add more ports with the Mind Dock or even play the latest PC games with the Mind Graphics Dock.<a class="view-deal button" href="https://www.amazon.com/Khadas-Mind-Mini-Battery%EF%BD%9COnly-435g%EF%BD%9CThunderbolt/dp/B0DWJSPPXF?th=1" target="_blank" rel="nofollow" data-dimension112="7adfdca9-2a98-41f6-89e4-e47a8a28c58d" data-action="Deal Block" data-label="If you like the portability of the original Khadas Mind but wish it was faster, than the Mind 2S is exactly what you're looking for. Equipped with an Intel Core Ultra 7 255H processor, 64GB of LPDDR5X RAM and a 2TB SSD, this is a powerful yet pocketable mini PC. You can also add more ports with the Mind Dock or even play the latest PC games with the Mind Graphics Dock." data-dimension48="If you like the portability of the original Khadas Mind but wish it was faster, than the Mind 2S is exactly what you're looking for. Equipped with an Intel Core Ultra 7 255H processor, 64GB of LPDDR5X RAM and a 2TB SSD, this is a powerful yet pocketable mini PC. You can also add more ports with the Mind Dock or even play the latest PC games with the Mind Graphics Dock." data-dimension25="$1439">View Deal</a></p></div><h3 class="article-body__section" id="section-shop-today-s-best-early-black-friday-deals"><span>Shop today's best early Black Friday deals</span></h3><ul><li><strong>Amazon: </strong><a href="https://www.amazon.com/b?node=210998206011" target="_blank" rel="nofollow"><strong>50% off Ring, Ninja, Under Armour and more</strong></a><strong></strong></li><li><strong>Amazon Basics: </strong><a href="https://www.amazon.com/stores/page/947C6949-CF8E-4BD3-914A-B411DD3E4433" target="_blank" rel="nofollow"><strong>fitness/home/kitchen essentials from $3</strong></a><strong></strong></li><li><strong>REI: </strong><a href="https://www.rei.com/f/scd-deals" target="_blank" rel="nofollow"><strong>half-off Arc'teryx, Patagonia and more</strong></a><strong></strong></li><li><strong>Walmart: </strong><a href="https://www.walmart.com/cp/gifts/3131907" target="_blank" rel="nofollow"><strong>holiday gifts from $15</strong></a><strong></strong></li><li><strong>Dell: </strong><a href="https://www.dell.com/en-us/shop/deals?sortBy=price-ascending" target="_blank" rel="nofollow"><strong>monitors from $69, laptops from $299</strong></a><strong></strong></li><li><strong>Nectar: </strong><a href="https://www.nectarsleep.com/" target="_blank" rel="nofollow"><strong>50% off mattresses + 66% off bundles</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/site/all-electronics-on-sale/all-computers-tablets-on-sale/pcmcat1632941704767.c?id=pcmcat1632941704767" target="_blank" rel="nofollow"><strong>laptops from $149</strong></a><strong></strong></li><li><strong>Lenovo: </strong><a href="https://www.lenovo.com/us/en/d/deals/laptops/?IPromoID=LEN380027&sortBy=priceUp" target="_blank" rel="nofollow"><strong>doorbuster laptop deals from $319</strong></a><strong></strong></li><li><strong>Wayfair: </strong><a href="https://www.wayfair.com/daily-sales" target="_blank" rel="nofollow"><strong>up to 80% off home decor</strong></a></li><li><strong>Nike: </strong><a href="https://www.nike.com/w/sale-3yaep?sortBy=priceAsc" target="_blank" rel="nofollow"><strong>apparel/sneakers from $7</strong></a><strong></strong></li><li><strong>Lululemon: </strong><a href="https://shop.lululemon.com/c/we-made-too-much/n18mhd?Ns=price%7C0" target="_blank" rel="nofollow"><strong>top picks from $9</strong></a><strong></strong></li><li><strong>Newegg: </strong><a href="https://www.newegg.com/Black-November-Early-Access/EventSaleStore/ID-1132" target="_blank" rel="nofollow"><strong>Doorbuster deals from $6</strong></a></li><li><strong>Birkenstock: </strong><a href="https://www.nordstrom.com/browse/sale?sort=PercentOff&filterByBrand=birkenstock" target="_blank" rel="nofollow"><strong>deals from $20 @ Nordstrom</strong></a><strong></strong></li><li><strong>Saatva: </strong><a href="https://www.saatva.com/mattresses/saatva-classic?utm_source=futurepublishing&utm_medium=affiliate&coupon=awyqqgzvxqicebab" target="_blank" rel="nofollow"><strong>luxury mattresses from $1,099</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tried my first Copilot+ mini PC and it made using AI for work feel natural and not just a gimmick ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/desktop-computers/msi-cubi-nuc-ai-plus-2mg-review</link>
                                                                            <description>
                            <![CDATA[ The MSI Cubi NUC AI+ 2MG is a powerful yet whisper-quiet mini PC that puts AI front and center as a Copilot+ PC. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">59PawhWn6UBfiyvmXz8o8k</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/AcFvJ9E6d8DTmnvA9rKupG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 19 Nov 2025 21:36:46 +0000</pubDate>                                                                                                                                <updated>Thu, 04 Jun 2026 12:51:34 +0000</updated>
                                                                                                                                            <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/AcFvJ9E6d8DTmnvA9rKupG-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A person pressing the Copilot button on the front of the MSI Cubi NUC AI+ 2MG mini PC on a desk with a dual-monitor setup in the background and a mechanical keyboard and trackball mouse in the foreground]]></media:description>                                                            <media:text><![CDATA[A person pressing the Copilot button on the front of the MSI Cubi NUC AI+ 2MG mini PC on a desk with a dual-monitor setup in the background and a mechanical keyboard and trackball mouse in the foreground]]></media:text>
                                <media:title type="plain"><![CDATA[A person pressing the Copilot button on the front of the MSI Cubi NUC AI+ 2MG mini PC on a desk with a dual-monitor setup in the background and a mechanical keyboard and trackball mouse in the foreground]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/AcFvJ9E6d8DTmnvA9rKupG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The MSI Cubi NUC AI+ 2MG is a compact mini PC with plenty of power under the hood in a sleek, all-black case. Besides being a powerful mini PC well suited for business and productivity, it’s also a Copilot+ PC which means you get instant access to Microsoft’s latest AI features and a dedicated Copilot button right on the front.</p><p>MSI didn’t stop there with AI though as the Cubi NUC AI+ 2MG includes the company’s own AI Engine software to automatically adjust this mini PC’s settings based on the task at hand. </p><p>Likewise, you also get a feature you rarely see on other mini PCs: a built-in microphone and speaker. This lets you interact with Microsoft Copilot or other AI assistants hands-free and personally, I really enjoyed pressing the button on the front to instantly bring up Copilot when I needed to.</p><p>Packed with either a high-end Intel Ultra 7 or Ultra 9 processor and plenty of memory, the Cubi NUC AI+ 2MG is the perfect little desktop companion for getting work done. It has a similar front port layout, but it lacks the second HDMI port that was useful for quick dual-monitor setups on the older <a href="https://www.tomsguide.com/computing/desktop-computers/msi-cubi-nuc-1m-review">MSI Cubi NUC 1M</a>.</p><p>Still, besides two variations to pick from (with a less powerful Ultra 5 variant available in some regions), there are also slightly cheaper barebones configurations of the Cubi NUC AI+ 2MG if you’d rather provide your own storage and operating system.</p><p>My MSI Cubi NUC AI+ 2MG review will help you decide if this is the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PC</a> for you or if something cheaper without all its AI-powered features would be a better fit.</p><h3 class="article-body__section" id="section-msi-cubi-nuc-ai-2mg-cheat-sheet"><span>MSI Cubi NUC AI+ 2MG: Cheat Sheet</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wL66WhoBRKfdputCmi4cyA" name="MSI Cubi NUC AI+ 2MG-15" alt="The MSI Cubi NUC AI+ 2MG unboxed on a desk" src="https://cdn.mos.cms.futurecdn.net/wL66WhoBRKfdputCmi4cyA.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><ul><li><strong>What is it? </strong>A sleek, all-black mini PC with plenty of ports and some unique features.</li><li><strong>Who is it for? </strong>Business users or professionals that want a small and quiet mini PC that comes with Microsoft’s Copilot+ AI features built-in.</li><li><strong>What does it cost? </strong>The MSI Cubi NUC AI+ 2MG <a href="https://www.amazon.com/dp/B0FBPTJSQ3?CID" target="_blank" rel="nofollow">costs $949 for the standard model</a> or <a href="https://www.amazon.com/dp/B0FBPFW6V6" target="_blank" rel="nofollow">$1,054 for the upgraded version</a>. However, you can also get either one in a barebones configuration for slightly less but you will have to provide your own storage and operating system.</li><li><strong>What do we like? </strong>Its near-silent operation, the built-in fingerprint scanner and Copilot button on the front, the two Thunderbolt 4 ports at the back (one can be used for power in) and how MSI makes it easy to mount and use this mini PC behind a monitor.</li><li><strong>What don’t we like? </strong>That there’s one less HDMI port on the back compared to the previous model, and how its RAM is soldered to the motherboard, which means you can’t upgrade it.</li></ul><h3 class="article-body__section" id="section-msi-cubi-nuc-ai-2mg-specs"><span>MSI Cubi NUC AI+ 2MG: Specs</span></h3><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$899 (barebones), $949 (as tested)</p></td><td  ><p>$999 (barebones) $1,054</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Intel Core Ultra 7 258V</p></td><td  ><p>Intel Core Ultra 9 288V</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Intel Arc Graphics 140V</p></td><td  ><p>Intel Core Ultra 7 258V</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>32GB LPDDR5X</p></td><td  ><p>32GB LPDDR5X</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>1TB M.2 SSD</p></td><td  ><p>1 TB M.2 SSD</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>2 x USB-A, 1 x microSD card reader, 1 x 3.5mm headphone jack (front), 2 x USB-A, 2x Thunderbolt 4 (1 x with 100W PD-in), 1 x HDMI 2.1, 2 x 2.5 GbE (rear)</p></td><td  ><p>2 x USB-A, 1 x microSD card reader, 1 x 3.5mm headphone jack (front), 2 x USB-A, 2x Thunderbolt 4 (1 x with 100W PD-in), 1 x HDMI 2.1, 2 x 2.5 GbE (rear)</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 6E, Bluetooth 5.3</p></td><td  ><p>Wi-Fi 6E, Bluetooth 5.3</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>5.34 x 5.22 x 1.97 inches</p></td><td  ><p>5.34 x 5.22 x 1.97 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1.39 pounds</p></td><td  ><p>1.39 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-msi-cubi-nuc-ai-2mg-the-ups"><span>MSI Cubi NUC AI+ 2MG: The ups</span></h3><p>The MSI Cubi NUC AI+ 2MG manages to pack more powerful internals into the same small chassis without adding extra noise. However, it’s the new AI-powered features and a few key upgrades that allow it to easily outshine its predecessor.</p><h2 id="a-silent-powerhouse">A silent powerhouse</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jRHE3xPvf2hbbQ6oKdZEW8" name="MSI Cubi NUC AI+ 2MG-14" alt="The MSI Cubi NUC AI+ 2MG upright on a desk" src="https://cdn.mos.cms.futurecdn.net/jRHE3xPvf2hbbQ6oKdZEW8.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>At 5.34 x 5.22 x 1.97 inches, the Cubi NUC AI+ 2MG has the exact same dimensions as the Cubi NUC 1M. However, MSI has made some slight tweaks to both the front and back of this new mini PC while retaining the same overall design.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="ZngPqFXWmdcuDr9HVKCxNg" name="MSI Cubi NUC AI+ 2MG-3" alt="A person using the integrated fingerprint scanner in the power button of the MSI Cubi NUC AI+ 2MG mini PC" src="https://cdn.mos.cms.futurecdn.net/ZngPqFXWmdcuDr9HVKCxNg.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Up front, you get two high-speed USB-A ports, a microSD card reader and a headphone jack like before. However, the power button has moved to the left side of the Cubi NUC AI+ 2MG to make space for the new Copilot button and an integrated fingerprint scanner. At the top, there are also now two small holes which are used for the built-in microphone.</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="kfCXCSv9VkBWu9dPq5HuE4" name="MSI Cubi NUC AI+ 2MG-13" alt="An angled shot showing the rear ports of the MSI Cubi NUC AI+ 2MG" src="https://cdn.mos.cms.futurecdn.net/kfCXCSv9VkBWu9dPq5HuE4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>On the back of the Cubi NUC AI+ 2MG, you get a nice selection of ports including two USB-A ports, two Thunderbolt 4 ports, two 2.5 gigabit Ethernet ports, HDMI 2.1 and a barrel port connector for its 120W power supply. If you look closely at the Thunderbolt 4 port on the right though, you’ll notice a small plug icon. This was one of my favorite things while testing since you can swap out the included power adapter for any USB-C GaN charger providing 100W Power Delivery (PD) instead.</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="cSxmaK2rW8urKXrEN3yZj8" name="Chrome-Feature-LEDE" alt="Two Chrome windows with Split Tabs side by side on a dual-monitor setup" src="https://cdn.mos.cms.futurecdn.net/cSxmaK2rW8urKXrEN3yZj8.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I spent a month or so using the Cubi NUC AI+ 2MG as my daily driver and during that time, I was really surprised by just how quiet it was, even when dealing with more demanding workloads like photo editing and transferring large files. In fact, I had both it and the <a href="https://www.tomsguide.com/computing/desktop-computers/mini-pcs/geekom-it15-review">Geekom IT15</a> in the same room and while the latter got noticeably loud doing these same types of tasks, the Cubi NUC AI+ 2MG remained almost silent.</p><div ><table><caption>Performance Benchmarks</caption><thead><tr><th class="firstcol empty" ></th><th  ><p>MSI Cubi NUC AI+ 2MG</p></th><th  ><p>Geekom IT15</p></th><th  ><p>MSI Cubi NUC 1M</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Geekbench 6.3 single-core</strong></p></td><td  ><p>2655</p></td><td  ><p>3080</p></td><td  ><p>2712</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6.3 multi-core</strong></p></td><td  ><p>9020</p></td><td  ><p>15589</p></td><td  ><p>8740</p></td></tr><tr><td class="firstcol " ><p><strong>Handbrake (Mins:Secs)</strong></p></td><td  ><p>6:25</p></td><td  ><p>4:44</p></td><td  ><p>9:34</p></td></tr></tbody></table></div><p>During benchmark testing, the Cubi NUC AI+ 2MG showed a massive improvement over its predecessor when transcoding video files in Handbrake and scored higher in Geekbench 6.3’s multi-core tests. However, it fell slightly behind the Cubi NUC 1M in single-core performance. This is a deliberate architectural trade-off though. With its newer Lunar Lake chips, Intel optimized them for improved power efficiency and AI performance in small systems, rather than prioritizing higher speeds for a single task like its older Raptor Lake chips did. The Geekom IT15 did easily beat out the Cubi NUC AI+ 2MG overall, but like I mentioned, it was a lot louder while doing so.</p><p>The Cubi NUC AI+ 2MG is an excellent mini PC for work and business-related tasks, but thanks to its integrated Intel Arc Graphics 140V graphics, it can handle photo and video editing as well as some light gaming too. However, this mini PC has another trick up its sleeve that makes it ideal for covert, behind your monitor setups.</p><h2 id="mountable-but-better-front-and-center">Mountable but better front and center</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5618px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PHhcrc5sLL7uJsN9xrdb45" name="MSI Cubi NUC AI+ 2MG-6" alt="A person holding the MSI Cubi NUC AI+ 2MG mini PC in front of an MSI monitor with a VESA mounting bracket installed on the back of the display" src="https://cdn.mos.cms.futurecdn.net/PHhcrc5sLL7uJsN9xrdb45.jpg" mos="" align="middle" fullscreen="" width="5618" height="3160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Inside the box with most mini PCs, you’ll find a VESA plate adapter that lets you mount the computer behind your monitor to free up space on your desk. While MSI also includes one with the Cubi NUC AI+ 2MG, it takes things a step further.</p><p>You see, with your mini PC mounted behind your monitor, reaching its power button can be awkward. To solve this, MSI developed a proprietary HDMI-CES feature called Power Link that automatically turns on the 2MG (and the 1M) when you turn on your monitor.</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:4752px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YPZDxsFteM23aFkBycZzR9" name="MSI Cubi NUC AI+ 2MG-7" alt="The MSI Cubi NUC AI+ 2MG mounted onto the back of a monitor" src="https://cdn.mos.cms.futurecdn.net/YPZDxsFteM23aFkBycZzR9.jpg" mos="" align="middle" fullscreen="" width="4752" height="2673" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>However, you will need a compatible MSI monitor that supports Power Link to pull this off. I tested this with the Pro MP271A E2 business and productivity monitor MSI sent over with the Cubi NUC AI+ 2MG and it worked like a charm.</p><p>Given that you may not have an MSI monitor on hand or aren’t ready to swap out your current display, you also get a wired external power button. It plugs into the side of the Cubi NUC AI+ 2MG and has an adhesive back which makes it easy to stick anywhere on your desk for quick access.</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:4965px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TyEyvBo5zBoKj2fTCTJBMF" name="MSI Cubi NUC AI+ 2MG-5" alt="A simple, single monitor desk setup built around the MSI Cubi NUC AI+ 2MG with the mini PC mounted on the back of the display" src="https://cdn.mos.cms.futurecdn.net/TyEyvBo5zBoKj2fTCTJBMF.jpg" mos="" align="middle" fullscreen="" width="4965" height="2793" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Although I really enjoyed using the Cubi NUC AI+ 2MG behind a monitor as it almost felt like an all-in-one computer like the <a href="https://www.tomsguide.com/computing/apple-desktops/apple-imac-m4-review">M4 iMac</a>, I actually preferred having it right in front of me at my desk. That way, I could use the microSD card reader on the front to quickly take photos off my camera and the integrated fingerprint scanner in its power button made logging into Windows seamless. There’s another reason you’d want to have this mini PC within arm’s reach though.</p><h2 id="copilot-on-your-desk-not-your-lap">Copilot+ on your desk not your lap</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="mMfiCyzk9h8vF8JM3ytpBe" name="MSI Cubi NUC AI+ 2MG-2" alt="A person pressing the Copilot button on the front of the MSI Cubi NUC AI+ 2MG" src="https://cdn.mos.cms.futurecdn.net/mMfiCyzk9h8vF8JM3ytpBe.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Up until very recently, if you wanted a Copilot+ PC with all of Microsoft’s AI-powered features, you’d have to spring for one of the <a href="https://www.tomsguide.com/best-picks/best-laptops">best laptops</a>. Fortunately, that’s no longer the case and you can now find a few mini PCs that come with Copilot+ certification.</p><p>The Cubi NUC AI+ 2MG is the first one I’ve tried though and while I typically prefer Gemini over ChatGPT, I found myself using Copilot more often than I thought I would. This is because it has a dedicated Copilot button on the front right next to its microSD card reader. What I liked about this approach is that instead of opening a new tab or a new Chrome window, I just pressed the button and Copilot sprung to life.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XaavwysgbrJ59tWpbVWDba" name="im listening" alt="A screenshot showing what it looks like to use Copilot Voice on the MSI Cubi NUC AI+ 2MG" src="https://cdn.mos.cms.futurecdn.net/XaavwysgbrJ59tWpbVWDba.png" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Another feature that really impressed me is that with the built-in microphone and 2W internal speaker, I could also pull up Copilot’s voice mode and chat away with Microsoft’s AI assistant while I worked. Likewise, the built-in microphone also proved handy when I wanted to use voice search in Chrome.</p><p>In addition to a dedicated Copilot button, you also get access to the rest of Microsoft’s Copilot+ PC features like live captions and translation, Windows Studio Effects to improve your video calls, Cocreator in Paint, click-to-do contextual AI and the company’s somewhat controversial <a href="https://www.tomsguide.com/computing/microsoft-recall-is-coming-for-real-this-time">Recall feature</a>. These are all powered by the Cubi NUC AI+ 2MG’s NPU which is rated at up to 48 TOPS.</p><p>Overall, the Cubi NUC AI+ 2MG is ideal for business-related tasks but it’s also quite well-suited for AI ones too.</p><h3 class="article-body__section" id="section-msi-cubi-nuc-ai-2mg-the-downs"><span>MSI Cubi NUC AI+ 2MG: The downs</span></h3><p>The Cubi NUC AI+ 2MG certainly improves upon its predecessor with more impressive specs and some useful new features, all within the same sized case. However, it’s not without its downsides, which include one fewer port around back and less long-term upgradability.</p><h2 id="complicating-multi-monitor-setups">Complicating multi-monitor setups</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="QgBzQwMaXTk9vrWALJnifi" name="DSC02747.JPG" alt="The rear ports on the MSI Cubi NUC AI+ 2MG mini PC" src="https://cdn.mos.cms.futurecdn.net/QgBzQwMaXTk9vrWALJnifi.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Don’t get me wrong, with two Thunderbolt 4 ports and an HDMI 2.1 port around back, the Cubi NUC AI+ 2MG can easily power a triple-monitor setup. However, as someone who tested and reviewed the 1M, I immediately noticed that there was one less port around back.</p><p>With the Cubi NUC AI+ 2MG, you have almost an identical port layout to the 1M. However, instead of a second HDMI port underneath the Thunderbolt 4 port on the right like on the 1M, there’s just a blank space. </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:6000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="ZbJJKnetRYWW3yV7RDgSqR" name="MSI Cubi NUC AI+ 2MG-4" alt="A dual-monitor setup built around the MSI Cubi NUC AI+ 2MG with the mini PC between the two displays" src="https://cdn.mos.cms.futurecdn.net/ZbJJKnetRYWW3yV7RDgSqR.jpg" mos="" align="middle" fullscreen="" width="6000" height="3376" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Now I know <a href="https://www.tomsguide.com/features/thunderbolt-4-vs-usb4-whats-the-difference">Thunderbolt 4</a> is the more versatile port overall but if you want to quickly put together a dual-monitor setup with practically any two monitors, HDMI is the easiest way to do so. To run a dual-monitor setup now, you are forced to dedicate one of the precious Thunderbolt 4 ports to video output using a USB-C to HDMI/DP adapter like I did in the picture above. Likewise, while all of the <a href="https://www.tomsguide.com/best-picks/best-monitors">best monitors</a> have HDMI, only more expensive models come with Thunderbolt or USB-C inputs.</p><p>When taking a close look at the rear ports on the Cubi NUC AI+ 2MG I noticed another downgrade too. While there were two USB 3.2 Gen 2 (10 Gbps) ports on the 1M, these have been swapped with much slower USB 2.0 ones. You still get two high-speed USB-A ports on the front but if you want to plug in one of the <a href="https://www.tomsguide.com/best-picks/best-external-hard-drives">best external hard drives</a> to back up your data, you’re more likely to use one of the rear ports instead of one on the front.</p><p>The missing HDMI port on the Cubi NUC AI+ 2MG stood out to me most but there’s another big change inside that makes buying a higher-specced version of this mini PC from the get-go a better option if you’re interested in using it as your long-term work machine.</p><h2 id="fast-but-not-quite-futureproof">Fast but not quite futureproof</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gpPffYS8qqAEre5CKdKhNf" name="MSI Cubi NUC AI+ 2MG-11" alt="Using a screwdriver to open up the MSI Cubi NUC AI+ 2MG by unscrewing its case feet" src="https://cdn.mos.cms.futurecdn.net/gpPffYS8qqAEre5CKdKhNf.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Toms' Guide)</span></figcaption></figure><p>With either an Intel Core Ultra 7 258V or an Intel Core Ultra 9 288V under the hood, the Cubi NUC AI+ 2MG is a fast and very capable mini PC, especially as either variation also comes with 32GB of LPDDR5X memory. However, one of the perks of using a mini PC over a laptop, is that most of them are upgradeable. Opening up the NUC AI+ 2MG is easy enough — just four screws on its underside that do double duty as its feet. </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="iNtqJU8Ye84sEjFtuHDZBk" name="MSI Cubi NUC AI+ 2MG-12" alt="The MSI Cubi NUC AI+ 2MG open on a table showing its motherboard, SSD and soldered memory" src="https://cdn.mos.cms.futurecdn.net/iNtqJU8Ye84sEjFtuHDZBk.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Once inside, you can swap out the included M.2 SSD for something larger. However, you’re going to want to back up that drive first as there isn’t a second free M.2 slot for adding extra storage. While the single slot does support the latest, ultra-fast PCIe 5.0 drives, you are capped at whatever capacity you install.</p><p>Unlike the 1M though, you aren’t able to swap out its RAM either. This is because, like with the Ryzen AI Max chip in the <a href="https://www.tomsguide.com/computing/mini-pcs/framework-desktop-review">Framework Desktop</a>, the LPDDR5X memory is soldered directly to the motherboard. This design is necessary for the highest possible power efficiency and speed of the Intel Ultra 7 or 9 processor, but it means that while MSI gives you a generous 32GB as standard, jumping up to 64GB in the future just isn’t possible.</p><h3 class="article-body__section" id="section-msi-cubi-nuc-ai-2mg-verdict"><span>MSI Cubi NUC AI+ 2MG: Verdict</span></h3><p>The MSI Cubi NUC AI+ 2MG is an impressive, whisper-quiet Copilot+ mini PC with plenty of power under the hood and enough improvements across the board to make upgrading from the older Cubi NUC 1M worthwhile. </p><p>Not only can you easily mount and power it on/off behind your monitor but the integrated fingerprint scanner in the power button and the dedicated Copilot button are just as good of a reason to keep it front and center on your desk.</p><p>MSI gives you a great selection of both essential and more powerful ports and it’s always great to see a built-in microSD card reader for extra storage or transferring photos. While I would have liked to have a second HDMI port and faster USB-A ports around back, the Cubi NUC AI+ 2MG makes up for this with 32GB of soldered, faster LPDDR5X RAM in the base model and its new Copilot+ features as well as the built-in microphone and speaker to quickly converse with your AI assistant.</p><p>Given the current retail price, if you’re after a powerful mini PC with a generous 3-year warranty and readily available after service to use as your next work machine, the Cubi NUC AI+ 2MG is easy to recommend, especially if you’re invested in Microsoft’s ecosystem and require the power of a dedicated NPU. Given the changes MSI has made between it and the 1M, I’m excited to see what’s new in the follow-up to the 2MG.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I review mini PCs for a living and these 7 early Black Friday deals let you downsize for less ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/i-review-mini-pcs-for-a-living-and-these-7-early-black-friday-deals-let-you-downsize-for-less</link>
                                                                            <description>
                            <![CDATA[ Ditch your bulky desktop and say goodbye to charging your laptop with these awesome mini PC deals from Apple, Geekom, Khadas and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">s9pTBkrNxrVBaH7udU6gUj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/KQThjyKz5RyuDxx9JTuqTB-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 16 Nov 2025 11:30:00 +0000</pubDate>                                                                                                                                <updated>Thu, 20 Nov 2025 13:44:17 +0000</updated>
                                                                                                                                            <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/KQThjyKz5RyuDxx9JTuqTB-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Geekom A5 mini PC on a desk with a Tom&#039;s Guide Black Friday deals badge]]></media:description>                                                            <media:text><![CDATA[The Geekom A5 mini PC on a desk with a Tom&#039;s Guide Black Friday deals badge]]></media:text>
                                <media:title type="plain"><![CDATA[The Geekom A5 mini PC on a desk with a Tom&#039;s Guide Black Friday deals badge]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/KQThjyKz5RyuDxx9JTuqTB-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>You don’t have to give up precious desk space to have a powerful computer. In fact, many of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a> aren’t that much larger than a stack of coasters. I know there’s still plenty of time until the holiday shopping season officially kicks off, but with these early <a href="https://www.tomsguide.com/live/news/best-black-friday-deals-sales-picked-by-experts">Black Friday deals</a> on some of my favorite mini PCs, you can get a fast computer with a small footprint for even less. I've scoured the early sales and found deals covering every need, from high-end workstations to budget-friendly gaming rigs.</p><p>If you’ve always wanted to try out macOS or your old MacBook is starting to show its age, the <a href="https://www.amazon.com/Apple-2024-Desktop-Computer-10%E2%80%91core/dp/B0DLBTPDCS" target="_blank" rel="nofollow">Mac mini M4 is $120 off</a> right now. Likewise, if you’re not quite ready to build a gaming PC but are tired of playing on a console, you can pick up the <a href="https://www.amazon.com/GMKtec_ultra_285h_ai_mini_pc_evo_t1/dp/B0FH4NZ6DX" target="_blank" rel="nofollow">GMKtec EVO-T1 for $300 off,</a> and thanks to its OCulink Port, you can always hook up an external graphics card. There are also some great deals on more budget-friendly systems, like <a href="https://www.bestbuy.com/product/geekom-a5-mini-pc-amd-ryzen-7-5825u-up-to-4-5ghz-16gb-ddr4-ram-512gb-m-2-pcie-nvme-ssd-windows-11-pro-pre-installed-rose-gold/J3GW668X3Y/sku/10152219" target="_blank" rel="nofollow">$120 off the Geekom A5 2025 Edition</a>.</p><p>There are plenty of other mini PCs I personally recommend on sale below, so keep scrolling to see the best ones I’ve found yet. And if you don’t see anything you like, keep checking back as I plan on updating my list of the best Black Friday mini PC deals as we get closer to and during the biggest sales event of the year.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong>Kamrui E3B: </strong><a href="https://www.amazon.com/KAMRUI-E3B-Computers-Desktop-Computer/dp/B0FLDXVLCT" target="_blank" rel="nofollow"><strong>was $497 now $319 @ Amazon</strong></a><strong></strong></li><li><strong>MSI Cubi NUC 1MG: </strong><a href="https://www.bestbuy.com/product/msi-cubi-nuc-1mg-mini-desktop-intel-core-3-100u-16gb-memory-intel-graphics-500gb-ssd-black/J3P7TXQ8KX" target="_blank" rel="nofollow"><strong>was $499 now $349 @ Best Buy</strong></a><strong></strong></li><li><strong>Geekom A5: </strong><a href="https://www.bestbuy.com/product/geekom-a5-mini-pc-amd-ryzen-7-5825u-up-to-4-5ghz-16gb-ddr4-ram-512gb-m-2-pcie-nvme-ssd-windows-11-pro-pre-installed-rose-gold/J3GW668X3Y/sku/10152219" target="_blank" rel="nofollow"><strong>was $499 now $379 @ Best Buy</strong></a><strong></strong></li><li><strong>Khadas Mind: </strong><a href="https://www.amazon.com/Khadas-i7-1360P-Computer-Portable-Business/dp/B0DPMTYQ8Z" target="_blank" rel="nofollow"><strong>was $549 now $494 @ Amazon</strong></a><strong></strong></li><li><strong>Mac mini M4: </strong><a href="https://www.amazon.com/Apple-2024-Desktop-Computer-10%E2%80%91core/dp/B0DLBTPDCS" target="_blank" rel="nofollow"><strong>was $599 now $479 @ Amazon</strong></a><strong></strong></li><li><strong>Geekom A8: </strong><a href="https://www.amazon.com/GEEKOM-A8-Computers-5600MHz-Windows/dp/B0D22FYFL4" target="_blank" rel="nofollow"><strong>was $859 now $679 @ Amazon</strong></a><strong></strong></li><li><strong>GMKtec EVO-T1: </strong><a href="https://www.amazon.com/GMKtec_ultra_285h_ai_mini_pc_evo_t1/dp/B0FH4NZ6DX" target="_blank" rel="nofollow"><strong>was $1,299 now $999 @ Amazon</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-best-mini-pc-deals"><span>Best mini PC deals</span></h3><div class="product"><a data-dimension112="3b21ba46-2ec5-4606-8bf3-5e65a75ffec1" data-action="Deal Block" data-label="Kamrui E3B review" data-dimension48="Kamrui E3B review" data-dimension25="$319" href="https://www.amazon.com/KAMRUI-E3B-Computers-Desktop-Computer/dp/B0FLDXVLCT" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1464px;"><p class="vanilla-image-block" style="padding-top:88.25%;"><img id="grRSkC5jNEgiNztNDmzvfS" name="61a962e7+cL._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/grRSkC5jNEgiNztNDmzvfS.jpg" mos="" align="middle" fullscreen="" width="1464" height="1292" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Kamrui E3B was my previous pick for the best budget mini PC as you get plenty of power for the price. However, this deal gets you the upgraded version that comes with a more powerful AMD Ryzen 7 7730U processor, 16GB of DDR4 RAM and a 512GB M.2 SSD. On the front of the E3B, you get two USB-A ports, a USB-C port with video out and a headphone jack. Around back, you get HDMI and DisplayPort for video out, a Gigabit Ethernet jack and, surprisingly, four more USB-A ports. In my <a href="https://www.tomsguide.com/computing/desktop-computers/kamrui-e3b-review-a-budget-mini-pc-that-punches-above-its-weight" data-dimension112="3b21ba46-2ec5-4606-8bf3-5e65a75ffec1" data-action="Deal Block" data-label="Kamrui E3B review" data-dimension48="Kamrui E3B review" data-dimension25="$319">Kamrui E3B review</a>, I praised its near-silent fan and its sleek, all-black design.<a class="view-deal button" href="https://www.amazon.com/KAMRUI-E3B-Computers-Desktop-Computer/dp/B0FLDXVLCT" target="_blank" rel="nofollow" data-dimension112="3b21ba46-2ec5-4606-8bf3-5e65a75ffec1" data-action="Deal Block" data-label="Kamrui E3B review" data-dimension48="Kamrui E3B review" data-dimension25="$319">View Deal</a></p></div><div class="product"><a data-dimension112="0df1ccc2-35b5-4c05-a472-58e2594098b8" data-action="Deal Block" data-label="MSI Cubi NUC AI+ 2MG" data-dimension48="MSI Cubi NUC AI+ 2MG" data-dimension25="$349" href="https://www.bestbuy.com/product/msi-cubi-nuc-1mg-mini-desktop-intel-core-3-100u-16gb-memory-intel-graphics-500gb-ssd-black/J3P7TXQ8KX" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1284px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="mGYgaheqBuuWDVL7yTNyUd" name="msi-cubi-nuc-1m-quick-grid" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/mGYgaheqBuuWDVL7yTNyUd.jpg" mos="" align="middle" fullscreen="" width="1284" height="1284" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The MSI Cubi NUC 1MG may not be the most powerful version of this mini desktop, but it's still at a fantastic price thanks to the discount. Expect an Intel Core 3-100U processor with 16GB of RAM and a 500GB SSD, which will power through everyday tasks to keep up with your workflow. It also comes equipped with a handy microSD Card Reader, two HDMI ports and plenty of USB-A 3.2 ports. I reviewed the latest <a href="https://www.tomsguide.com/computing/desktop-computers/msi-cubi-nuc-ai-plus-2mg-review" data-dimension112="0df1ccc2-35b5-4c05-a472-58e2594098b8" data-action="Deal Block" data-label="MSI Cubi NUC AI+ 2MG" data-dimension48="MSI Cubi NUC AI+ 2MG" data-dimension25="$349">MSI Cubi NUC AI+ 2MG</a>, and was a big fan of its whisper-quiet design and convenient front ports. And this model keeps that trend. <a class="view-deal button" href="https://www.bestbuy.com/product/msi-cubi-nuc-1mg-mini-desktop-intel-core-3-100u-16gb-memory-intel-graphics-500gb-ssd-black/J3P7TXQ8KX" target="_blank" rel="nofollow" data-dimension112="0df1ccc2-35b5-4c05-a472-58e2594098b8" data-action="Deal Block" data-label="MSI Cubi NUC AI+ 2MG" data-dimension48="MSI Cubi NUC AI+ 2MG" data-dimension25="$349">View Deal</a></p></div><div class="product"><a data-dimension112="4e8330cd-212c-4104-a3ac-d7182c51bcb1" data-action="Deal Block" data-label="Geekom A5 2025 Edition review" data-dimension48="Geekom A5 2025 Edition review" data-dimension25="$379" href="https://www.bestbuy.com/product/geekom-a5-mini-pc-amd-ryzen-7-5825u-up-to-4-5ghz-16gb-ddr4-ram-512gb-m-2-pcie-nvme-ssd-windows-11-pro-pre-installed-rose-gold/J3GW668X3Y/sku/10152219" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1440px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="C3tjN9QTZGsjMycxjiM7qE" name="Geekom A5 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/C3tjN9QTZGsjMycxjiM7qE.jpg" mos="" align="middle" fullscreen="" width="1440" height="1440" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Geekom A5 (2025 Edition) is my new pick for the best budget mini PC. It’s powered by an AMD Ryzen 7 5825U processor and comes with 16GB of DDR4 RAM and a 512GB M.2 SSD. While you don’t get a USB-C port on the front (just two USB-A ports and a headphone jack), around back you get two USB-C ports with video out, two HDMI ports, two USB-A ports and a 2.5 Gbps Ethernet port. Oh, and did I mention there’s an SD card reader on the side? In my <a href="https://www.tomsguide.com/computing/desktop-computers/geekom-a5-review" data-dimension112="4e8330cd-212c-4104-a3ac-d7182c51bcb1" data-action="Deal Block" data-label="Geekom A5 2025 Edition review" data-dimension48="Geekom A5 2025 Edition review" data-dimension25="$379">Geekom A5 2025 Edition review</a>, I said this affordable mini PC performs even better than it looks with its unique rose gold colorway.<a class="view-deal button" href="https://www.bestbuy.com/product/geekom-a5-mini-pc-amd-ryzen-7-5825u-up-to-4-5ghz-16gb-ddr4-ram-512gb-m-2-pcie-nvme-ssd-windows-11-pro-pre-installed-rose-gold/J3GW668X3Y/sku/10152219" target="_blank" rel="nofollow" data-dimension112="4e8330cd-212c-4104-a3ac-d7182c51bcb1" data-action="Deal Block" data-label="Geekom A5 2025 Edition review" data-dimension48="Geekom A5 2025 Edition review" data-dimension25="$379">View Deal</a></p></div><div class="product"><a data-dimension112="c9854e35-7f4b-4dec-a0bb-d5969eb568ac" data-action="Deal Block" data-label="Khadas Mind review" data-dimension48="Khadas Mind review" data-dimension25="$494" href="https://www.amazon.com/Khadas-i7-1360P-Computer-Portable-Business/dp/B0DPMTYQ8Z" 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:77.20%;"><img id="EqippTHHRTWnfyFeqdyB9F" name="61eODiqNLYL._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EqippTHHRTWnfyFeqdyB9F.jpg" mos="" align="middle" fullscreen="" width="1500" height="1158" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The standard Khadas Mind packs an Intel i5-1340p processor, 16GB of DDR5 RAM and a 512GB SSD into an absolutely tiny package. There’s a power button on the front, cooling on the sides and around back, you get two USB-A ports, two USB-C ports (one for power) and an HDMI port. However, there’s also a free M.2 SSD slot on the bottom if you want to add more storage to the base Khadas Mind. In my <a href="https://www.tomsguide.com/computing/desktop-computers/khadas-mind-review" data-dimension112="c9854e35-7f4b-4dec-a0bb-d5969eb568ac" data-action="Deal Block" data-label="Khadas Mind review" data-dimension48="Khadas Mind review" data-dimension25="$494">Khadas Mind review</a>, I praised this pocketable mini PC for its slim profile and the fact that you can add more ports or even a graphics card thanks to Khadas’ first-party docks.<a class="view-deal button" href="https://www.amazon.com/Khadas-i7-1360P-Computer-Portable-Business/dp/B0DPMTYQ8Z" target="_blank" rel="nofollow" data-dimension112="c9854e35-7f4b-4dec-a0bb-d5969eb568ac" data-action="Deal Block" data-label="Khadas Mind review" data-dimension48="Khadas Mind review" data-dimension25="$494">View Deal</a></p></div><div class="product"><a data-dimension112="95bedaaf-5540-43f7-805f-f2cfcb5140f6" data-action="Deal Block" data-label="Mac mini M4 review" data-dimension48="Mac mini M4 review" data-dimension25="$479" href="https://www.amazon.com/Apple-2024-Desktop-Computer-10%E2%80%91core/dp/B0DLBTPDCS" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="L8QA9sZYoSqocSTyVMrAFY" name="Mac mini M4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/L8QA9sZYoSqocSTyVMrAFY.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The base model Mac mini M4 is a big step up from its predecessor and likely enough for most people without any expensive upgrades. It comes with Apple’s powerful M4 chip, 16GB of RAM and 256GB of storage. You also get plenty of ports in a tiny package with three Thunderbolt 4 ports, two USB-C ports, HDMI and Ethernet. If it weren't for the awkward power button placement and the complete lack of USB-A ports, I would have easily given this one 5 stars in my <a href="https://www.tomsguide.com/computing/desktop-computers/mac-mini-m4-review" data-dimension112="95bedaaf-5540-43f7-805f-f2cfcb5140f6" data-action="Deal Block" data-label="Mac mini M4 review" data-dimension48="Mac mini M4 review" data-dimension25="$479">Mac mini M4 review</a>.<a class="view-deal button" href="https://www.amazon.com/Apple-2024-Desktop-Computer-10%E2%80%91core/dp/B0DLBTPDCS" target="_blank" rel="nofollow" data-dimension112="95bedaaf-5540-43f7-805f-f2cfcb5140f6" data-action="Deal Block" data-label="Mac mini M4 review" data-dimension48="Mac mini M4 review" data-dimension25="$479">View Deal</a></p></div><div class="product"><a data-dimension112="a737a8ca-aef2-4d13-99d5-9888fed92e0c" data-action="Deal Block" data-label="The Beelink SER8 comes fully equipped with 32GB of RAM and a 1TB SSD along with plenty of ports. In fact, the SER8 can be used in a triple-monitor setup as around the back; you get an HDMI 2.1 port, DisplayPort 1.4 and a USB4 port along with three USB-A ports and a 2.5 Gigabit Ethernet port, which is perfect for multi-gig internet plans. Powered by a Ryzen 7 8745HS processor, this mini PC is perfect for work and can even handle some light gaming thanks to its built-in Radeon 780M graphics. You can also upgrade the SER8 with up to 64TB of DDR5 RAM and 2TB of storage if you need even more power later on." data-dimension48="The Beelink SER8 comes fully equipped with 32GB of RAM and a 1TB SSD along with plenty of ports. In fact, the SER8 can be used in a triple-monitor setup as around the back; you get an HDMI 2.1 port, DisplayPort 1.4 and a USB4 port along with three USB-A ports and a 2.5 Gigabit Ethernet port, which is perfect for multi-gig internet plans. Powered by a Ryzen 7 8745HS processor, this mini PC is perfect for work and can even handle some light gaming thanks to its built-in Radeon 780M graphics. You can also upgrade the SER8 with up to 64TB of DDR5 RAM and 2TB of storage if you need even more power later on." data-dimension25="$589" href="https://www.amazon.com/Beelink-PCle4-0-Computer-Support-Display/dp/B0DKF15XQJ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1144px;"><p class="vanilla-image-block" style="padding-top:123.34%;"><img id="AeDBLTkGHNNGo5vYQvqWWB" name="Beelink SER8" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/AeDBLTkGHNNGo5vYQvqWWB.jpg" mos="" align="middle" fullscreen="" width="1144" height="1411" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Beelink SER8 comes fully equipped with 32GB of RAM and a 1TB SSD along with plenty of ports. In fact, the SER8 can be used in a triple-monitor setup as around the back; you get an HDMI 2.1 port, DisplayPort 1.4 and a USB4 port along with three USB-A ports and a 2.5 Gigabit Ethernet port, which is perfect for multi-gig internet plans. Powered by a Ryzen 7 8745HS processor, this mini PC is perfect for work and can even handle some light gaming thanks to its built-in Radeon 780M graphics. You can also upgrade the SER8 with up to 64TB of DDR5 RAM and 2TB of storage if you need even more power later on.<a class="view-deal button" href="https://www.amazon.com/Beelink-PCle4-0-Computer-Support-Display/dp/B0DKF15XQJ" target="_blank" rel="nofollow" data-dimension112="a737a8ca-aef2-4d13-99d5-9888fed92e0c" data-action="Deal Block" data-label="The Beelink SER8 comes fully equipped with 32GB of RAM and a 1TB SSD along with plenty of ports. In fact, the SER8 can be used in a triple-monitor setup as around the back; you get an HDMI 2.1 port, DisplayPort 1.4 and a USB4 port along with three USB-A ports and a 2.5 Gigabit Ethernet port, which is perfect for multi-gig internet plans. Powered by a Ryzen 7 8745HS processor, this mini PC is perfect for work and can even handle some light gaming thanks to its built-in Radeon 780M graphics. You can also upgrade the SER8 with up to 64TB of DDR5 RAM and 2TB of storage if you need even more power later on." data-dimension48="The Beelink SER8 comes fully equipped with 32GB of RAM and a 1TB SSD along with plenty of ports. In fact, the SER8 can be used in a triple-monitor setup as around the back; you get an HDMI 2.1 port, DisplayPort 1.4 and a USB4 port along with three USB-A ports and a 2.5 Gigabit Ethernet port, which is perfect for multi-gig internet plans. Powered by a Ryzen 7 8745HS processor, this mini PC is perfect for work and can even handle some light gaming thanks to its built-in Radeon 780M graphics. You can also upgrade the SER8 with up to 64TB of DDR5 RAM and 2TB of storage if you need even more power later on." data-dimension25="$589">View Deal</a></p></div><div class="product"><a data-dimension112="6a1300f2-de7c-47f5-a898-9553581ed792" data-action="Deal Block" data-label="Geekom A6 review" data-dimension48="Geekom A6 review" data-dimension25="$679" href="https://www.amazon.com/GEEKOM-A8-Computers-5600MHz-Windows/dp/B0D22FYFL4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:60.73%;"><img id="9Dcj8rdHg5JFJ2jJpNkUE7" name="71C-iB0N+TL._AC_SL1500_" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9Dcj8rdHg5JFJ2jJpNkUE7.jpg" mos="" align="middle" fullscreen="" width="1500" height="911" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Geekom A8 could be the perfect mini PC for you. It has a full aluminum design, a great selection of front and rear ports, and Geekom’s IceBlast 1.5 tech, which keeps it cool in use. The A8 can even power a quad-monitor setup around the back; there are two HDMI 2.0 ports, a USB-C port capable of video out and a USB 4 port. While I haven’t reviewed the A8 yet, I did review its smaller sibling, the A6. In my <a href="https://www.tomsguide.com/computing/desktop-computers/geekom-a6-review" data-dimension112="6a1300f2-de7c-47f5-a898-9553581ed792" data-action="Deal Block" data-label="Geekom A6 review" data-dimension48="Geekom A6 review" data-dimension25="$679">Geekom A6 review</a>, I couldn’t believe that it was smaller than both the Mac mini M4 and even the very tiny <a href="https://www.tomsguide.com/computing/desktop-computers/asus-NUC-14-pro-review">Asus NUC 14 Pro</a>. The A8 gives you even more power than the A6 as it packs a Ryzen 9 8945HS processor into the same small case.<a class="view-deal button" href="https://www.amazon.com/GEEKOM-A8-Computers-5600MHz-Windows/dp/B0D22FYFL4" target="_blank" rel="nofollow" data-dimension112="6a1300f2-de7c-47f5-a898-9553581ed792" data-action="Deal Block" data-label="Geekom A6 review" data-dimension48="Geekom A6 review" data-dimension25="$679">View Deal</a></p></div><div class="product"><a data-dimension112="17ff7a56-9a20-4fb2-b109-d6e0cbd31072" data-action="Deal Block" data-label="The GMKtec EVO-T1 is powerful enough in its own right, but on the front, in addition to your usual front ports, it has an Oculink port. This can be used to connect this mini PC to an external graphics card dock to transform it into a full-fledged gaming PC. Even if you don’t go that route, the EVO-T1 features a powerful Intel Core Ultra 9 285H processor with built-in Intel Arc 140T integrated graphics. You also get 64GB of RAM, a 1TB SSD and a case that lets you use this mini PC vertically if you don’t want to have it lying flat on your desk. Dual 2.5 Gigabit Ethernet ports also make it a great choice for those with a NAS, and with 50 TOPs, it’s also great for local AI workloads." data-dimension48="The GMKtec EVO-T1 is powerful enough in its own right, but on the front, in addition to your usual front ports, it has an Oculink port. This can be used to connect this mini PC to an external graphics card dock to transform it into a full-fledged gaming PC. Even if you don’t go that route, the EVO-T1 features a powerful Intel Core Ultra 9 285H processor with built-in Intel Arc 140T integrated graphics. You also get 64GB of RAM, a 1TB SSD and a case that lets you use this mini PC vertically if you don’t want to have it lying flat on your desk. Dual 2.5 Gigabit Ethernet ports also make it a great choice for those with a NAS, and with 50 TOPs, it’s also great for local AI workloads." data-dimension25="$999" href="https://www.amazon.com/GMKtec_ultra_285h_ai_mini_pc_evo_t1/dp/B0FH4NZ6DX" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1183px;"><p class="vanilla-image-block" style="padding-top:72.27%;"><img id="oejSmeortLKjZLu3Uj5zCT" name="GMKtec EVO-T1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oejSmeortLKjZLu3Uj5zCT.jpg" mos="" align="middle" fullscreen="" width="1183" height="855" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The GMKtec EVO-T1 is powerful enough in its own right, but on the front, in addition to your usual front ports, it has an Oculink port. This can be used to connect this mini PC to an external graphics card dock to transform it into a full-fledged gaming PC. Even if you don’t go that route, the EVO-T1 features a powerful Intel Core Ultra 9 285H processor with built-in Intel Arc 140T integrated graphics. You also get 64GB of RAM, a 1TB SSD and a case that lets you use this mini PC vertically if you don’t want to have it lying flat on your desk. Dual 2.5 Gigabit Ethernet ports also make it a great choice for those with a NAS, and with 50 TOPs, it’s also great for local AI workloads.<a class="view-deal button" href="https://www.amazon.com/GMKtec_ultra_285h_ai_mini_pc_evo_t1/dp/B0FH4NZ6DX" target="_blank" rel="nofollow" data-dimension112="17ff7a56-9a20-4fb2-b109-d6e0cbd31072" data-action="Deal Block" data-label="The GMKtec EVO-T1 is powerful enough in its own right, but on the front, in addition to your usual front ports, it has an Oculink port. This can be used to connect this mini PC to an external graphics card dock to transform it into a full-fledged gaming PC. Even if you don’t go that route, the EVO-T1 features a powerful Intel Core Ultra 9 285H processor with built-in Intel Arc 140T integrated graphics. You also get 64GB of RAM, a 1TB SSD and a case that lets you use this mini PC vertically if you don’t want to have it lying flat on your desk. Dual 2.5 Gigabit Ethernet ports also make it a great choice for those with a NAS, and with 50 TOPs, it’s also great for local AI workloads." data-dimension48="The GMKtec EVO-T1 is powerful enough in its own right, but on the front, in addition to your usual front ports, it has an Oculink port. This can be used to connect this mini PC to an external graphics card dock to transform it into a full-fledged gaming PC. Even if you don’t go that route, the EVO-T1 features a powerful Intel Core Ultra 9 285H processor with built-in Intel Arc 140T integrated graphics. You also get 64GB of RAM, a 1TB SSD and a case that lets you use this mini PC vertically if you don’t want to have it lying flat on your desk. Dual 2.5 Gigabit Ethernet ports also make it a great choice for those with a NAS, and with 50 TOPs, it’s also great for local AI workloads." data-dimension25="$999">View Deal</a></p></div><h3 class="article-body__section" id="section-shop-today-s-best-early-black-friday-deals"><span>Shop today's best early Black Friday deals</span></h3><ul><li><strong>Amazon: </strong><a href="https://www.amazon.com/b?node=210998206011" target="_blank" rel="nofollow"><strong>50% off Ring, Ninja, Under Armour and more</strong></a><strong></strong></li><li><strong>Amazon Basics: </strong><a href="https://www.amazon.com/stores/page/947C6949-CF8E-4BD3-914A-B411DD3E4433" target="_blank" rel="nofollow"><strong>fitness/home/kitchen essentials from $3</strong></a><strong></strong></li><li><strong>REI: </strong><a href="https://www.rei.com/f/scd-deals" target="_blank" rel="nofollow"><strong>half-off Arc'teryx, Patagonia and more</strong></a><strong></strong></li><li><strong>Walmart: </strong><a href="https://www.walmart.com/cp/gifts/3131907" target="_blank" rel="nofollow"><strong>holiday gifts from $15</strong></a><strong></strong></li><li><strong>Dell: </strong><a href="https://www.dell.com/en-us/shop/deals?sortBy=price-ascending" target="_blank" rel="nofollow"><strong>monitors from $69, laptops from $299</strong></a><strong></strong></li><li><strong>Nectar: </strong><a href="https://www.nectarsleep.com/" target="_blank" rel="nofollow"><strong>50% off mattresses + 66% off bundles</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/site/all-electronics-on-sale/all-computers-tablets-on-sale/pcmcat1632941704767.c?id=pcmcat1632941704767" target="_blank" rel="nofollow"><strong>laptops from $149</strong></a><strong></strong></li><li><strong>Lenovo: </strong><a href="https://www.lenovo.com/us/en/d/deals/laptops/?IPromoID=LEN380027&sortBy=priceUp" target="_blank" rel="nofollow"><strong>doorbuster laptop deals from $319</strong></a><strong></strong></li><li><strong>Wayfair: </strong><a href="https://www.wayfair.com/daily-sales" target="_blank" rel="nofollow"><strong>up to 80% off home decor</strong></a></li><li><strong>Nike: </strong><a href="https://www.nike.com/w/sale-3yaep?sortBy=priceAsc" target="_blank" rel="nofollow"><strong>apparel/sneakers from $7</strong></a><strong></strong></li><li><strong>Lululemon: </strong><a href="https://shop.lululemon.com/c/we-made-too-much/n18mhd?Ns=price%7C0" target="_blank" rel="nofollow"><strong>top picks from $9</strong></a><strong></strong></li><li><strong>Newegg: </strong><a href="https://www.newegg.com/Black-November-Early-Access/EventSaleStore/ID-1132" target="_blank" rel="nofollow"><strong>Doorbuster deals from $6</strong></a></li><li><strong>Birkenstock: </strong><a href="https://www.nordstrom.com/browse/sale?sort=PercentOff&filterByBrand=birkenstock" target="_blank" rel="nofollow"><strong>deals from $20 @ Nordstrom</strong></a><strong></strong></li><li><strong>Saatva: </strong><a href="https://www.saatva.com/mattresses/saatva-classic?utm_source=futurepublishing&utm_medium=affiliate&coupon=awyqqgzvxqicebab" target="_blank" rel="nofollow"><strong>luxury mattresses from $1,099</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Up to 47% off Acemagic Mini PCs but only with our exclusive code ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/up-to-47-percent-off-acemagic-mini-pcs-but-only-with-our-exclusive-code</link>
                                                                            <description>
                            <![CDATA[ Up to 47% off Acemagic Mini PCs but only with our exclusive code ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">yqvBSue8Fx7VNMStg4QngD</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ThzTgCDLKk2WVAagRpb8Xg-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 13 Nov 2025 11:32:05 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                                    <dc:creator><![CDATA[ Paul Hatton ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/ADSYBP7kca2inyDAqi6yK5.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/ThzTgCDLKk2WVAagRpb8Xg-1280-80.jpg">
                                                            <media:credit><![CDATA[Acemagic]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Acemagic]]></media:description>                                                            <media:text><![CDATA[Acemagic]]></media:text>
                                <media:title type="plain"><![CDATA[Acemagic]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ThzTgCDLKk2WVAagRpb8Xg-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you're looking for one of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a> on the market right now at an incredibly affordable price, then you've got to check out these Acemagic deals.</p><p>The first is for the <a href="https://www.amazon.com/dp/B0FG7YD2D8?th=1">M1 Mini PC, which is now available for only $423.47 (was $799.99)</a>. That's a record low price, but you'll have to use our exclusive code: RJVJ6JLU.</p><p>The second is for the <a href="https://www.amazon.com/dp/B0FQJL21TD?th=1">Mini Gaming PC, which is now available for only $598 (was $856)</a>. This is another lowest-ever price and a fantastic option for gamers. Make sure you use our exclusive code: STD2TSNL to get the discount.</p><p>These are limited-time deals that won't be around for long, so if you're looking to invest in your next PC and want something super compact, these deals are worthy of your consideration.</p><h2 id="today-s-best-acemagic-mini-pc-deals-5">Today's best Acemagic Mini PC deals</h2><div class="product"><a data-dimension112="1ad3be59-4e1b-4326-8e35-0325eb83e15f" data-action="Deal Block" data-label="Boasting a super-fast Intel Core i9-11900H processor with 32GB of RAM, the M1 Mini PC guarantees desktop-class performance despite being housed in a highly compact form factor. Additionally, the inclusion of a 1TB SSD will enable users to store all their files, photos, and videos locally. Get all this and more for an unbelievable 46% off.Use our exclusive code: RJVJ6JLU" data-dimension48="Boasting a super-fast Intel Core i9-11900H processor with 32GB of RAM, the M1 Mini PC guarantees desktop-class performance despite being housed in a highly compact form factor. Additionally, the inclusion of a 1TB SSD will enable users to store all their files, photos, and videos locally. Get all this and more for an unbelievable 46% off.Use our exclusive code: RJVJ6JLU" data-dimension25="$423.47" href="https://www.amazon.com/dp/B0FG7YD2D8?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:679px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="q27ziRkMpjuusvYapZxyV6" name="ACEMAGIC M1 Mini PC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/q27ziRkMpjuusvYapZxyV6.jpg" mos="" align="middle" fullscreen="" width="679" height="679" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Boasting a super-fast Intel Core i9-11900H processor with 32GB of RAM, the M1 Mini PC guarantees desktop-class performance despite being housed in a highly compact form factor. Additionally, the inclusion of a 1TB SSD will enable users to store all their files, photos, and videos locally. Get all this and more for an unbelievable 46% off.</p><p><strong>Use our exclusive code: RJVJ6JLU</strong><a class="view-deal button" href="https://www.amazon.com/dp/B0FG7YD2D8?th=1" target="_blank" rel="nofollow" data-dimension112="1ad3be59-4e1b-4326-8e35-0325eb83e15f" data-action="Deal Block" data-label="Boasting a super-fast Intel Core i9-11900H processor with 32GB of RAM, the M1 Mini PC guarantees desktop-class performance despite being housed in a highly compact form factor. Additionally, the inclusion of a 1TB SSD will enable users to store all their files, photos, and videos locally. Get all this and more for an unbelievable 46% off.Use our exclusive code: RJVJ6JLU" data-dimension48="Boasting a super-fast Intel Core i9-11900H processor with 32GB of RAM, the M1 Mini PC guarantees desktop-class performance despite being housed in a highly compact form factor. Additionally, the inclusion of a 1TB SSD will enable users to store all their files, photos, and videos locally. Get all this and more for an unbelievable 46% off.Use our exclusive code: RJVJ6JLU" data-dimension25="$423.47">View Deal</a></p></div><div class="product"><a data-dimension112="6ddf22cc-e490-4342-9beb-9e4e255caae2" data-action="Deal Block" data-label="A mini PC with an Intel i9 13900HK processor and 32GB of RAM. It also boasts a generous 1TB SSD for storing all your files locally. With it being a mini PC, you're getting a whole lot of power in a super compact size.Use our exclusive code: STD2TSNL" data-dimension48="A mini PC with an Intel i9 13900HK processor and 32GB of RAM. It also boasts a generous 1TB SSD for storing all your files locally. With it being a mini PC, you're getting a whole lot of power in a super compact size.Use our exclusive code: STD2TSNL" data-dimension25="$598" href="https://www.amazon.com/dp/B0FQJL21TD?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="7u8wZfUNU7vHNBqE9G4XUo" name="ACEMAGIC Mini Gaming PC" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7u8wZfUNU7vHNBqE9G4XUo.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>A mini PC with an Intel i9 13900HK processor and 32GB of RAM. It also boasts a generous 1TB SSD for storing all your files locally. With it being a mini PC, you're getting a whole lot of power in a super compact size.</p><p><strong>Use our exclusive code: STD2TSNL</strong><a class="view-deal button" href="https://www.amazon.com/dp/B0FQJL21TD?th=1" target="_blank" rel="nofollow" data-dimension112="6ddf22cc-e490-4342-9beb-9e4e255caae2" data-action="Deal Block" data-label="A mini PC with an Intel i9 13900HK processor and 32GB of RAM. It also boasts a generous 1TB SSD for storing all your files locally. With it being a mini PC, you're getting a whole lot of power in a super compact size.Use our exclusive code: STD2TSNL" data-dimension48="A mini PC with an Intel i9 13900HK processor and 32GB of RAM. It also boasts a generous 1TB SSD for storing all your files locally. With it being a mini PC, you're getting a whole lot of power in a super compact size.Use our exclusive code: STD2TSNL" data-dimension25="$598">View Deal</a></p></div><p>If you're new to the concept of mini PCs, then in essence, they are designed to be as small as possible while still packing a whole load of power. That makes them perfect for a wide range of tasks, including office work, web browsing, and carrying out school work.</p><p>Aside from their performance, one of their biggest selling points is their size. Thanks to their small form factor, they're ideal for anyone working in compact spaces who lacks the room for a large desktop tower. They're also oftentimes more affordable than an equivalent laptop, which is definitely the case with these two deals.</p><p>If you'd like to explore other ways to save, then we recommend checking out the <a href="https://www.amazon.com/stores/ACEMAGIC/page/5BF995C2-098C-4C87-9DE4-70D955E4C902?lp_asin=B0FG7YD2D8&ref_=ast_bln&store_ref=bl_ast_dp_brandLogo_sto">ACEMAGIC Amazon store</a>.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Lenovo Yoga AIO 27 review: Windows fans, this is your iMac M4 killer ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/desktop-computers/lenovo-yoga-aio-27-review</link>
                                                                            <description>
                            <![CDATA[ The Lenovo Yoga AIO 27 is an all-in-one Windows 11 PC equipped with a built-in phone charging station, an adjustable desktop, a color-accurate display and more, making it a serious rival for the M4 iMac. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">iA6fZLj2t5hTPq57Q5bbQL</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/fSUP8M4wwiya6CppCkJfpE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 05 Nov 2025 06:31:00 +0000</pubDate>                                                                                                                                <updated>Mon, 17 Nov 2025 19:49:25 +0000</updated>
                                                                                                                                            <category><![CDATA[Desktop Computers]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                                                                                    <dc:creator><![CDATA[ Kimberly Gedeon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/svb2teELV3j9DAAypAtYkK.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/fSUP8M4wwiya6CppCkJfpE-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Lenovo Yoga AIO 27 review unit on a desk]]></media:description>                                                            <media:text><![CDATA[Lenovo Yoga AIO 27 review unit on a desk]]></media:text>
                                <media:title type="plain"><![CDATA[Lenovo Yoga AIO 27 review unit on a desk]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/fSUP8M4wwiya6CppCkJfpE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If I had this slick Lenovo Yoga AIO (starts at <a href="https://www.lenovo.com/us/en/p/desktops/ideacentre/yoga-a-series/yoga-aio-27i-gen-10-27-inch-intel/len102y0005#models"><u>$1,229</u></a>) in college, I wouldn’t just be popular – I’d be <em>legendary.</em></p><p>“Just set your phone there,” I’d say, pointing at the base of the 27-inch monitor. The built-in wireless charging pad would instantly juice it up. My roommate would whisper, “You might actually be the coolest person I know.” Yes, you read that right. The Yoga’s pedestal <em>doubles </em>as a phone charger.</p><p>Unfortunately Lenovo launched this polished all-in-one PC 15 years too late for me to be a dorm-room celebrity. My window has closed, but yours hasn’t. Whether you’re college bound or upgrading your home office, this desktop is one of the <a href="https://www.tomsguide.com/us/best-all-in-one-pc,review-2159.html">best all-in-one PCs</a> I’ve tested.</p><p>And as much as it pains me to say it, especially as <a href="https://www.tomsguide.com/computing/laptops/ive-been-using-windows-for-30-years-but-just-switched-to-macbook-5-reasons-im-never-going-back"><u>a recent Windows-to-Mac convert</u></a>, the Lenovo Yoga AIO outperforms one of the most popular all-in-ones on the market: <a href="https://www.tomsguide.com/computing/apple-desktops/apple-imac-m4-review"><u>Apple’s M4 iMac</u></a>. But we’ll get to that.</p><p>That said, the Yoga is far from flawless. A few quirks could make you think twice. The real question is, are they easy to forgive or instant dealbreakers? Let’s find out.</p><h2 class="article-body__section" id="section-lenovo-yoga-aio-27-review-cheat-sheet"><span>Lenovo Yoga AIO 27 review: Cheat sheet</span></h2><ul><li><strong>What is it?</strong> The Lenovo Yoga AIO 27 is a space-saving all-in-one PC with a 27-inch rotating display, built-in JBL speakers, a wireless charging base and an adjustable stand.</li><li><strong>Who is it for?</strong> Students, remote workers, and creative workers who want a solid productivity-minded daily driver with minimal desk clutter.</li><li><strong>What does it cost?</strong> The reviewed desktop (Intel Core Ultra 7 255H, Intel Arc 140T, 16GB RAM, 1TB SSD) sells for <a href="https://www.bestbuy.com/site/lenovo-yoga-aio-27-all-in-one-intel-core-ultra-7-processor-255h-16gb-memory-1tb-ssd-luna-grey/6618849.p?"><u>$1,319 at Best Buy</u></a>, but you can find a <a href="https://www.lenovo.com/us/en/p/desktops/ideacentre/yoga-a-series/yoga-aio-27i-gen-10-27-inch-intel/len102y0005#models"><u>cheaper configuration via Lenovo.</u></a></li><li><strong>What’s good about it? </strong>It’s a true all-in-one PC that comes with everything you need out of the box, plus the base doubles as a wireless phone charger. Additionally, it comes with a JBL speaker setup and easily accessible ports.</li><li><strong>What’s not so good? </strong>The display’s lowest adjustable height is too high, the webcam is unimpressive, the sound is middling, and an annoying pop-up greets you every time the desktop wakes.</li></ul><h2 class="article-body__section" id="section-lenovo-yoga-aio-27-review-specs"><span>Lenovo Yoga AIO 27 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Lenovo Yoga AIO 27</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Starting price</strong></p></td><td  ><p>$1,299</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Intel Core Ultra 5 125H - Intel Core Ultra 7 255H</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Intel Arc Graphics - Intel Arc 140T GPU</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>27-inch QHD (2560 x 1440) IPS</p></td></tr><tr><td class="firstcol " ><p><strong>Memory</strong></p></td><td  ><p>16GB LPDDR5X RAM</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>512GB - 1TB SSD</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p>1x USB-C, 1x USB-A, 1x headphone jack; Rear: 1x HDM1-in, 1x USB-C, 1x Ethernet (RJ-45), 2x USB-A, 1x HDMI-out </p></td></tr><tr><td class="firstcol " ><p><strong>Webcam</strong></p></td><td  ><p>5MP + IR</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>24.15 x 9.25 x 22.26 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>18.5 lbs</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-lenovo-yoga-aio-27-review-the-ups"><span>Lenovo Yoga AIO 27 review: The ups</span></h2><p>The Lenovo Yoga AIO’s built-in charging pad is undeniably cool, and I’ll get into the details later, but this desktop brings a lot more to the table.</p><h2 id="rotating-display">Rotating 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="yUhx7w2tPfbRXi5PCirUoE" name="Lenovo Yoga AIO 27 review" alt="Lenovo Yoga AIO 27 review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/yUhx7w2tPfbRXi5PCirUoE.jpg" mos="" align="middle" fullscreen="1" width="2000" height="1125" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/yUhx7w2tPfbRXi5PCirUoE.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">You can rotate the display up to 90 degrees (so it's in portrait mode instead of landscape) with a gentle push. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If a display can’t turn 90 degrees like the Lenovo Yoga’s glorious 27-inch QHD panel, it’s dead to me.</p><p>A quick spin into portrait mode transformed this slick 1440p display into a vertical powerhouse for reading, editing, and browsing. I scrolled through my inbox, spreadsheets, and notes without constantly needing to flick the mouse wheel.</p><p>It’s a head-turner, too. How often do you stumble upon a display in portrait mode? Plus, it’s solid and sturdy. Once you find your perfect angle, the rotating 27-inch panel stays locked without budging. </p><p>Part of me wishes the Lenovo Yoga AIO featured a touch screen. But honestly, I’ve made peace with its non-touch design; it spares me from living in a smudge-covered nightmare.</p><h2 id="impressive-display-color-accuracy">Impressive display color 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="soqkbj8HaRPQEhuSm9s5oE" name="Lenovo Yoga AIO 27 review" alt="Lenovo Yoga AIO 27 review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/soqkbj8HaRPQEhuSm9s5oE.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Whether I was firing up a reality TV show on Peacock or watching a review on Tom’s Guide’s YouTube channel, the Yoga’s 27-inch, 1440p display delivered true-to-life colors and immersive visuals that kept me glued to the screen. </p><p>But this isn’t just my personal opinion – the benchmarks back me up.</p><div ><table><caption>Display testing results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Lenovo Yoga AIO 27</strong></p></td><td  ><p><strong>iMac M4</strong></p></td><td  ><p><strong>HP Omnistudio X 32</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Average brightness (nits)</strong></p></td><td  ><p>352.6</p></td><td  ><p>450</p></td><td  ><p>581</p></td></tr><tr><td class="firstcol " ><p><strong>Peak brightness (nits)</strong></p></td><td  ><p>386 (center)</p></td><td  ><p>513 (center)</p></td><td  ><p>656 (center)</p></td></tr><tr><td class="firstcol " ><p><strong>sRGB color gamut</strong></p></td><td  ><p>116.5%</p></td><td  ><p>111.8%</p></td><td  ><p>145.9%</p></td></tr><tr><td class="firstcol " ><p><strong>DCI-P3 color gamut</strong></p></td><td  ><p>82.6%</p></td><td  ><p>79.2%</p></td><td  ><p>103.3%</p></td></tr><tr><td class="firstcol " ><p><strong>Delta-E</strong></p></td><td  ><p>0.21</p></td><td  ><p>0.22</p></td><td  ><p>0.32</p></td></tr></tbody></table></div><p>For context, we measure color accuracy using Delta-E scores: the closer to zero, the better. We recently tested two all-in-one PCs that rival the Lenovo Yoga AIO: the <a href="https://www.tomsguide.com/computing/apple-desktops/apple-imac-m4-review"><u>Apple’s M4 iMac</u></a> and the <a href="https://www.tomsguide.com/computing/desktop-computers/hp-omnistudio-x-32-review-this-ai-focused-all-in-one-pc-is-a-workhorse#section-hp-omnistudio-x-32-review-imac-m4-vs-hp-omnistudio-x-32"><u>HP OmniStudio X 32</u></a>. The Yoga’s score of 0.21 beats both the OmniStudio X 32 (0.33) and the iMac (0.22). </p><p>Combine that accuracy with wide color coverage, and you’ve got a display that’s both lifelike and rich in tone. Lenovo claims that the display covers 99% of the sRGB color gamut, which means that the panel should reproduce nearly all standard digital colors, ensuring that web content, images, and designs appear accurate and true to the creator’s intent. In our testing, we discovered that the panel actually achieves 117 % sRGB, so the result is richer colors, making everything pop with extra visual impact.</p><p>For comparison, the OmniStudio X 32 covers 145% while the iMac covers 112%.</p><p>Looking at DCI-P3 color coverage, the Yoga covers an impressive 83%, beating the iMac’s 79.2%. However, the OmniStudio X 32 reigns supreme with flawless 100% coverage.</p><h2 id="addicting-keyboard">Addicting keyboard</h2><p>Having reviewed countless laptops, I can confidently say that Lenovo — right up there with HP — consistently delivers some of the clickiest, most satisfying keyboards around. This Yoga desktop is no different.</p><p>The included dark gray wireless keyboard recharges via USB-A to USB-C, though I keep mine connected full-time to the rear USB-A port. It’s got a dedicated number pad, shield-style keys, and a clean, modern design. Plus, I feel as if my fingers are flying across the keyboard as I type on it. Each press feels crisp and deliberate, with excellent tactile feedback. It’s great for long work sessions without the mushiness you get from lower-quality desktop keyboards.</p><h2 id="decent-for-light-gaming">Decent for light 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VbjW9Fiefr48n7KNrc6rqE" name="Lenovo Yoga AIO 27 review" alt="Lenovo Yoga AIO 27 review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/VbjW9Fiefr48n7KNrc6rqE.jpg" mos="" align="middle" fullscreen="1" width="2000" height="1125" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/VbjW9Fiefr48n7KNrc6rqE.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: Future)</span></figcaption></figure><p>Don’t laugh, but I’m a woman in my 30s who enjoys playing Roblox, from fast-paced first-person shooter games to laid-back, slow-paced exploration games. Most Roblox experiences require low system demand, so I tested the Yoga AIO with a mix of both ends of the spectrum. It handled everything effortlessly: no lag, no stutters, just smooth gameplay. </p><p>One moment, I was soaring through the air, hurling snowballs at other players. The next, I was wandering wide-eyed through the gilded halls of a virtual castle dripping with gold. The Yoga AIO kept up without breaking a sweat, proving it’s more than capable of casual gaming sessions like these.</p><p>For what it’s worth, we ran the <em>Sid Meier’s Civilization VI: Gathering Storm </em>(1080p) benchmark on the Yoga; it averaged 56 frames per second. On the same test, the M4 iMac hit 50 frames per second.</p><p>However, push it beyond casual, non-intensive titles and the cracks will begin to show. </p><h2 id="base-doubles-as-a-phone-charger">Base doubles as a phone charger</h2><p>This might be my favorite feature on the Lenovo Yoga AIO. Whether it was my iPhone 16 Pro Max or the Samsung Galaxy S25 Ultra (I’m a phone reviewer, so I keep a small fleet of devices), both charged effortlessly on the built-in Qi wireless charging pad at the desktop’s base. </p><p>As long as your phone supports the Qi standard, it should work here. You just need to align the back of your device with the charging icon on the pad. When it’s in the sweet spot, you’ll get the familiar “I’m charging!” ding or see the telltale animation light up your screen.</p><h2 id="solid-variety-of-ports">Solid variety 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aiitJ7eYxTm7TS7thFpJmE" name="Lenovo Yoga AIO 27 review" alt="Lenovo Yoga AIO 27 review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/aiitJ7eYxTm7TS7thFpJmE.jpg" mos="" align="middle" fullscreen="1" width="2000" height="1125" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/aiitJ7eYxTm7TS7thFpJmE.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: Future)</span></figcaption></figure><p>The Lenovo Yoga AIO offers a well-rounded selection of ports that should satisfy most users. On the side, you’ll find a USB-C, a USB-A, and a 3.5mm headphone jack for quick, easy access. Around the back, there’s another USB-C, two more USB-A ports, Ethernet, and both HDMI-in 2.1 and HDMI-out 2.1, plus the power connector. </p><p>The HDMI-in is a nice addition, allowing you to use the Yoga’s 27-inch display as a monitor for another device. An extra USB-C port would be ideal, or maybe an SD card reader, but this mix delivers plenty of flexibility for peripherals, external displays, and wired networking.</p><h2 class="article-body__section" id="section-lenovo-yoga-aio-27-review-the-downs"><span>Lenovo Yoga AIO 27 review: The downs</span></h2><p>While the Yoga AIO has a lot of features I applaud, there are some I should warn you about.</p><h2 id="dim-compared-to-rivals">Dim compared to rivals</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MDMZ3JgkxwqiugLHSZeznE" name="Lenovo Yoga AIO 27 review" alt="Lenovo Yoga AIO 27 review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/MDMZ3JgkxwqiugLHSZeznE.jpg" mos="" align="middle" fullscreen="1" width="2000" height="1125" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/MDMZ3JgkxwqiugLHSZeznE.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: Future)</span></figcaption></figure><p>My home office is situated next to a bright window, and the Lenovo Yoga AIO’s display stood up to the challenge. Even with sunlight streaming in, colors remained vibrant, text stayed sharp, and I didn’t find myself squinting or tilting the screen to cut down on glare.</p><p>However, compared to rivals, the Yoga AIO is dim. On SDR mode, the desktop averages 353 nits, but can climb to 464 nits on HDR mode. The OmniStudio X 32 and iMac, on the other hand, provide more luminance. On SDR mode, they average 580 nits and 450 nits, respectively. On HDR mode, the HP outputs a whopping 720 nits; the Apple desktop notched 512 nits.</p><p>Against the blazing brightness of the HP and iMac, the Yoga AIO sits firmly in the shadows.</p><h2 id="mouse-misses-the-mark">Mouse misses the mark</h2><p>The mouse that ships with the Lenovo Yoga AIO has a lot of great features. It has a polished, slick, dark gray appearance that looks like it would fit in any high-end boardroom with C-suite executives.</p><p>It’s highly responsive, too. Cursor movements track with pinpoint precision, clicks register instantly, and there’s no noticeable input lag. The scroll wheel has just the right amount of resistance, making it easy to move quickly without overshooting. It feels tuned for both speed and accuracy.</p><p>However, I don’t like that this is a battery-powered mouse that relies on a USB dongle plugged into the Yoga’s base. Yes, Lenovo claims the battery lasts up to 12 months. But in 2025, it feels dated compared to rechargeable options like Apple’s Magic Mouse, which eliminates disposable batteries altogether.You know what? Not even Apple’s Magic Mouse gets a pass here – even rechargeable mice can be a hassle. Call me old school, but maybe it’s time we bring wired peripherals back. A cable-free desk is cool, but never having to think about batteries nor recharging is a luxury we should have never given up.</p><h2 id="height-adjustment-stops-too-short">Height adjustment stops too short</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="EPXnkPAr9RLceSe4cxJcfE" name="Lenovo Yoga AIO 27 review" alt="Lenovo Yoga AIO 27 review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/EPXnkPAr9RLceSe4cxJcfE.jpg" mos="" align="middle" fullscreen="1" width="2000" height="1125" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/EPXnkPAr9RLceSe4cxJcfE.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: Future)</span></figcaption></figure><p>I let my dad try out the new Lenovo Yoga AIO, and within seconds, I saw a flicker of disapproval cross his face.</p><p>“Wait a minute,” he said. “The display’s too high — can you lower it?” I tried, but it had already reached its lowest setting and wouldn’t go any further.</p><p>In other words, I couldn’t get the screen level with his eyes — and it’s not like he’s particularly short. At 5’8”, he’s average height. Looks like we’ll need office chairs with a little extra lift to meet it halfway.</p><h2 id="webcam-is-lame">Webcam is lame</h2><p>Built-in webcams are notoriously awful across the PC industry, but the 5MP shooter on the Yoga is tragic. It’s grainy, delivers poor color accuracy, and struggles in anything less than perfect lighting. Shadows crush detail and highlights blow out easily. Even under bright daylight, the image looks soft and slightly washed out, making it decent for quick calls, but far from flattering for professional video meetings or content creation.</p><p>On the plus side, there’s a physical webcam switch on the right side of the base, letting you shut it off instantly and keep any Peeping Toms at bay.</p><h2 id="base-mode-input-signal-not-detected">“Base Mode Input Signal Not Detected”</h2><p>Each time I power on or wake the system, a “Base Mode Input Signal Not Detected” banner flickers on screen for a split second before the PC proceeds without issue.</p><p>My hunch is the AIO briefly scans for all possible inputs at wake (e.g., internal PC, HDMI-in, USB-C). While it’s looking, the screen reports “no signal,” but then a moment later, it finds the right source and everything’s normal.</p><p>It appears to be benign and functionally harmless, but it’s definitely annoying. The M4 iMac would never do this to me.</p><h2 id="ok-speakers">OK speakers</h2><p>The built-in JBL speakers (two 3W tweeters and two 5W woofers) deliver clean, fairly full sound for a desk setup. Voices are clear, podcasts and Google Meet calls cut through – and there’s enough punch for music and YouTube at moderate volumes. </p><p>You won’t get the warm, honeyed tone or wide stereo spread of the M4 iMac’s six-speaker array. The bass is lighter and the soundstage is flatter, but for an all-in-one, it’s convenient. Everything is integrated, so you don’t need to bother trying to secure one of the <a href="https://www.tomsguide.com/us/best-computer-speakers,review-6355.html"><u>best computer speakers</u></a>. Plus, your desk stays tidy.</p><h3 class="article-body__section" id="section-lenovo-yoga-aio-27-review-imac-m4-vs-lenovo-yoga-aio-27"><span>Lenovo Yoga AIO 27 review : iMac M4 vs. Lenovo Yoga AIO 27</span></h3><p>I’ve been comparing the Yoga AIO with other recently reviewed all-in-one PCs, including HP’s OmniStudio X 32. But what <em>really</em> caught my attention is how decisively the Yoga outperformed one of the most popular AIOs on the market: Apple’s iMac. Let’s dive into the performance benchmarks, starting with CPU tests.</p><h2 id="cpu-performance-tests">CPU performance tests</h2><p>The iMac with the M4 chip (10 cores) is Apple’s fastest all-in-one PC. However, in some cases, it struggled to keep up with the Intel Core Ultra 7 255H, a CPU with a 16-core setup.</p><div ><table><caption>CPU performance tests</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Lenovo Yoga AIO 27</strong></p></td><td  ><p><strong>HP Omnistudio X 32 </strong></p></td><td  ><p><strong>iMac M4</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 (single-core)</strong></p></td><td  ><p>2,889</p></td><td  ><p>2,133</p></td><td  ><p>3,646</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 (multi-core)</strong></p></td><td  ><p>15,550</p></td><td  ><p>12,128</p></td><td  ><p>14,724</p></td></tr></tbody></table></div><p>On one hand, after running Geekbench 6 on the iMac, it edged out the Yoga desktop with a single-core score of 3,546, beating the Lenovo AIO’s score of 2,889. This means the iMac is snappier and more responsive in handling lightly threaded tasks, including opening apps, navigating the OS, loading web pages, and more. However, that’s where the victory ends for the Apple device.</p><p>The multi-core scores for the iMac and the Yoga were 14,724 and 15,500, respectively, with Lenovo taking the win. This translates to the Yoga being more efficient at handling heavier, multi-threaded tasks (e.g., running multiple apps while taking a call and streaming music in the background).</p><p>If you’re wondering how the OmniStudio X 32 fared, it mustered a measly single-core score of 2,133 on Geekbench 6. The HP desktop still struggled to catch up with the iMac and Yoga with a puny multi-core score of 12,128.</p><h2 id="speed-tests">Speed tests</h2><p>We also tested the Yoga AIO and the iMac to see which one edits videos faster using the Handbrake benchmark (it tracks how long a device takes to transcode a 4K video to 1080p).</p><p>The Yoga AIO was faster, taking only three minutes and 58 seconds to complete the task. Unfortunately, it took the iMac five minutes and three seconds to do the same, giving the Lenovo machine a clear edge in video transcoding.</p><div ><table><caption>SSD tests</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Lenovo Yoga AIO 27</strong></p></td><td  ><p><strong>HP Omnistudio X 32 </strong></p></td><td  ><p><strong>iMac M4</strong></p></td></tr><tr><td class="firstcol " ><p><strong>BlackMagic Disk Speed (read)</strong></p></td><td  ><p>3.989.4</p></td><td  ><p>2,759.9</p></td><td  ><p>2,895.2</p></td></tr><tr><td class="firstcol " ><p><strong>BlackMagic Disk Speed (write)</strong></p></td><td  ><p>3,288.5</p></td><td  ><p>2,455.8</p></td><td  ><p>3,045.6</p></td></tr></tbody></table></div><p>The OmniStudio X 32 managed to beat the iMac, but not the Yoga, with a transcoding time of four minutes and 50 seconds.</p><p>Now, let’s move on to SSD performance. In the BlackMagic disk speed test, the Yoga AIO posted a write speed of 3,289 MBps, edging out the iMac’s 3,045 MBps. Read speeds told a similar story: the Yoga hit 3,989 MBps, comfortably ahead of the iMac’s 2,895 MBps.</p><p>As for HP’s OmniStudio X 32, it lagged behind both, managing just 2,456 MBps for writes and 2,759 MBps for reads. This is a noticeable drop in speed compared to the Lenovo and Apple machines.</p><h3 class="article-body__section" id="section-lenovo-yoga-aio-27-review-verdict"><span>Lenovo Yoga AIO 27 review: Verdict</span></h3><p>Admittedly, as someone who only recently crossed over to macOS after being a Windows fangirl for far too long, I’m not ready to switch back. I’m too attached to Final Cut Pro, Apple’s Continuity magic, and the instant ease of AirDropping files between my iPhone and Mac.</p><p>However, the data doesn’t lie. In most of our performance and speed tests, the Yoga AIO edged out the iMac. And while Apple’s desktop is many things, it’s not doubling as a Qi phone charging station. The Yoga’s built-in wireless charger is a convenience I didn’t know I needed until now. </p><p>If you’re brand-agnostic, the choice might come down to features and workflow. Both sit in the same ballpark on price: the Yoga AIO starts at $1,229 (the model tested here is <a href="https://www.bestbuy.com/site/lenovo-yoga-aio-27-all-in-one-intel-core-ultra-7-processor-255h-16gb-memory-1tb-ssd-luna-grey/6618849.p"><u>$1,319.99 at Best Buy</u></a>), while the M4 iMac we compared it against is $1,299. So ask yourself: do you value a built-in phone charger and stronger multi-core performance, or is the seamless interoperability of macOS (e.g., AirDrop, Continuity, and all) the key to your productivity?As for me, I’m sticking with Mac. But if you choose Windows, I won’t judge you. You’ll be getting a seriously capable all-in-one.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Dell's new gaming PC is a wolf in corporate sheep's clothing — here's why ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/gaming-desktops/dell-tower-plus-2025-review</link>
                                                                            <description>
                            <![CDATA[ The Dell Tower Plus is the new branding for Dell's XPS desktops, and with an Nvidia GeForce RTX 5070 onboard our Dell Tower Plus review unit is great for gaming (even if it doesn't look it). ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">sz9VfTxsdjTwC9ozQJRH3T</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/gEEivf955XNsykPKzNiMQS-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 01 Nov 2025 06:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Gaming Desktops]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ alex.wawro@futurenet.com (Alex Wawro) ]]></author>                    <dc:creator><![CDATA[ Alex Wawro ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/Y4wW9n7CZrNzgofqVkGA5J.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Alex Wawro is a lifelong tech and games enthusiast with more than a decade of experience covering the movers and shakers in both industries for media outlets like Game Developer, Black Hat and PC World magazine. A lifelong PC builder, he currently serves as a senior editor at Tom&#039;s Guide covering all things computing, from laptops and desktops to printers, keyboards and mice. If you plug it into a PC, he&#039;s probably the person to talk to.&amp;nbsp;&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/gEEivf955XNsykPKzNiMQS-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Dell Tower Plus (2025) review unit on a desk]]></media:description>                                                            <media:text><![CDATA[Dell Tower Plus (2025) review unit on a desk]]></media:text>
                                <media:title type="plain"><![CDATA[Dell Tower Plus (2025) review unit on a desk]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/gEEivf955XNsykPKzNiMQS-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The 2025 Dell Tower Plus ($749 to start) is a remarkably customizable desktop PC packed into an unassuming tower case that looks ripped from a '90s PC magazine ad.</p><p>Personally, I love the look of the Tower Plus PCs because I review gaming PCs for a living, and I'm getting tired of big, heavy cases bedecked in RGB lights and jagged edges. Our Dell Tower Plus review unit is a breath of forgettable fresh air by comparison, packing enough power to run most games well into a mid-sized white box that blends right into your desk setup.</p><p>Admittedly, the included accessories aren't amazing and you can't achieve the heights of power with the Dell Tower Plus that you can with the priciest and <a href="https://www.tomsguide.com/us/best-gaming-pc,review-2219.html">best gaming PCs</a>. But you can get pretty great performance from the Plus if you're willing to spend enough, and any serious PC game fan will probably want to buy their own keyboard and mouse anyway.</p><h2 class="article-body__section" id="section-dell-tower-plus-review-cheat-sheet"><span>Dell Tower Plus review: Cheat sheet</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AmUtfNcHM7JsecPVs7iPcS" name="Dell Tower Plus 2025 review" alt="Dell Tower Plus (2025) review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/AmUtfNcHM7JsecPVs7iPcS.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><ul><li><strong>What is it?</strong> The Dell Tower Plus is a highly customizable desktop PC that can be anything from an inexpensive workhorse to a mid-tier gaming PC depending on how you configure it.</li><li><strong>What does it cost?</strong> The Tower Plus starts at $999 on Delll's <a href="https://www.dell.com/en-us/shop/cty/pdp/spd/dell-ebt2250-desktop" target="_blank" rel="nofollow">website</a> and can be upgraded to the point it costs around $3,000, but Dell runs regular sales so you can often find it for a few hundred bucks cheaper.</li><li><strong>Who is it for? </strong>Anyone who wants a fairly quiet, highly customizable PC in an unassuming case for a reasonable amount of money.</li><li><strong>What do we like?</strong> The boring case design may turn some people off, but I like how subtly the Dell Tower Plus blends into a desk. I also like the price-to-performance ratio of our review unit, and I appreciate how quietly it runs even after gaming for hours.</li><li><strong>What don’t we like? </strong>As much as I like the Dell Tower Plus, my big hands feel a little cramped when I'm working inside the mid-size case and not everyone will love the boxy, bland design.</li></ul><h2 class="article-body__section" id="section-dell-tower-plus-review-specs"><span>Dell Tower Plus review: Specs</span></h2><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Dell Tower Plus (starting)</p></th><th  ><p>Dell Tower Plus (as reviewed)</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$999</p></td><td  ><p>$1,999</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>Intel Core Ultra 5 255H</p></td><td  ><p>Intel Core Ultra 7 265K</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Intel UHD integrated</p></td><td  ><p>Nvidia GeForce RTX 5070</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>16GB</p></td><td  ><p>32GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>512GB SSD</p></td><td  ><p>1TB SSD</p></td></tr><tr><td class="firstcol " ><p><strong>Ports (front)</strong></p></td><td  ><p>USB-A, 1x USB-C, stereo in/out, headset jack</p></td><td  ><p>USB-A, 1x USB-C, stereo in/out, headset jack</p></td></tr><tr><td class="firstcol " ><p><strong>Ports (rear)</strong></p></td><td  ><p>6x USB-A, 1x Thunderbolt 4/USB-C, RJ-45 Ethernet, optical, HDMI 2.0, 3x. PCI-E slots</p></td><td  ><p>6x USB-A, 1x Thunderbolt 4/USB-C, RJ-45 Ethernet, optical, HDMI 2.0, 3x. PCI-E slots</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>16.8 x 14.6 x 6.8 in</p></td><td  ><p>16.8 x 14.6 x 6.8 in</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>~28 pounds</p></td><td  ><p>~28 pounds</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-dell-tower-plus-review-the-ups"><span>Dell Tower Plus review: The ups</span></h2><p>The Dell Tower Plus may not look like much, but it's got it where it counts. After working and gaming on our review unit for a few weeks, there are a few strengths I think you need to know about.</p><h2 id="great-for-gaming-as-long-as-you-avoid-4k">Great for gaming (as long as you avoid 4K)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="W9yTT2LVxuqwaYfFgC9nYS" name="Dell Tower Plus 2025 review" alt="Dell Tower Plus (2025) review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/W9yTT2LVxuqwaYfFgC9nYS.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Now, that heading is a little misleading because I spent most of my time with the Dell Tower Plus review unit gaming in 4K on my <a href="https://www.tomsguide.com/reviews/lg-c1-oled-tv">LG C1 OLED TV</a> and had a blast. </p><p>But I was playing games like Assassin's Creed Valhalla and Dying Light 2, which are a few years old at this point. And if you love playing games like that, the Dell Tower Plus review unit (and its GeForce RTX 5070 GPU) is great since it easily achieves framerates of 60+ FPS with all graphical settings cranked to the max.</p><p>When I went to play really demanding games like Cyberpunk 2077: Phantom Liberty, the results weren't as great. I could still play the game just fine, but I had to dial the settings down a smidge and enable Nvidia's <a href="https://www.tomsguide.com/gaming/pc-gaming/dlss">DLSS</a> upscaling tech to achieve the same 60+ FPS. </p><div ><table><caption>Game benchmarks (frames per second @ 1080p/4K, Ultra settings)</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Dell Tower Plus</strong></p></td><td  ><p><strong>Alienware Aurora</strong></p></td><td  ><p><strong>HP Omen 35L</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Assassin's Creed Shadows </strong></p></td><td  ><p>54/32</p></td><td  ><p>55/32</p></td><td  ><p>55/33</p></td></tr><tr><td class="firstcol " ><p><strong>Black Myth: Wukong</strong></p></td><td  ><p>50/25</p></td><td  ><p>57/25</p></td><td  ><p>56/25</p></td></tr><tr><td class="firstcol " ><p><strong>Cyberpunk 2077</strong></p></td><td  ><p>68.4/19.4</p></td><td  ><p>67.7/16.5</p></td><td  ><p>73.2/20.3</p></td></tr></tbody></table></div><p>Our lab testing backs this up, because while our Dell Tower Plus review unit had no trouble blowing through most games at 60+ FPS in 1080p, it was a different story when we cranked things up to 4K. While you can get decent frame rates gaming at 4K if you're willing to dial down the graphical settings a bit and rely on upscaling, you're going to struggle in demanding titles like Black Myth: Wukong and Cyberpunk 2077.</p><p>As you can see from the results table, our Dell Tower Plus review unit couldn't quite keep up with the Alienware Aurora (Intel Core Ultra 265KF, GeForce RTX 5070, 32GB RAM) and the <a href="https://www.tomsguide.com/computing/gaming-desktops/hp-omen-35l-review">HP Omen 35L</a> (AMD Ryzen 7 9800X3D, GeForce RTX 5070, 32GB RAM) gaming PCs we recently tested. But they're both more expensive as well, so the fact that they put up higher scores in these benchmark tests makes sense.</p><p>And unlike the Dell Tower Plus, most of the gaming PCs we review at Tom's Guide would immediately stand out in an office. Not so with the Tower Plus, which looks like an office PC from the '90s yet works as hard as anything you can buy today.</p><p>If you don't believe me, check out our performance testing results below. While it's a similar story in terms of the (slightly more expensive) Alienware and HP outperforming the Dell, the scores are neck-and-neck—with Dell's Tower Plus holding its own in terms of CPU performance, SSD speed and video editing chops.</p><div ><table><caption>Performance testing results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Dell Tower Plus</strong></p></td><td  ><p><strong>Alienware Aurora</strong></p></td><td  ><p><strong>HP Omen 35L</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 single-core</strong></p></td><td  ><p>2985</p></td><td  ><p>3071</p></td><td  ><p>3206</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 multi-core</strong></p></td><td  ><p>19181</p></td><td  ><p>20010</p></td><td  ><p>16386</p></td></tr><tr><td class="firstcol " ><p><strong>SSD speed test (MBps)</strong></p></td><td  ><p>1633.7</p></td><td  ><p>1648.4</p></td><td  ><p>2136.4</p></td></tr><tr><td class="firstcol " ><p><strong>Video editing test (mm:ss)</strong></p></td><td  ><p>2:01</p></td><td  ><p>2:01</p></td><td  ><p>3:15</p></td></tr></tbody></table></div><p>Some of these tests, like the Geekbench 6 benchmark, are synthetic tests that assign the PC a score based on how effectively it can compete a series of tasks. But others, like our video editing test, are real-world tests that evaluate things like how long it takes the PC to transcode a 4K video file down to 1080p.</p><p>As you can see from the results, you can expect decent performance from a Dell Tower Plus PC configured like our review unit. Whether you're gaming, editing photos or cutting video you should be able to count on good to great performance, especially when working at 1080p or 1440p.</p><h2 id="subtle-quiet-performance">Subtle, quiet 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wsw3stJmsiLY4kX5LqxSDT" name="Dell Tower Plus 2025 review" alt="Dell Tower Plus (2025) review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/wsw3stJmsiLY4kX5LqxSDT.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Another thing I really appreciate about our Dell Tower Plus review unit is how quiet it runs, even after hours of gaming.</p><p>I know because I've left it running all sorts of games for days, everything from Cyberpunk 2077 to Dying Light 2 to Baldur's Gate 3 and Doom: The Dark Ages. While performance varies depending on the game, the noise coming out of the PC is always quieter than I expect.</p><p>That's not to say it's silent, of course. I did consistently notice a low hum coming from the PC after an hour or two of gaming, which makes sense since when I put my hand near the rear of the PC after long sessions, it's often quite hot.</p><p>That's something to keep in mind if you plan to be rooting around blindly behind your PC during marathon gaming sessions. It doesn't get hot enough to burn, but after an all-nighter with Dying Light 2, I definitely felt enough heat coming off the back of the PC that I was afraid to touch it.</p><p>But even then, I barely heard more than a low hum coming from the Dell Tower Plus. While it's not silent, I am amazed at how effective this PC is at quietly cooling itself—especially when you consider how boxy the case is.</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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YPetjhnsBmpoJPoFGpJLPS" name="Dell Tower Plus 2025 review" alt="Dell Tower Plus (2025) review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/YPetjhnsBmpoJPoFGpJLPS.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>You get a nice array of ports on the Dell Tower Plus, which I appreciate because this is such a broadly customizable PC that you could need a broad variety of accessories depending on what you use it for.</p><p>On the front you get USB-A and USB-C as well as a headphone jack and SD card slot, while on the back you get more USB-A ports for accessories as well as Thunderbolt 4, HDMI on the motherboard, optical and of course an RJ-45 Ethernet jack for wired Internet speeds while gaming.</p><p>While I wish you got another USB-C port or two, I was repeatedly impressed with how easy it was to connect and disconnect gadgets as I moved our Dell Tower Plus review unit around to different testing setups.</p><h2 class="article-body__section" id="section-dell-tower-plus-review-the-downs"><span>Dell Tower Plus review: The downs</span></h2><p>If you can't tell already, I'm quite fond of the Dell Tower Plus and its low-key office chic design. But there is a downside to this compact, chunky case.</p><h2 id="innards-are-a-little-frustrating-to-access">Innards are a little frustrating to access</h2><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="zu5PLUwhDqVCRT4qB2J2ET" name="Dell Tower Plus 2025 review" alt="Dell Tower Plus (2025) review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/zu5PLUwhDqVCRT4qB2J2ET.jpg" mos="" align="middle" fullscreen="1" width="3840" height="2160" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/zu5PLUwhDqVCRT4qB2J2ET.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: Future)</span></figcaption></figure><p>It's hardly a deal-breaker, but I did want to quickly point out that the compact interior of our Dell Tower Plus review unit made me uncomfortable about the prospect of upgrading or repairing it down the line.</p><p>That's not to say that it's a mess when you crack open the case. In fact, I found the interior of our review unit to be clean and neatly organized when I opened it up to peer inside last week. </p><p>What I also found was that my big paws had a hard time accessing components inside the case. That's probably to be expected when you buy a PC in such a compact mid-tower case, but I wanted to warn you ahead of time just in case you were planning to get your hands dirty and you have big mitts like mine.</p><p>I also wish it was a little easier to actually open the side panel and peek inside. Our Dell Tower Plus review unit has a single screw on the rear that you need to loosen in order to pop the side panel off, which only takes a minute.</p><p>But it does take a minute and typically requires a screwdriver, which is a little frustrating when many gaming PCs these days have simple cases that just require you to press a switch to open them up.</p><h2 class="article-body__section" id="section-dell-tower-plus-review-verdict"><span>Dell Tower Plus 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FpcQ7cQbxyFH8K3mj8YW5T" name="Dell Tower Plus 2025 review" alt="Dell Tower Plus (2025) review unit on a desk" src="https://cdn.mos.cms.futurecdn.net/FpcQ7cQbxyFH8K3mj8YW5T.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I quite like the Dell Tower Plus because it's highly customizable and pretty affordable, packing the latest components into a drab mid-tower case that blends in anywhere.</p><p>For some people that might be a deal-breaker, but for myself and others like me I think there's real appeal in having this much leeway to kit out a desktop PC. I reviewed our Dell Tower Plus like a gaming PC because that's how it's outfitted, but you can use these desktops for more than that—with prices ranging from $749 to $3,000-plus, the Dell Tower Plus can fill a wide range of roles.</p><p>That said, it can't compete with the creme de la creme of gaming machines. At time of publication the Dell Tower Plus tops out at an Nvidia GeForce RTX 5080 GPU, for example, which means it will never be able to outperform the best gaming PCs.</p><p>But the Dell Tower Plus doesn't cost an arm and a leg, either. Speed freaks may look elsewhere, but for the rest of us the Dell Tower Plus can be a real diamond in the rough thanks to its strong value, unassuming looks and versatile design. </p><p>For me it feels like the Millennium Falcon of gaming PCs: it may not look like much, but the Dell Tower Plus has got it where it counts.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Hurry! This excellent mini PC is just $297 ahead of Black Friday ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/mini-pcs/hurry-this-excellent-mini-pc-is-just-usd297-ahead-of-black-friday</link>
                                                                            <description>
                            <![CDATA[ Don't worry if you're not familiar with its name. The Kamrui E3B Mini PC is sleek, compact, and punches well above its price. Plus, it's on sale ahead of Black Friday. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">itrgNEXgx2nsa4Hyynhpd6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/dMVNHQB6NkLtCbkMXqXuPf-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 30 Oct 2025 15:12:08 +0000</pubDate>                                                                                                                                <updated>Thu, 30 Oct 2025 15:13:41 +0000</updated>
                                                                                                                                            <category><![CDATA[Mini PCs]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                <author><![CDATA[ louis.ramirez@futurenet.com (Louis Ramirez) ]]></author>                    <dc:creator><![CDATA[ Louis Ramirez ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oYF2xVwCb4pTGhAJi8Yqr5.jpeg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;As deals editor-in-chief at Tom’s Guide, Louis refuses to pay full price for anything. He has over 10 years of experience finding the best deals and coupons to bring readers. Louis price checks&amp;nbsp;against multiple retailers and searches high and low for sales on 4K TVs, Apple devices, streaming services, mattresses, kitchen appliances, and more.&amp;nbsp;He&#039;s also always looking for the the best coupon codes to turn good deals into stellar buys.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;He has covered major retail events like Amazon Prime Day, Black Friday, and Cyber Monday for more than a decade and knows how to spot an epic deal from a fake discount. He&#039;s also great at helping people negotiate better prices on everything from gym memberships to their home internet service. Louis&#039; work has also helped readers find PS5 restock, baby formula, Clorox wipes, and everything in between. For his next major purchase, Louis is hoping to find a killer deal on an M3-based Mac.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;A born-and-bred New Yorker, Louis is always in search of the perfect cup of coffee. On his free time, he enjoys swimming, running, and any workout that pushes his Apple Watch to the max. He&#039;s also a big fan of international films, horror movies, and K-dramas. His work has appeared on Gizmodo, CNET, Digital Trends, Dealnews, and Time Out New York.&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/dMVNHQB6NkLtCbkMXqXuPf-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Kamrui E3B]]></media:description>                                                            <media:text><![CDATA[Kamrui E3B]]></media:text>
                                <media:title type="plain"><![CDATA[Kamrui E3B]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/dMVNHQB6NkLtCbkMXqXuPf-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>October is coming to a close and the first <a href="https://www.tomsguide.com/black-friday-deals-and-sales">Black Friday deals</a> of the season are officially here. One of my favorite deals this week comes courtesy of Amazon, which is slashing the price of one of the <a href="https://www.tomsguide.com/us/best-mini-pc.html">best mini PCs</a>. </p><p>For a limited time, Prime members can get the <a href="https://www.amazon.com/dp/B0DYNGSY98" target="_blank" rel="nofollow">Kamrui E3B Mini PC for $297</a>. That's one of the best discounts we've seen on this Editor's Choice machine. (To get this deal, log into your account and activate the on-page digital coupon). </p><div class="product"><a data-dimension112="ea0cba24-a02d-4308-bb2f-b60e0610b8e8" data-action="Deal Block" data-label="Kamrui E3B review" data-dimension48="Kamrui E3B review" data-dimension25="$297" href="https://www.amazon.com/dp/B0DYNGSY98" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1158px;"><p class="vanilla-image-block" style="padding-top:121.85%;"><img id="yAuSYdRqCPRjzdjdiFwAkC" name="Kamrio E3B Mini PC deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yAuSYdRqCPRjzdjdiFwAkC.jpg" mos="" align="middle" fullscreen="" width="1158" height="1411" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Kamrio E3B is a compact mini PC that comes with an AMD Ryzen 5 7430U CPU, 32GB of RAM, and a 512GB SSD. It features support for Bluetooth 5.2, Wi-Fi 6, and can drive three displays simultaneously. In our <a href="https://www.tomsguide.com/computing/desktop-computers/kamrui-e3b-review-a-budget-mini-pc-that-punches-above-its-weight" data-dimension112="ea0cba24-a02d-4308-bb2f-b60e0610b8e8" data-action="Deal Block" data-label="Kamrui E3B review" data-dimension48="Kamrui E3B review" data-dimension25="$297">Kamrui E3B review</a>, we said it's a sleek, compact, and quiet mini PC with a good selection of front and rear ports that punches well above similarly priced  models.<a class="view-deal button" href="https://www.amazon.com/dp/B0DYNGSY98" target="_blank" rel="nofollow" data-dimension112="ea0cba24-a02d-4308-bb2f-b60e0610b8e8" data-action="Deal Block" data-label="Kamrui E3B review" data-dimension48="Kamrui E3B review" data-dimension25="$297">View Deal</a></p></div><p>The Kamrui E3B is a great mini PC for anyone on a tight budget who demands a strong PC. The configuration on sale packs an AMD Ryzen 5 7430U CPU, 32GB of RAM, and a 512GB SSD. It also features support for Bluetooth 5.2 and Wi-Fi 6. We especially like that can drive three displays simultaneously.</p><p>In our <a href="https://www.tomsguide.com/computing/desktop-computers/kamrui-e3b-review-a-budget-mini-pc-that-punches-above-its-weight">Kamrui E3B review</a>, we said it's a well-designed budget mini PC built in a compact case. We found it has a good selection of front and rear ports with support for up to three displays. We also like that it runs almost dead silent when in use.</p><p>When it comes to performance, the Kamrui E3B is more than capable of watching videos and doing office work. This little mini PC starts up fast and can handle running multiple apps simultaneously. We even used it for some light photo editing with GIMP.</p><p>Overall, the Kamrui E3B is a Tom's Guide-recommended mini PC at its regular price and an even bigger recommendation at its current sale price. </p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ This prebuilt RTX 5070 PC showed me 4K gaming performance for less — and I'm surprised as you are ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/gaming-desktops/this-prebuilt-rtx-5070-pc-showed-me-4k-gaming-performance-for-less-and-im-surprised-as-you-are</link>
                                                                            <description>
                            <![CDATA[ The Quoted Tech Frontier gaming PC is as simple as it gets when it comes to prebuilt, custom-made desktops, with its subtle design, excellent 1080p to surprising 4K performance with its combination of an AMD Ryzen 7 9700X and RTX 5070 and near-silence when under pressure. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">e2sSLnQKms3azoSxUmewPg</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sdeFFXqQktsoxaBmbpUmLB-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 26 Oct 2025 07:30:00 +0000</pubDate>                                                                                                                                <updated>Thu, 30 Oct 2025 16:44:46 +0000</updated>
                                                                                                                                            <category><![CDATA[Gaming Desktops]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Desktop Computers]]></category>
                                                                                                                    <dc:creator><![CDATA[ Darragh Murphy ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5QiaTSWf9FcVB7STxcdo4M.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Darragh is Tom’s Guide’s Computing Editor and is fascinated by all things bizarre in tech. This usually leads to assorted coverage varying from washing machines designed for earbuds to the wild world of laptops. Whether it&#039;s connecting Scar from The Lion King to two-factor authentication or turning his love for laptops into a fabricated rap battle from 8 Mile, he believes there’s always a quirky spin to be made.&lt;br&gt;&lt;br&gt;Darragh has previously been an Editor for Laptop Mag and a News Editor for Time Out Dubai, where he also headed the gaming and tech section. His work can be seen in Mashable, Android Police, Shortlist Dubai, Proton, theBit.nz, ReviewsFire and more. &lt;br&gt;&lt;br&gt;While laptops are his bread and butter, he’s also reviewed smartphones, monitors, speakers, docking stations and VPNs. He’s covered IFA, MWC Barcelona, the Consumer Electronics Show (&lt;a href=&quot;https://www.tomsguide.com/uk/tag/ces&quot; target=&quot;_blank&quot;&gt;CES&lt;/a&gt;) and more.&lt;br&gt;&lt;br&gt;When he&#039;s not checking out the latest devices and all things computing, he can be found going for dreaded long runs, watching terrible shark movies, and trying to find time to game.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/sdeFFXqQktsoxaBmbpUmLB-1280-80.jpg">
                                                            <media:credit><![CDATA[Future / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Quoted Tech Frontier Gaming Desktop]]></media:description>                                                            <media:text><![CDATA[Quoted Tech Frontier Gaming Desktop]]></media:text>
                                <media:title type="plain"><![CDATA[Quoted Tech Frontier Gaming Desktop]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sdeFFXqQktsoxaBmbpUmLB-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Prebuilt or build your own? That's a question many gaming PC enthusiasts have been umming and ahing about for years, but I've been fully prepared to take the plunge by planning out a list of parts and components needed to feel the glory of building my very own desktop.</p><p>But here I am, playing <a href="https://www.tomsguide.com/gaming/i-played-battlefield-6-for-over-20-hours-and-its-multiplayer-rivals-cod-but-skip-the-solo-mode">Battlefield 6</a> in 4K at over 200 frames per second (FPS) on a prebuilt, custom-made Frontier gaming PC from Quoted Tech. And I'm perfectly happy to leave my "build-your-own" dreams behind (for now). For those after a simple plug-and-play setup, this desktop will do the trick. </p><p>The Canadian-based PC builder has made a name for itself with its various pre-built custom gaming PCs, with its Frontier desktop I received landing right in the mid-range. Well, if that's what you want, as Quoted Tech allows for <em>plenty </em>of customization no matter what tower you choose — all so you can find the right price for your needs. </p><p>While big brands like Alienware, MSI or Acer opt for more unique cases with flair and more specific components, Quoted Tech brings understated, minimalist towers with a range of parts that can be fitted in, and the Frontier makes it easy to take apart and customize with your own internals if needed. </p><p>Not that you'd need to, as being prebuilt, this machine comes with commendable mid-range specs, including an AMD Ryzen 7 9700X CPU, RTX 5070 GPU, Kingston Fury Beast 32GB of DDR5 RAM and a Kingston NV3 1TB SSD. Plus, the MSI Pro X870-P motherboard with <a href="https://www.tomsguide.com/reference/wi-fi-7-explained">Wi-Fi 7</a> support comes with a huge array of ports. </p><p>It's a shame Quoted Tech's PCs aren't more widely available (but they do ship to the U.S.), and there isn't much in the way of software tools to mess around with. </p><p>As a way to tinker with the PC build you want, though, and get a sleek-looking PC that runs whisper-quiet and has that pretty RGB glow that's hard not to enjoy, this Frontier gaming desktop can easily find itself as one of the <a href="https://www.tomsguide.com/us/best-gaming-pc,review-2219.html">best gaming PCs</a> to grab. </p><h3 class="article-body__section" id="section-quoted-tech-frontier-cheat-sheet"><span>Quoted Tech Frontier: Cheat sheet</span></h3><ul><li><strong>What is it?</strong> A pre-built desktop made for gaming with plenty of customization options.</li><li><strong>Who is it for? </strong>PC gaming enthusiasts looking for a reliable, minimalist and ready-made desktop that can be changed to fit their liking.</li><li><strong>What does it cost?</strong> This entirely depends on the configuration you purchase, but the Frontier is available from $1,107 at <a href="https://quoted.tech/desktops/frontier" target="_blank" rel="nofollow">Quoted Tech's website</a>. However, the unit I received will set you back $2,143. While it's made in Canada, it's also available to purchase in the U.S. — but only from its site (for now).</li><li><strong>What do we like?</strong> It's powerful performance across 1080p and 4K resolution, subtle yet stylish case that allows for cool airflow and easy customization options.</li><li><strong>What don’t we like?</strong> It's not quite available everywhere (no luck in the U.K., for instance), certain configurations can really bump up the price and its software tools are barebones. Oh, and only two USB-C ports?</li></ul><h3 class="article-body__section" id="section-quoted-tech-frontier-specs"><span>Quoted Tech Frontier: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Quoted Tech Frontier (starting)</strong></p></td><td  ><p><strong>Quoted Tech Frontier (tested)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,107</p></td><td  ><p>$2,143</p></td></tr><tr><td class="firstcol " ><p><strong>CPU</strong></p></td><td  ><p>AMD Ryzen 5 5600</p></td><td  ><p>AMD Ryzen 7 9700X</p></td></tr><tr><td class="firstcol " ><p><strong>GPU</strong></p></td><td  ><p>Nvidia GeForce RTX 5050</p></td><td  ><p>Nvidia GeForce RTX 5070</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>32GB</p></td><td  ><p>32GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>500GB</p></td><td  ><p>2TB</p></td></tr><tr><td class="firstcol " ><p><strong>Ports</strong></p></td><td  ><p><strong>Top:</strong> 2x USB-A 3.0, 1x audio jack | <strong>Rear: </strong>2x USB-A 3.2 Gen 2, 2x USB-A 3.2 Gen 1, 2x USB-A 2.0</p></td><td  ><p><strong>Top:</strong> 2x USB-A 3.0, 1x audio jack | <strong>Rear:</strong> 1x USB4 Type-C, 1x USB-C 3.2 Gen 2, 2x USB-A 3.2 Gen 2, 2x USB-A 3.2 Gen 1, 4x USB-A 2.0, 3x DisplayPort, 1x HDMI, 1x Ethernet port, 3x audio ports</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Wi-Fi 6, Bluetooth 5.2</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>18.6 x 17.8 x 8.4 inches</p></td><td  ><p>18.6 x 17.8 x 8.4 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>35 pounds</p></td><td  ><p>35 pounds</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-quoted-tech-frontier-the-ups"><span>Quoted Tech Frontier: The ups</span></h3><p>Quoted Tech's Frontier gaming PC is a neat, well-put together that will happily fit in on a majority of desk setups, and with its impressive performance for its mid-range specs, quiet operation and subtle appeal, there's not a lot to complain about. </p><h2 id="performance-that-shines-for-the-price">Performance that shines (for 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6iEe2gCsxqYrSDXVfkdD5D" name="Quoted Tech Frontier Gaming PC" alt="Quoted Tech Frontier Gaming Desktop" src="https://cdn.mos.cms.futurecdn.net/6iEe2gCsxqYrSDXVfkdD5D.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>At the start of the year, I stated that <a href="https://www.tomsguide.com/computing/gaming-laptops/rtx-5070-gaming-laptops-will-be-my-new-gold-standard-heres-why">Nvidia's RTX 5070 would be my new gold standard</a>, and I suppose I got what I wished for. It may not be the strongest GPU around, as our <a href="https://www.tomsguide.com/computing/gpus/nvidia-geforce-rtx-5070-review">RTX 5070 GPU review</a> will tell you, but it certainly does a fine job at playing a huge range of demanding PC titles with great results in this Quoted Tech Frontier PC. </p><p>With its AMD Ryzen 7 9700X CPU, RTX 5070 graphics, 32GB of DDR5 RAM and 2TB SSD, the Frontier desktop is up to the challenge of playing demanding, popular PC titles with impressive performance. And at its <em>just </em>over $2,000 price tag (compared to other customizable gaming PCs like the <a href="https://www.tomsguide.com/computing/gaming-desktops/maingear-mg-1-ultimate-review">Maingear MG-1 Ultimate</a>, which will set you back over $500 more with <a href="https://maingear.com/products/custom-mg-1" target="_blank" rel="nofollow">similar configurations</a>), that's a pretty good deal. </p><div ><table><caption>Game benchmarks (frames per second @ 4K)</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Quoted Tech Frontier</strong></p></td><td  ><p><strong>Maingear MG-1 (RTX 5090)</strong></p></td><td  ><p><strong>Alienware Area 51 (RTX 5090)</strong></p></td><td  ><p><strong>Corsair Vengeance i8300 (RTX 5090)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Assassin's Creed Shadows (Ultra High)</strong></p></td><td  ><p>33</p></td><td  ><p>65</p></td><td  ><p>76</p></td><td  ><p>64</p></td></tr><tr><td class="firstcol " ><p><strong>Black Myth Wukong (Cinematic)</strong></p></td><td  ><p>25</p></td><td  ><p>55</p></td><td  ><p>59</p></td><td  ><p>60</p></td></tr><tr><td class="firstcol " ><p><strong>Red Dead Redemption 2 (Ultra)</strong></p></td><td  ><p>28.7</p></td><td  ><p>67</p></td><td  ><p>84.6</p></td><td  ><p>64.4</p></td></tr></tbody></table></div><p>I know. From the benchmarks above, especially when compared to the RTX 5090-equipped <a href="https://www.tomsguide.com/computing/gaming-desktops/alienware-area-51-review">Alienware Area 51</a> (that's $5,699 by the way) and <a href="https://www.tomsguide.com/computing/gaming-desktops/corsair-vengeance-i8300-review">Corsair Vengeance i8300</a> (at a whopping $7,399), this Frontier's configuration almost seems silly. But this is with 4K resolution at settings cranked up to max, and <em>without</em> <a href="https://www.tomsguide.com/gaming/pc-gaming/dlss">Nvidia's DLSS 4</a> and multi-frame generation tech turned on. </p><p>Change to 1080p settings, which is well below what it can handle, and you'll find frame rates for <a href="https://www.tomsguide.com/gaming/doom-the-dark-ages-review">Doom: The Dark Ages</a> at 97 FPS, <a href="https://www.tomsguide.com/reviews/cyberpunk-2077-phantom-liberty">Cyberpunk 2077</a> at 73.6 FPS, <a href="https://www.tomsguide.com/gaming/black-myth-wukong-review">Black Myth: Wukong</a> at 55 FPS and so on. Of course, the RTX 5070 is perfect for 1440p gameplay, and I saw the Frontier handle this in its stride, too. </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="fMP7Xc52YNURzo7NJudZ6D" name="Quoted Tech Frontier Gaming PC" alt="Quoted Tech Frontier Gaming Desktop" src="https://cdn.mos.cms.futurecdn.net/fMP7Xc52YNURzo7NJudZ6D.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>But in real-world testing, I was comfortably gaming on a 4K display in all of its visual splendour. I saw this when <a href="https://www.tomsguide.com/gaming/pc-gaming/i-just-tested-battlefield-6-on-an-rtx-5070-gaming-pc-heres-how-it-runs">I tested Battlefield </a>6, and I was extremely impressed. </p><p>Even without DLSS 4 upscaling or Nvidia's AI tech, Battlefield 6 was running <em>super </em>smoothly with a high level of detail, as most settings were set to Ultra, with a few on High (as the game automatically set it). At 4K resolution, I was seeing frame rates hit just over 60 FPS. Not bad for an RTX 5070 graphics card, even though it only offers up 12GB of GDDR7 video memory (VRAM).</p><p>But with DLSS upscaling set to Quality, and frame generation at x4, I was seeing frame rates skyrocket to an average of 216 FPS and some beautiful landscapes amid the destruction happening around me.</p><div ><table><caption>Performance testing results</caption><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Quoted Tech Frontier</strong></p></td><td  ><p><strong>Maingear MG-1</strong></p></td><td  ><p><strong>Alienware Area 51</strong></p></td><td  ><p><strong>Corsair Vengeance i8300</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 single-core</strong></p></td><td  ><p>3355</p></td><td  ><p>3401</p></td><td  ><p>3148</p></td><td  ><p>3303</p></td></tr><tr><td class="firstcol " ><p><strong>Geekbench 6 multi-core</strong></p></td><td  ><p>16234</p></td><td  ><p>23071</p></td><td  ><p>21786</p></td><td  ><p>23328</p></td></tr><tr><td class="firstcol " ><p><strong>SSD speed test (MBps)</strong></p></td><td  ><p>1916.7</p></td><td  ><p>2107.9</p></td><td  ><p>1898.2</p></td><td  ><p>2480.5</p></td></tr><tr><td class="firstcol " ><p><strong>Video editing test (mm:ss)</strong></p></td><td  ><p>3:25</p></td><td  ><p>1:45</p></td><td  ><p>1:53</p></td><td  ><p>1:47</p></td></tr></tbody></table></div><p>Aside from gaming, though, Quoted Tech's Frontier PC does a fine job at handling multitasking and daily computing tasks thanks to its AMD Ryzen 7 9700X CPU. It may fall behind in multi-core performance in Geekbench 6 compared to the <em>pricey </em>top hitters, but its single-core and SSD results are pretty much similar. Plus, at three minutes for transcoding a 4K video to 1080p, that's actually the same time as an <a href="https://www.tomsguide.com/computing/macbooks/macbook-pro-m5-review">M5 MacBook Pro</a> (yes, desktops and laptops are different, but Apple's MacBooks ain't no slouches). </p><p>As a PC for those looking for high-end gaming without needing to break the bank, and to handle work and productivity, Quoted Tech's Frontier PC will provide. </p><h2 id="as-custom-as-it-gets">As custom as it gets</h2><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="X5x4irApitLNTXBJZiLWsC" name="Quoted Tech Frontier Gaming PC" alt="Quoted Tech Frontier Gaming Desktop" src="https://cdn.mos.cms.futurecdn.net/X5x4irApitLNTXBJZiLWsC.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>If you're just getting into gaming PCs but just don't know where to start on building one (and, of course, just want to get to playing games), Quoted Tech makes a great case to grab a prebuilt desktop instead — but with plenty to tinker with anyway. </p><p>Not only does it provide multiple configuration options upon checkout so you can find the parts that meet your budget, but its Fractal Design Pop Air Black case makes it easy to take it apart and access the components you need to change.</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="7V226K2kTwMmpbfhJZ6npC" name="Quoted Tech Frontier Gaming PC" alt="Quoted Tech Frontier Gaming Desktop" src="https://cdn.mos.cms.futurecdn.net/7V226K2kTwMmpbfhJZ6npC.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>By simply unscrewing the side glass panel (no screwdriver required), you can get inside the PC and mix and match other internals to your liking. Of course, with the prebuilt PC you get (like the Frontier I received), you'll likely stick with those specs for a long while. But being able to modify and upgrade your rig is what gaming PCs are about, and the case makes all that possible. </p><p>I also appreciate how many of the panels are magnetically attached, making them easy to remove and clean the inevitable dust from. </p><h2 id="quiet-as-a-hum">Quiet as a hum </h2><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="GYh3HoBxcvJXUFwRw2RpCD" name="Quoted Tech Frontier Gaming PC" alt="Quoted Tech Frontier Gaming Desktop" src="https://cdn.mos.cms.futurecdn.net/GYh3HoBxcvJXUFwRw2RpCD.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>After testing many gaming laptops that sound like they're about to reach Mach 5, it's nice to hear a near-silent hum of a well-cooled, well-optimized gaming PC that doesn't scream went put under any kind of pressure. </p><p>Much of that is due to its open, ventilated design and 240MM liquid cooler, with the RGB-lit fans giving the PC space to breathe on the top and rear. Not once did I feel like I was putting my PC under too much pressure (even with 4K gameplay), as it kept the same low fan noise that I would barely even notice. </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="ZT5czYct3n7nixJ9yqGo6D" name="Quoted Tech Frontier Gaming PC" alt="Quoted Tech Frontier Gaming Desktop" src="https://cdn.mos.cms.futurecdn.net/ZT5czYct3n7nixJ9yqGo6D.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>Even though the Frontier configuration I received isn't the strongest around, pushing it to its limits won't turn its fans into a jet engine, and for quiet households, that's a perk to appreciate. </p><p>Otherwise, expect a no-nonsense design to adorn your desk setup, with a particular highlight being the grilled front panel displaying an attractive RGB lighting effect that catches the eye.  </p><h3 class="article-body__section" id="section-quoted-tech-frontier-the-downs"><span>Quoted Tech Frontier: The downs</span></h3><p>The Quoted Tech Frontier offers plenty of major highlights as a prebuilt gaming PC, but it isn't all sunshine and rainbows. For one, its USB-C ports are extremely limited, and another, it would be nice to see these PCs more readily available beyond their Canadian roots and the U.S. </p><h2 id="usb-c-where-are-you">USB-C, where are you?</h2><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="wyMDgG3woTmd9wdvNQupqC" name="Quoted Tech Frontier Gaming PC" alt="Quoted Tech Frontier Gaming Desktop" src="https://cdn.mos.cms.futurecdn.net/wyMDgG3woTmd9wdvNQupqC.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>Out of the extensive ports this Frontier gaming PC offers, including a whopping 10 USB-A ports, three DisplayPort outputs, an HDMI and a connection for its Wi-Fi 7 (shark fin-like) antenna, you'd think it would be able to offer more than just <em>two </em>USB-C ports. </p><p>Regardless of their capabilities (USB4 with 40 GB/s transfer speeds and DP support), having just two USB-C ports leaves a sour taste. Whether it's connecting an <a href="https://www.tomsguide.com/best-picks/best-external-hard-drives">external SSD</a>, a wireless <a href="https://www.tomsguide.com/best-picks/best-gaming-headsets">gaming headset </a>with 2.4GHz connectivity or more, there isn't much to play with. </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="QNZQtSsfMkZXurMaRMnY4D" name="Quoted Tech Frontier Gaming PC" alt="Quoted Tech Frontier Gaming Desktop" src="https://cdn.mos.cms.futurecdn.net/QNZQtSsfMkZXurMaRMnY4D.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>Moreover, these are all placed on the rear, as there's no access to a USB-C port on the top of the case. Annoying? Yes, but not a complete deal breaker. At the very least, there's plenty of USB-A ports to plug <a href="https://www.tomsguide.com/best-picks/best-gaming-mouse">gaming mice</a>, <a href="https://www.tomsguide.com/best-picks/best-gaming-keyboard">keyboards</a> and more into. </p><h2 id="catch-one-if-you-can">Catch one, if you can</h2><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="PM5pomuTJLF3b8dUaqeM2D" name="Quoted Tech Frontier Gaming PC" alt="Quoted Tech Frontier Gaming Desktop" src="https://cdn.mos.cms.futurecdn.net/PM5pomuTJLF3b8dUaqeM2D.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>If you're after a prebuilt gaming PC, you'll likely find it on a third-party retailer site or on a custom PC manufacturer's site. Quoted Tech falls heavily into the latter, as its website is the only place you'll be able to build your gaming desktop of choice. </p><p>That's not such a bad thing, and other brands like MainGear follow the same suit. The problem is, you won't be able to find one at other retailers, and while it's built in Canada, there's only so many regions it's available in right now. </p><p>That includes Canada (of course), but Quoted Tech's PCs are also available to ship to customers in the U.S., which is a major plus. But for anywhere else, it's a no-go. I was lucky enough to be sent one overseas to London, but for general consumers abroad, that isn't an option. </p><h3 class="article-body__section" id="section-quoted-tech-frontier-verdict"><span>Quoted Tech Frontier: Verdict</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QwXjF5q3Vy2kuVD8QZPwAD" name="Quoted Tech Frontier Gaming PC" alt="Quoted Tech Frontier Gaming Desktop" src="https://cdn.mos.cms.futurecdn.net/QwXjF5q3Vy2kuVD8QZPwAD.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future / Tom's Guide)</span></figcaption></figure><p>Building a gaming PC that matches your budget and performance needs can be a beautiful thing. But that also requires time and patience. If you're looking to tinker with a customizable desktop but prefer a plug-and-play setup to simply get to gaming, the Quoted Tech is a fantastic shout. </p><p>I'm a huge fan of the Frontier's customizability, impressive price-to-performance and near-silent performance, even if it isn't the strongest gaming PC out there. But not everyone needs RTX 5090 performance with sky-high frame rates, and for the RTX 5070 configuration I received, it does a mighty fine job. </p><p>Looking to upgrade in the future? Well, the Quoted Tech cases make it easy to pull apart and fit your own components in, which is always a welcome perk if you're interested in playing around with a desktop. </p><p>Sure, it would be nice to see more USB-C ports, but not everyone will have an easy time getting their hands on one. But, instead of a unique build from a big-brand manufacturer that may struggle to use specific components you intend to get down the line due to its case, or spending a fortune on mid-range gaming performance, the Quoted Tech Frontier is a PC that won't disappoint. </p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
            </channel>
</rss>